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; })); }
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)); }
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); })); }