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