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"); } }
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"); } }
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)); }
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()); }
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); }
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"); } }
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); }
private double Vbarcircstjern(intensityObject intensiteter, double x) { CashFlowTool tool = new CashFlowTool(); return(tool.muProbability00(intensiteter, 0, x, "") * tool.tekniskReserve_circle(x, intensiteter)); }
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))); }
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)); }
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)); }
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)); }
public double[] forwardMortality(intensityObject intensityobject, int start, String method) { return(intensityobject.mu); }
public double[] calculateQ(intensityObject intensititer) { return(euler(0, 0, intensititer)); }
public static double rFunctionInx(double x, double[] r, intensityObject intensityobject) { return(intensityobject.Interpolate1D(x, intensityobject.xVal, r, 0D, intensityobject.horizon)); }