예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }