Пример #1
0
        public static object EquityImpliedVol(object mktObj, string assetName, object maturity, double strike, double price, string optionType)
        {
            return(FunctionRunnerUtils.Run("EquityImpliedVol", () =>
            {
                Market market = MarketManager.Instance.GetMarket(mktObj);
                AssetMarket assetMkt = market.AssetMarketFromName(assetName);
                var pricer = BlackScholesWithDividendOption.Build(assetMkt.Spot,
                                                                  assetMkt.Dividends,
                                                                  assetMkt.RiskFreeDiscount,
                                                                  assetMkt.Time);
                double q;
                switch (optionType.Trim().ToLower())
                {
                case "call":
                    q = 1.0;
                    break;

                case "put":
                    q = -1.0;
                    break;

                default:
                    throw new Exception(string.Format("Unknow option type : {0}", optionType));
                }

                var matAsDate = ObjectConverters.ConvertDate(maturity, assetMkt.RefDate);
                return pricer.ImpliedVol(assetMkt.Time[matAsDate], strike, price, q);
            }));
        }
Пример #2
0
        public static object LocalVolDenominator(object mktObj, object[] dates, double[] strikes, string assetName)
        {
            return(FunctionRunnerUtils.Run("LocalVolSurface", () =>
            {
                Market market = MarketManager.Instance.GetMarket(mktObj);
                AssetMarket assetMarket = market.AssetMarketFromName(assetName);
                VolatilitySurface volSurface = assetMarket.VolSurface();

                var localVariance = volSurface.LocalVariance;
                var moneyness = volSurface.Moneyness;
                var time = volSurface.Time;

                var result = new double[dates.Length, strikes.Length];
                for (int i = 0; i < dates.Length; i++)
                {
                    var date = ObjectConverters.ConvertDate(dates[i], assetMarket.RefDate);
                    double t = time[date];
                    var denomFunc = localVariance.Denominator(t);
                    var denoms = strikes.Map(k =>
                    {
                        var y = moneyness.Moneyness(t, k);
                        return denomFunc.Eval(y);
                    });
                    ArrayUtils.SetRow(ref result, i, denoms);
                }
                return result;
            }));
        }
Пример #3
0
        public override IModelDescription Calibrate(BlackScholesModelCalibDesc bsDesc, Market market)
        {
            AssetMarket assetMkt     = market.AssetMarketFromName(bsDesc.Asset);
            var         volSurface   = assetMkt.VolSurface();
            var         forwardCurve = assetMkt.Forward();
            var         optionPricer = BlackScholesWithDividendOption.Build(assetMkt.Spot, assetMkt.Dividends, assetMkt.RiskFreeDiscount, assetMkt.Time);

            var calibMaturities = bsDesc.CalibrationMaturities.Map(d => d.ToDate(assetMkt.RefDate));
            var calibStrikes    = bsDesc.CalibrationStrikes;
            var calibDates      = assetMkt.Time[calibMaturities];

            double[] targetPrices = new double[calibDates.Length];
            double[] optionTypes  = new double[calibDates.Length];
            for (int i = 0; i < calibMaturities.Length; i++)
            {
                var targetVol  = volSurface.Volatility(calibDates[i], calibStrikes[i]);
                var optionType = (calibStrikes[i] > forwardCurve.Fwd(calibMaturities[i])) ? 1.0 : -1.0;
                targetPrices[i] = optionPricer.Price(calibDates[i], calibStrikes[i], targetVol, optionType);
                optionTypes[i]  = optionType;
            }

            var calibratedVols = optionPricer.CalibrateVol(calibDates, targetPrices, bsDesc.CalibrationStrikes, optionTypes);
            var sigma          = new MapRawDatas <DateOrDuration, double>(bsDesc.CalibrationMaturities, calibratedVols);

            return(new BlackScholesModelDescription(bsDesc.Asset, sigma, bsDesc.WithDivs));
        }
Пример #4
0
        public override IModel Build(BlackScholesModelDescription bs, Market market)
        {
            var time = ModelFactoryUtils.DefaultTime(market.RefDate);

            var assetMkt       = market.AssetMarketFromName(bs.Asset);
            var localDividends = bs.WithDivs
                ? assetMkt.Dividends.Map(div => div.DivModel())
                : new DiscreteLocalDividend[0];

            return(new BlackScholesModel(time, assetMkt.Asset, bs.Sigma.ToStepFunction(time), localDividends));
        }
Пример #5
0
        public override IModel Build(Bergomi2FModelDescription b2F, Market market)
        {
            ITimeMeasure time = ModelFactoryUtils.DefaultTime(market.RefDate);

            var assetMkt       = market.AssetMarketFromName(b2F.Asset);
            var localDividends = b2F.WithDivs
                ? assetMkt.Dividends.Map(div => div.DivModel())
                : new DiscreteLocalDividend[0];

            return(new Bergomi2FModel(assetMkt.Asset, localDividends, time, BuildXi(b2F.Sigma, time),
                                      b2F.K1, b2F.K2, b2F.Theta, b2F.Nu, b2F.RhoXY, b2F.RhoSX, b2F.RhoSY));
        }
Пример #6
0
        public static object LocalVolSurface(object mktObj, object[] dates, double[] strikes, string assetName)
        {
            return(FunctionRunnerUtils.Run("LocalVolSurface", () =>
            {
                Market market = MarketManager.Instance.GetMarket(mktObj);
                AssetMarket assetMarket = market.AssetMarketFromName(assetName);
                VolatilitySurface volSurface = assetMarket.VolSurface();
                var maturities = ObjectConverters.ConvertDateArray(dates, assetMarket.RefDate);

                return ArrayUtils.CartesianProd(maturities, strikes, volSurface.LocalVol);
            }));
        }
        public override IModel Build(LocalVolModelDescription lv, Market market)
        {
            AssetMarket assetMkt = market.AssetMarketFromName(lv.Asset);

            DiscreteLocalDividend[] localDividends = lv.WithDivs
                ? assetMkt.Dividends.Map(div => div.DivModel())
                : new DiscreteLocalDividend[0];

            VolatilitySurface volSurface = VolatilitySurface.BuildInterpol(lv.VolMatrix, assetMkt.Moneyness);

            return(new LocalVolatilityModel(lv.VolMatrix.Time, assetMkt.Asset, volSurface, assetMkt.Moneyness, localDividends));
        }
        public override IModelDescription Calibrate(LocalVolModelCalibDesc lvDesc, Market market)
        {
            AssetMarket assetMkt = market.AssetMarketFromName(lvDesc.Asset);

            return(new LocalVolModelDescription(lvDesc.Asset, lvDesc.WithDivs, assetMkt.VolMatrix));
        }