コード例 #1
0
        public AffineDivCurveUtils(DividendQuote[] dividends,
                                   DiscountCurve discountCurve,
                                   ITimeMeasure time)
        {
            Contract.Requires(EnumerableUtils.IsSorted(dividends.Select(div => div.Date)));

            if (dividends.Length > 0)
            {
                double[] divDates         = dividends.Map(div => time[div.Date]);
                double[] spotYieldGrowths = dividends.Scan(1.0, (prev, div) => prev * (1.0 - div.Yield));
                var      spotYieldGrowth  = new StepFunction(divDates, spotYieldGrowths, 1.0);
                assetGrowth = t => spotYieldGrowth.Eval(t) / discountCurve.Zc(t);

                double[] discountedCashs = dividends.Map(div => div.Cash / assetGrowth(time[div.Date]));
                double[] cashBpvs        = discountedCashs.Scan(0.0, (prev, c) => prev + c);
                cashDivBpv      = new StepFunction(divDates, cashBpvs, 0.0);
                cashBpvIntegral = cashDivBpv.Integral(0.0);

                double[] squareTimeWeightedCashs = discountedCashs.ZipWith(divDates, (c, t) => c * t * t);
                squareTimeWeightedCash = new StepFunction(divDates, squareTimeWeightedCashs, 0.0);
            }
            else
            {
                assetGrowth     = t => 1.0 / discountCurve.Zc(t);
                cashDivBpv      = new StepFunction(new[] { 0.0 }, new[] { 0.0 }, double.NaN);
                cashBpvIntegral = RrFunctions.Zero;

                squareTimeWeightedCash = new StepFunction(new[] { 0.0 }, new[] { 0.0 }, double.NaN);
            }
        }
コード例 #2
0
        public override double Eval(double x)
        {
            int leftIndex;
            var spline = stepSplines.Eval(x, out leftIndex);
            var h      = x - pillars[Math.Max(0, leftIndex)];

            return(spline.Eval(h));
        }
コード例 #3
0
        private static RationalFraction BasedExtrapol(StepFunction <RationalFraction> stepSplines, double firstPillar)
        {
            var extrapol   = stepSplines.Eval(double.NegativeInfinity);
            var basedNum   = extrapol.Num.TaylorDev(firstPillar - stepSplines.Pillars.First());
            var basedDenom = extrapol.Denom.TaylorDev(firstPillar - stepSplines.Pillars.First());

            return(basedNum / basedDenom);
        }
コード例 #4
0
        public void TestEval()
        {
            var          abs     = new[] { 0.0, 0.5, 0.99, 2.5 };
            var          vals    = new[] { 5.0, 5.4, 3.1, 1.0 };
            const double leftVal = 0.0;

            var stepFunc = new StepFunction(abs, vals, leftVal);

            foreach (var i in Enumerable.Range(0, abs.Length))
            {
                Assert.AreEqual(stepFunc.Eval(abs[i]), vals[i]);
                if (i < abs.Length - 1)
                {
                    var midPoint = 0.5 * (abs[i] + abs[i + 1]);
                    Assert.AreEqual(stepFunc.Eval(midPoint), vals[i]);

                    var nextPointMinus = abs[i] + (1.0 - 5.0 * DoubleUtils.MachineEpsilon) * (abs[i + 1] - abs[i]);
                    Assert.AreEqual(stepFunc.Eval(nextPointMinus), vals[i]);
                }
            }

            Assert.AreEqual(stepFunc.Eval(abs[0] - 0.00000000001), leftVal);
            Assert.AreEqual(stepFunc.Eval(double.NegativeInfinity), leftVal);
            Assert.AreEqual(stepFunc.Eval(abs[abs.Length - 1] + 0.00000000001), vals[abs.Length - 1]);
            Assert.AreEqual(stepFunc.Eval(double.PositiveInfinity), vals[abs.Length - 1]);
        }
コード例 #5
0
        public void TestMult()
        {
            var          pillars1 = new[] { 0.0, 1.0, 2.0 };
            var          vals1    = new[] { 0.007, 0.004, 0.0065 };
            const double left1    = 2.0;
            var          step1    = new StepFunction(pillars1, vals1, left1);

            var          pillars2 = new[] { -0.8, 0.2, 1.0, 1.5, 2.0, 3.55 };
            var          vals2    = new[] { 0.005, 0.003, -0.1, 0.0, -0.08, 10.0 };
            const double left2    = -1.89;
            var          step2    = new StepFunction(pillars2, vals2, left2);

            var prod = step1 * step2;

            Assert.IsTrue(prod is StepFunction);

            var allPillars = pillars1.Union(pillars2).OrderBy(p => p).ToArray();

            for (int i = 0; i < allPillars.Length; i++)
            {
                double x       = allPillars[i];
                var    val1    = step1.Eval(x);
                var    val2    = step2.Eval(x);
                var    prodVal = prod.Eval(x);

                Assert.IsTrue(DoubleUtils.MachineEquality(prodVal, val1 * val2));
            }
            Assert.IsTrue(DoubleUtils.MachineEquality(prod.Eval(double.NegativeInfinity),
                                                      step1.Eval(double.NegativeInfinity) * step2.Eval(double.NegativeInfinity)));

            var    rand = new Random(123);
            double a    = allPillars.Max() - allPillars.Min();
            double b    = allPillars.Min();

            for (int i = 0; i < 1000; i++)
            {
                var x       = rand.NextDouble() * a * 3.0 + b - 0.1 * a;
                var val1    = step1.Eval(x);
                var val2    = step2.Eval(x);
                var prodVal = prod.Eval(x);

                Assert.IsTrue(DoubleUtils.MachineEquality(prodVal, val1 * val2));
            }
        }
コード例 #6
0
        private static RationalFraction BasedSpline(StepFunction <RationalFraction> stepSplines, double basePoint)
        {
            int stepIndex;
            var spline          = stepSplines.Eval(basePoint, out stepIndex);
            var splineBasePoint = stepSplines.Pillars[Math.Max(0, stepIndex)];

            var basedNum   = spline.Num.TaylorDev(basePoint - splineBasePoint);
            var basedDenom = spline.Denom.TaylorDev(basePoint - splineBasePoint);

            return(basedNum / basedDenom);
        }
コード例 #7
0
 public double CashBpvTimeWeightedAverage(double t)
 {
     //throw new NotImplementedException("todo");
     return(cashDivBpv.Eval(t) - squareTimeWeightedCash.Eval(t) / (t * t));
 }
コード例 #8
0
 public double CashDivBpv(double t)
 {
     return(cashDivBpv.Eval(t));
 }