예제 #1
0
 public double[] forwardInterestRate(intensityObject intensityobject, int start, int s**t, String method)
 {
     double[] p = new double[intensityobject.mu.Length];
     for (int i = 0; i < start; i++)
     {
         p[i] = 0;
     }
     // Exact, returns the e^int(f)
     if (method == "exact")
     {
         p[start] = Math.Exp(intensityobject.r[start]);
         for (int i = start + 1; i <= s**t; i++)
         {
             p[i] = zeroCuponPrice(intensityobject.a2, intensityobject.b2, intensityobject.r, intensityobject.sigma2, i, s**t);
         }
         return(p);
     }
     else if (method == "simulation")
     {
         throw new NotImplementedException("method not implemented yet");
     }
     else
     {
         throw new NotImplementedException("method not implemented yet");
     }
 }
예제 #2
0
 public double[] forwardSurrenderRate(intensityObject intensityobject, int start, int s**t, String method)
 {
     // Exact , this is m
     double[] f = new double[intensityobject.mu.Length];
     for (int i = 0; i < start; i++)
     {
         f[i] = 0;
     }
     if (method == "exact")
     {
         f[start] = intensityobject.tau0;
         for (int i = start + 1; i <= s**t; i++)
         {
             f[i] = calculateForwardRate(intensityobject.a1, intensityobject.b1, intensityobject.mu, intensityobject.sigma1, i, s**t);
         }
         return(f);
     }
     else if (method == "simulation")
     {
         throw new NotImplementedException("method not implemented yet");
     }
     else
     {
         throw new NotImplementedException("method not implemented yet");
     }
 }
예제 #3
0
        public double calculatePq(intensityObject intensititer, double start, double s**t)
        {
            CashFlowTool cashflowtool = new CashFlowTool();
            double       P00          = cashflowtool.muProbability00(intensititer, start, s**t, "");

            return(P00 * MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(y => intensititer.rFunction(y) * (cashflowtool.tekniskReserve_circle(y, intensititer) / cashflowtool.tekniskReserve_dagger(y, intensititer)), start, s**t));
        }
예제 #4
0
        static void Main(string[] args)
        {
            var timeHorizon = 100;
            var gridPoints  = 1;

            //var testESG = new BSESG(T:TimeHorizon);
            //var testscenario = testESG.Simulate();


            ////var simpletest = new FinancialObject(null, 1);
            //var test = new FinancialObject2(0.3, 1, TimeHorizon, testscenario);

            ////simpletest.WriteData("C:/Users/Steffen/Dropbox (Keylane)/Speciale/Data/simpletest.csv");
            //test.WriteData("C:/Users/Steffen/Dropbox (Keylane)/Speciale/Data/test.csv");
            var cashflowtool = new CashFlowTool();
            var intensititer = new intensityObject(0.1, 0.01, 0.01, timeHorizon, gridPoints, 0, 0, null, null, null, null);

            intensititer.simulate("");
            intensititer.exportTxt();

            // PW-means //

            // TODO: Sim r and mu

            // TODO: Then calculate transition probs P^mu and forward rates

            // The E[a^circle|r and mu up till time t] cashflow

            double result = findResult(timeHorizon, cashflowtool, intensititer, "ikke cor", "marginal");

            Console.WriteLine("Bonus værdi helt standard");
            double r = result / timeHorizon;

            Console.WriteLine(r.ToString());

            result = findResult(timeHorizon, cashflowtool, intensititer, "ikke cor", "simulation");

            Console.WriteLine("Bonus værdi helt standard, men fundet med sim");
            double p = result / timeHorizon;

            Console.WriteLine(p.ToString());


            result = findResult(timeHorizon, cashflowtool, intensititer, "cor", "marginal");


            Console.WriteLine("Bonus værdi med cor men med marginale");
            double q = result / timeHorizon;

            Console.WriteLine(q.ToString());

            result = findResult(timeHorizon, cashflowtool, intensititer, "cor", "simulation");

            Console.WriteLine("Bonus værdi med cor men med simulation");
            double s = result / timeHorizon;

            Console.WriteLine(s.ToString());
        }
예제 #5
0
        private static double findResult(int timeHorizon, CashFlowTool cashflowtool, intensityObject intensititer, String simMethod, String approxMethod)
        {
            var aCircle           = new double[timeHorizon + 1, timeHorizon + 1];
            var ab                = new double[timeHorizon + 1, timeHorizon + 1];
            var interestContainer = new List <double[]>(timeHorizon);

            ab[0, 0] = 0;
            ab[1, 0] = 0;
            double result = 0;

            for (int scenario = 0; scenario < timeHorizon; scenario++)
            {
                intensititer.simulate(simMethod);
                double[] Q = cashflowtool.calculateQ(intensititer);

                double[] forward = cashflowtool.forward00(intensititer, 0, timeHorizon, approxMethod);
                for (int time_i = 1; time_i <= timeHorizon; time_i++)
                {
                    //CALCULATING NECESSARY CONTROLS

                    // DERIVING CONTROLS
                    double eta     = 0;
                    double delta_1 = 0;
                    // double delta_0 = cashflowtool.tekniskReserve_circle(time_i, intensititer) * (intensititer.r[time_i-1] - intensititer.tekniskr(time_i));
                    // Calculating PQ
                    // double Pq = cashflowtool.calculatePq(intensititer, 0, time_i);


                    // Payments
                    double b_0_circ = 1; double b_01_circ = 2; double b_02_circ = 3;
                    double b_0_dagger = 1; double b_01_dagger = 0; double b_02_dagger = 0;
                    aCircle[scenario, time_i] = cashflowtool.muProbability00(intensititer, 0, time_i, "") * b_0_circ + cashflowtool.muProbability01(intensititer, 0, time_i, "") * b_01_circ + cashflowtool.muProbability02(intensititer, 0, time_i, "") * b_02_circ;
                    ab[scenario, time_i]      = Q[time_i] * forward[time_i] * b_0_dagger;
                    interestContainer.Add(intensititer.r); // need to hold the interest curve for later sum
                }
            }
            for (int scenario = 0; scenario < timeHorizon; scenario++)
            {
                double scenarioResult = 0;
                for (int time = 0; time < timeHorizon - 1; time++)
                {
                    scenarioResult += Math.Exp(-MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(y => rFunctionInx(y, interestContainer[scenario], intensititer), 0, time + 0.5)) * ((ab[0, time] + ab[0, time + 1]) / 2);
                }

                result += scenarioResult;
            }

            return(result);
        }
예제 #6
0
 public double[] forward00(intensityObject intensityobject, int start, int s**t, String method)
 {
     double[] p = new double[intensityobject.mu.Length + 1];
     for (int i = 0; i < start; i++)
     {
         p[i] = 0;
     }
     // Exact, returns the E e^int(tau+mu)
     if (method == "marginal")
     {
         p[start] = Math.Exp(-intensityobject.tau[start] - intensityobject.mu[start]);
         for (int i = start + 1; i <= s**t; i++)
         {
             p[i] = zeroCuponPrice(intensityobject.a1, intensityobject.b1, intensityobject.tau, intensityobject.sigma1, start, i) * Math.Exp(-MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(x => intensityobject.muFunction(x), start, i));
         }
         return(p);
     }
     else if (method == "simulation")
     {
         var paths = new List <double[]>();
         for (int n = 0; n < 100; n++)
         {
             intensityObject intCopy = intensityobject;
             intCopy.simulate("cor");
             var path = new double[intensityobject.mu.Length + 1];
             path[start] = Math.Exp(-intensityobject.tau[start] - intensityobject.mu[start]);
             for (int i = start + 1; i <= s**t; i++)
             {
                 path[i] = Math.Exp(-MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(x => intCopy.tauFunction(x) + intCopy.muFunction(x), start, i));
             }
             paths.Add(path);
         }
         for (int i = 0; i <= intensityobject.mu.Length; i++)
         {
             var total = 0.0;
             for (int n = 0; n < 100; n++)
             {
                 total += paths[n][i];
             }
             p[i] = total / 100;
         }
         return(p);
     }
     else
     {
         throw new NotImplementedException("method not implemented yet");
     }
 }
예제 #7
0
        static double[] euler(int x0, double y, intensityObject intensiteter)
        {
            int h = 1;

            double[] yres = new double[intensiteter.horizon + 1];
            yres[0] = y;
            while (x0 < intensiteter.horizon)
            {
                y        = y + h * funcQ(x0, y, intensiteter);
                x0       = x0 + h;
                yres[x0] = y;
            }

            // Printing approximation
            return(yres);
        }
예제 #8
0
        private double Vbarcircstjern(intensityObject intensiteter, double x)
        {
            CashFlowTool tool = new CashFlowTool();

            return(tool.muProbability00(intensiteter, 0, x, "") * tool.tekniskReserve_circle(x, intensiteter));
        }
예제 #9
0
        static double funcQ(double x, double y, intensityObject intensiteter)
        {
            CashFlowTool tool = new CashFlowTool();

            return(intensiteter.rFunction(x) * (((tool.Vbarcircstjern(intensiteter, x) / tool.Vbardaggerstjern(intensiteter, x)) + y)));
        }
예제 #10
0
 public double muProbability02(intensityObject intensityobject, double start, double s**t, String method)
 {
     return(MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(x => muProbability00(intensityobject, start, x, "") * intensityobject.muFunction(x), start, s**t));
 }
예제 #11
0
        public double tekniskReserve_dagger(double time_i, intensityObject intensititer)
        {
            double b_0 = 1;

            return(MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(y => muProbability00(intensititer, time_i, y, "") * b_0 * (y > 40 ? 1 : 0), time_i, intensititer.horizon));
        }
예제 #12
0
        public double tekniskReserve_circle(double time_i, intensityObject intensititer)
        {
            double b_0 = 1; double b_01 = 0.02; double b_02 = 0.02;

            return(MathNet.Numerics.Integration.SimpsonRule.IntegrateThreePoint(y => muProbability00(intensititer, time_i, y, "") * b_0 * (y > 40 ? 1 : 0) + muProbability00(intensititer, time_i, y, "") * b_01 * intensititer.tauFunction(y) + muProbability00(intensititer, time_i, y, "") * b_02 * intensititer.muFunction(y), time_i, intensititer.horizon));
        }
예제 #13
0
 public double[] forwardMortality(intensityObject intensityobject, int start, String method)
 {
     return(intensityobject.mu);
 }
예제 #14
0
 public double[] calculateQ(intensityObject intensititer)
 {
     return(euler(0, 0, intensititer));
 }
예제 #15
0
 public static double rFunctionInx(double x, double[] r, intensityObject intensityobject)
 {
     return(intensityobject.Interpolate1D(x, intensityobject.xVal, r, 0D, intensityobject.horizon));
 }