示例#1
0
            public BeatSequence Build(RealInterval span)
            {
                beats.Sort(TimedEvent <Beat> .Comparer);
                var finalSpan = span ?? new RealInterval(beats.First().Time, beats.Last().Time);

                return(new BeatSequence(beats.ToArray(), finalSpan));
            }
示例#2
0
 public RegularGridAffineInterpol(RealInterval support, int size, double[] f)
 {
     Contract.Requires(f.Length == size);
     this.f = f;
     inf    = support.Inf;
     step   = support.Length / (f.Length - 1);
     df     = EnumerableUtils.For(0, f.Length - 1, i => f[i + 1] - f[i]);
 }
示例#3
0
        private static RealInterval GridSupport(double gridQuantile, VolatilitySurface volSurface, double t)
        {
            var impliedVar            = volSurface.VarianceInterpoler.TimeSlice(t) / t;
            Func <double, double> vol = k => Math.Sqrt(impliedVar.Eval(Math.Log(k)));
            var mInf = Math.Log(SmileLawUtils.ComputeQuantile(1.0, t, vol, gridQuantile));
            var mSup = Math.Log(SmileLawUtils.ComputeQuantile(1.0, t, vol, 1.0 - gridQuantile));

            return(RealInterval.Compact(mInf, mSup));
        }
示例#4
0
        private static RegularGridAffineInterpol LocalVolDiscretization(Func <double, double> localVol, VolatilitySurface volSurface, double t)
        {
            const double gridQuantile = 1.0e-6;
            const int    gridSize     = 250;
            RealInterval gridSupport  = GridSupport(gridQuantile, volSurface, t);

            double[] localVolGridValues = GridUtils.RegularGrid(gridSupport, gridSize).Map(localVol);
            var      gridLocalVol       = new RegularGridAffineInterpol(gridSupport, gridSize, localVolGridValues);

            return(gridLocalVol);
        }
示例#5
0
        public void RealIntervalCoverage()
        {
            var a = new RealInterval(7, 42);
            var b = new RealInterval(40, 50);
            var c = new RealInterval(200, 100); // negative
            var e = RealInterval.Empty;

            var empty  = RealInterval.Coverage(new RealInterval[] { });
            var single = RealInterval.Coverage(new RealInterval[] { a });
            var ab     = RealInterval.Coverage(new RealInterval[] { a, b });
            var ba     = RealInterval.Coverage(new RealInterval[] { b, a });
            var ac     = RealInterval.Coverage(new RealInterval[] { a, c });
            var ca     = RealInterval.Coverage(new RealInterval[] { c, a });
            var ae     = RealInterval.Coverage(new RealInterval[] { a, e });
            var ea     = RealInterval.Coverage(new RealInterval[] { e, a });
            var bc     = RealInterval.Coverage(new RealInterval[] { b, c });
            var cb     = RealInterval.Coverage(new RealInterval[] { c, b });
            var be     = RealInterval.Coverage(new RealInterval[] { b, e });
            var eb     = RealInterval.Coverage(new RealInterval[] { e, b });
            var ce     = RealInterval.Coverage(new RealInterval[] { c, e });
            var ec     = RealInterval.Coverage(new RealInterval[] { e, c });

            Assert.IsTrue(c.IsNegative);
            Assert.AreEqual(0, empty.Right);
            Assert.AreEqual(0, empty.Left);
            Assert.AreEqual(a.Left, single.Left);
            Assert.AreEqual(a.Right, single.Right);
            Assert.AreEqual(ab.Left, a.Left);
            Assert.AreEqual(ab.Right, b.Right);
            Assert.AreEqual(ba.Left, a.Left);
            Assert.AreEqual(ba.Right, b.Right);
            Assert.AreEqual(ac.Left, a.Left);
            Assert.AreEqual(ac.Right, c.Left); // c is negative
            Assert.AreEqual(ae.Left, a.Left);
            Assert.AreEqual(ae.Right, a.Right);
            Assert.AreEqual(ea.Left, a.Left);
            Assert.AreEqual(ea.Right, a.Right);
            Assert.AreEqual(ca.Left, a.Left);
            Assert.AreEqual(ca.Right, c.Left); // c is negative
            Assert.AreEqual(bc.Left, b.Left);
            Assert.AreEqual(bc.Right, c.Left); // c is negative
            Assert.AreEqual(cb.Left, b.Left);
            Assert.AreEqual(cb.Right, c.Left); // c is negative
            Assert.AreEqual(be.Left, b.Left);
            Assert.AreEqual(be.Right, b.Right);
            Assert.AreEqual(eb.Left, b.Left);
            Assert.AreEqual(eb.Right, b.Right);
            Assert.AreEqual(ce.Left, c.Right);                                      // c is negative
            Assert.AreEqual(ec.Right, c.Left);                                      // c is negative
            Assert.IsTrue(RealInterval.Coverage(new RealInterval[] { }).IsEmpty);   // empty sequence -> empty interval
            Assert.IsTrue(RealInterval.Coverage(new RealInterval[] { e }).IsEmpty); // sequence of only empty intervals -> empty interval
        }
        public BsEqtySimulatorStepDatas(RealInterval step, double[] dates, DiscreteLocalDividend[] dividends, double[] discounts,
                                        double[] vols, double[] varDrifts)
        {
            Contract.Requires(dividends.Length == vols.Length);
            Contract.Requires(dates.All(step.Contain));
            Contract.Requires(EnumerableUtils.IsSorted(dividends.Map(div => div.Date)));

            Step      = step;
            Dates     = dates;
            Dividends = dividends;
            Discounts = discounts;
            Vols      = vols;
            VarDrifts = varDrifts;
        }
示例#7
0
        private LocalVolSimulatorStepDatas StepSimulDatas(DateTime start, DateTime end, LocalVolatilityModel model, DiscountCurve assetDiscount, DateTime horizon)
        {
            DateTime[] dates;
            bool[]     isDivDate;
            DiscreteLocalDividend[] dividends;
            StepSchedule(start, end, model, out dates, out isDivDate, out dividends);

            var horizonDiscount = assetDiscount.Zc(horizon);
            var discounts       = dividends.Map(div => horizonDiscount / assetDiscount.Zc(div.Date));

            var localVols = EnumerableUtils.For(0, dates.Length,
                                                i => StepLocalVol(i > 0 ? dates[i - 1] : start, dates[i], model));

            var step = RealInterval.Compact(model.Time[start], model.Time[end]);

            return(new LocalVolSimulatorStepDatas(step, dates.Map(d => model.Time[d]), isDivDate, dividends, discounts, localVols));
        }
示例#8
0
        public void LeftBoundedIntInterval()
        {
            var interval = RealInterval.LeftBounded(7.0);

            Assert.IsTrue(interval.LeftEndpoint.Bounded);
            Assert.IsTrue(interval.LeftEndpoint.Inclusive);
            Assert.AreEqual(7.0, interval.Left);
            Assert.IsFalse(interval.RightEndpoint.Bounded);
            Assert.IsFalse(interval.RightEndpoint.Inclusive);
            Assert.AreEqual(double.MaxValue, interval.Right);
            Assert.AreEqual(double.MaxValue, interval.Span);
            Assert.IsFalse(interval.IsClosed);
            Assert.IsFalse(interval.IsDegenerate);
            Assert.IsFalse(interval.IsFinite);
            Assert.IsTrue(interval.IsHalfBounded);
            Assert.IsFalse(interval.IsOpen);
        }
示例#9
0
        public void BoundedRealInterval()
        {
            var interval = new RealInterval(7.0, true, 42.0, false);

            Assert.IsTrue(interval.LeftEndpoint.Bounded);
            Assert.IsTrue(interval.LeftEndpoint.Inclusive);
            Assert.AreEqual(7.0, interval.Left);
            Assert.IsTrue(interval.RightEndpoint.Bounded);
            Assert.IsFalse(interval.RightEndpoint.Inclusive);
            Assert.AreEqual(42.0, interval.Right);
            Assert.AreEqual(42.0 - 7.0, interval.Span);
            Assert.IsFalse(interval.IsClosed);
            Assert.IsFalse(interval.IsDegenerate);
            Assert.IsTrue(interval.IsFinite);
            Assert.IsFalse(interval.IsHalfBounded);
            Assert.IsFalse(interval.IsOpen);
        }
示例#10
0
        public LocalVolSimulatorStepDatas(RealInterval step, double[] dates,
                                          bool[] isDivDates, DiscreteLocalDividend[] dividends,
                                          double[] discounts, Func <double, double>[] localVols)
        {
            Contract.Requires(dates.Length == isDivDates.Length);
            Contract.Requires(isDivDates.Length == dividends.Length);
            Contract.Requires(dividends.Length == discounts.Length);
            Contract.Requires(discounts.Length == localVols.Length);
            Contract.Requires(dates.All(step.Contain));
            Contract.Requires(EnumerableUtils.IsSorted(dividends.Map(div => div.Date)));

            Step       = step;
            Dates      = dates;
            IsDivDates = isDivDates;
            Dividends  = dividends;
            Discounts  = discounts;
            LocalVols  = localVols;
        }
示例#11
0
        public void IsValueInLimitsTest()
        {
            // [1; +inf[
            RealInterval interval = new RealInterval()
            {
                LowerLimit = 1, UpperLimit = Double.PositiveInfinity, IntervalType = IntervalTypes.HalfInclusive
            };

            Assert.IsTrue(interval.IsValueInLimits(1));
            Assert.IsTrue(interval.IsValueInLimits(Double.MaxValue));
            Assert.IsFalse(interval.IsValueInLimits(0));
            Assert.IsFalse(interval.IsValueInLimits(0.5));
            Assert.IsFalse(interval.IsValueInLimits(Double.NegativeInfinity));
            Assert.IsFalse(interval.IsValueInLimits(Double.PositiveInfinity));

            // ]1; +inf[
            interval = new RealInterval()
            {
                LowerLimit = 1, UpperLimit = Double.PositiveInfinity, IntervalType = IntervalTypes.Exclusive
            };
            Assert.IsTrue(interval.IsValueInLimits(Double.MaxValue));
            Assert.IsFalse(interval.IsValueInLimits(0));
            Assert.IsFalse(interval.IsValueInLimits(0.5));
            Assert.IsFalse(interval.IsValueInLimits(1));
            Assert.IsFalse(interval.IsValueInLimits(Double.PositiveInfinity));
            Assert.IsFalse(interval.IsValueInLimits(Double.NegativeInfinity));

            // ]0;1]
            interval = new RealInterval()
            {
                LowerLimit = 0, UpperLimit = 1, IntervalType = IntervalTypes.HalfExclusive
            };

            Assert.IsTrue(interval.IsValueInLimits(1));
            Assert.IsFalse(interval.IsValueInLimits(Double.MaxValue));
            Assert.IsFalse(interval.IsValueInLimits(-0.1));
            Assert.IsFalse(interval.IsValueInLimits(0));
            Assert.IsTrue(interval.IsValueInLimits(0.5));
            Assert.IsFalse(interval.IsValueInLimits(Double.PositiveInfinity));
            Assert.IsFalse(interval.IsValueInLimits(Double.NegativeInfinity));
        }
        private BsEqtySimulatorStepDatas StepSimulDatas(DateTime start, DateTime end, BlackScholesModel model, DiscountCurve assetDiscount, DateTime horizon)
        {
            DiscreteLocalDividend[] stepDividends = model.Dividends
                                                    .Where(div => start < div.Date && div.Date <= end)
                                                    .OrderBy(div => div.Date)
                                                    .ToArray();
            //If step end date is not a div date, we insert a fictious zero dividend
            if (!(stepDividends.Any() && end.Equals(stepDividends.Last().Date)))
            {
                stepDividends = stepDividends.Union(new[] { DiscreteLocalDividend.ZeroDiv(end) }).ToArray();
            }

            var variance      = (model.Sigma * model.Sigma).Integral(0.0);
            var stepVols      = new double[stepDividends.Length];
            var stepVarDrifts = new double[stepDividends.Length];

            for (int i = 0; i < stepDividends.Length; i++)
            {
                var subStepStart = i > 0 ? stepDividends[i - 1].Date : start;
                var subStepEnd   = stepDividends[i].Date;

                var subStep      = RealInterval.Compact(model.Time[subStepStart], model.Time[subStepEnd]);
                var stepVariance = variance.Eval(subStep.Sup) - variance.Eval(subStep.Inf);
                var stepVarDrift = -0.5 * stepVariance;

                stepVols[i]      = Math.Sqrt(stepVariance / subStep.Length);
                stepVarDrifts[i] = stepVarDrift;
            }

            var horizonDiscount = assetDiscount.Zc(horizon);
            var discounts       = stepDividends.Map(div => horizonDiscount / assetDiscount.Zc(div.Date));

            var dates = model.Time[stepDividends.Map(div => div.Date)];
            var step  = RealInterval.Compact(model.Time[start], model.Time[end]);

            return(new BsEqtySimulatorStepDatas(step, dates, stepDividends, discounts, stepVols, stepVarDrifts));
        }
示例#13
0
 private BeatSequence(TimedEvent <Beat>[] beats, RealInterval span)
 {
     this.beats = beats;
     this.span  = span;
 }