public void ProbaMeasure(double lambda, RrFunction sigma, Duration probaMaturity, Duration simulationMaturity, int quadratureNbPoints, double precision) { var refDate = DateTime.Parse("07/06/2009"); var hw1 = new Hw1Model(TimeMeasure.Act365(refDate), Currency.Eur, lambda, sigma); var probaMeasure = new PaymentInfo(hw1.Currency, refDate + probaMaturity); var t = refDate + simulationMaturity; var hw1PathGen = new Hw1ModelPathGeneratorFactory().Build(hw1, null, probaMeasure, new[] { t }); var brownianBridge = BrownianBridge.Create(hw1PathGen.AllSimulatedDates); var hw1Zc = new Hw1ModelZcRepresentation(hw1); var numeraireZc = hw1Zc.Zc(t, probaMeasure.Date, 1.0); Assert.AreEqual(hw1PathGen.AllSimulatedDates.Length, 1); double[] x, w; GaussHermite.GetQuadrature(quadratureNbPoints, out x, out w); double flow = 0.0; for (int i = 0; i < x.Length; i++) { var dw = brownianBridge.PathIncrements(new[] { x[i] }, 1); var ornstein = hw1PathGen.Path(dw).GetProcessValue(0); flow += w[i] * 1.0 / numeraireZc.Eval(ornstein); } var error = Math.Abs(flow - 1.0); Assert.LessOrEqual(error, precision); }
public void Test() { var market = Market(); const double lambda = 0.01; var sigma = new StepFunction(new[] { 0.0, 1.0, 2.0 }, new[] { 0.007, 0.004, 0.0065 }, 0.0); var hw1 = new Hw1Model(TimeMeasure.Act365(market.RefDate), Currency.Eur, lambda, sigma); var mcConfig = new MonteCarloConfig(20000, RandomGenerators.GaussianSobol(SobolDirection.JoeKuoD5)); var mcPricer = McPricer.WithDetails(mcConfig); var fixedLeg = FixedLeg(market.RefDate); var mcPriceResult = (PriceResult)mcPricer.Price(fixedLeg, hw1, market); var mcCoupons = mcPriceResult.Details.Map(p => p.Item3.Value); var refCoupons = mcPriceResult.Details.Map(pi => market.DiscountCurve(pi.Item2.Financing).Zc(pi.Item2.Date)); var errAbs = Math.Abs(mcCoupons.Sum() - refCoupons.Sum()); Assert.LessOrEqual(errAbs, 7.0e-5); var errRel = Math.Abs(mcCoupons.Sum() / refCoupons.Sum() - 1.0); Assert.LessOrEqual(errRel, 8.0e-6); }
public void Zc(double lambda, Duration zcStart, Duration zcDuration, int quadratureNbPoints, double precision) { var sigma = new StepFunction(new[] { 0.0, 1.0, 2.0 }, new[] { 0.007, 0.004, 0.0065 }, 0.0); var refDate = DateTime.Parse("07/06/2009"); var hw1 = new Hw1Model(TimeMeasure.Act365(refDate), Currency.Eur, lambda, sigma); var hw1Zc = new Hw1ModelZcRepresentation(hw1); var zcDate = refDate + zcStart; var zc = hw1Zc.Zc(zcDate, zcDate + zcDuration, 1.0); var drift = hw1.DriftTerm(); var stdDev = Math.Sqrt(drift.Eval(hw1.Time[zcDate])); double[] x, w; GaussHermite.GetQuadrature(quadratureNbPoints, out x, out w); double zcQuad = x.Select((t, i) => w[i] * zc.Eval(new[] { stdDev *t })).Sum(); var error = Math.Abs(zcQuad - 1.0); Assert.LessOrEqual(error, precision); }