public void CheckZeroVolForward(AssetMarket assetMkt) { var zcCurve = assetMkt.RiskFreeDiscount; var market = new Market(new[] { zcCurve }, new[] { assetMkt }); var zeroVol = new MapRawDatas <DateOrDuration, double>(new[] { new DateOrDuration(assetMkt.RefDate) }, new[] { 0.0 }); var blackScholesDesc = new BlackScholesModelDescription(assetMkt.Asset.Name, zeroVol, true); var mcConfig = new MonteCarloConfig(1, RandomGenerators.GaussianSobol(SobolDirection.Kuo3)); var blackScholesModel = ModelFactory.Instance.Build(blackScholesDesc, market); var fwdDates = new[] { Duration.Month, 6 * Duration.Month, Duration.Year, 2 * Duration.Year, 5 * Duration.Year } .Map(d => assetMkt.RefDate + d); IProduct fwdLeg = ForwardLeg(fwdDates); PriceResult priceResult = (PriceResult)McPricer.WithDetails(mcConfig).Price(fwdLeg, blackScholesModel, market); double[] fwds = priceResult.Details.Map(kv => kv.Item3.Value); var assetFwdCurve = assetMkt.Forward(); double[] refFwds = fwdDates.Map(d => assetFwdCurve.Fwd(d) * zcCurve.Zc(d)); foreach (var i in Enumerable.Range(0, fwdDates.Length)) { var err = Math.Abs(fwds[i] / refFwds[i] - 1.0); Assert.LessOrEqual(err, 20.0 * DoubleUtils.MachineEpsilon); } }
public ICalibrationDescription Build(object[,] bag) { var assetName = bag.ProcessScalarString("Asset"); var withDivs = !bag.Has("WithDivs") || bag.ProcessScalarBoolean("WithDivs"); var calibDatas = bag.ProcessTimeMatrixDatas("CalibDate"); if (calibDatas.HasCol("Sigma")) { var sigmaValues = calibDatas.GetColFromLabel("Sigma"); var sigma = new MapRawDatas <DateOrDuration, double>(calibDatas.RowLabels, sigmaValues); var bsDescription = new BlackScholesModelDescription(assetName, sigma, withDivs); return(new ExplicitCalibration <BlackScholesModelDescription>(bsDescription)); } var calibStrikes = calibDatas.GetColFromLabel("Strike"); return(new BlackScholesModelCalibDesc(assetName, withDivs, calibDatas.RowLabels, calibStrikes)); }