public void C9_9_4_European() { var opt = _testOption; var k = opt.T / numberOfSteps; var discounting = Math.Exp(-opt.r * k); var binParams = new CRRStrategy(opt.sig, opt.r, k);; // Factory var bn = new BinomialMethod(discounting, binParams, numberOfSteps); bn.ModifyLattice(opt.K); // Phase III: Backward Induction and compute option price Vector <double> RHS = new Vector <double>(bn.BasePyramidVector()); if (binParams.BinomialType == BinomialType.Additive) { RHS[RHS.MinIndex] = opt.K * Math.Exp(numberOfSteps * binParams.DownValue); for (int j = RHS.MinIndex + 1; j <= RHS.MaxIndex; j++) { RHS[j] = RHS[j - 1] * Math.Exp(binParams.UpValue - binParams.DownValue); } } var pay = opt.PayoffVector(RHS); var pr = bn.GetPrice(pay); Assert.AreEqual(pr, 2.8307, 0.01); }
public void C9_9_9_2_TheLeisenReimerMethod() { var opt = _testOption; var numberOfSteps = 99; var k = opt.T / numberOfSteps; var discounting = Math.Exp(-opt.r * k); var S = opt.K; var binParams = new LeisenReimerStrategy(numberOfSteps, S, opt.K, opt.T, opt.r, opt.sig); var bn = new BinomialMethod(discounting, binParams, numberOfSteps); bn.ModifyLattice(S); // Phase III: Backward Induction and compute option price var RHS = new Vector <double>(bn.BasePyramidVector()); var pay = opt.PayoffVector(RHS); var pr = bn.GetPrice(pay); Assert.AreEqual(pr, 2.8307, 0.01); }
/* public static double EarlyImpl(double P, double S) * { * * double K = 10.0; * * if (P > K - S) * { * return P; * } * return K - S; * }*/ // This could be made into a member function of Option public static void Main() { // Phase I: Create and initialise the option IOptionFactory fac = getFactory(); int N = 200; Console.Write("Number of time steps: "); N = Convert.ToInt32(Console.ReadLine()); double S; Console.Write("Underlying price: "); S = Convert.ToDouble(Console.ReadLine()); Option opt = fac.create(); double k = opt.T / N; // Create basic lattice double discounting = Math.Exp(-opt.r * k); // Phase II: Create the binomial method and forward induction BinomialLatticeStrategy binParams = getStrategy(opt.sig, opt.r, k, S, opt.K, N); // Factory BinomialMethod bn = new BinomialMethod(discounting, binParams, N); bn.modifyLattice(S); // Phase III: Backward Induction and compute option price Vector <double> RHS = new Vector <double>(bn.BasePyramidVector()); if (binParams.bType == BinomialType.Additive) { RHS[RHS.MinIndex] = S * Math.Exp(N * binParams.downValue()); for (int j = RHS.MinIndex + 1; j <= RHS.MaxIndex; j++) { RHS[j] = RHS[j - 1] * Math.Exp(binParams.upValue() - binParams.downValue()); } } Vector <double> Pay = opt.PayoffVector(RHS); double pr = bn.getPrice(Pay); Console.WriteLine("European {0}", pr); // Binomial method with early exercise BinomialMethod bnEarly = new BinomialMethod(discounting, binParams, N, opt.EarlyImpl); bnEarly.modifyLattice(S); Vector <double> RHS2 = new Vector <double>(bnEarly.BasePyramidVector()); Vector <double> Pay2 = opt.PayoffVector(RHS2); double pr2 = bnEarly.getPrice(Pay2); Console.WriteLine("American {0}", pr2); // Display in Excel; first create array of asset mesh points int startIndex = 0; Vector <double> xarr = new Vector <double>(N + 1, startIndex); xarr[xarr.MinIndex] = 0.0; for (int j = xarr.MinIndex + 1; j <= xarr.MaxIndex; j++) { xarr[j] = xarr[j - 1] + k; } // Display lattice in Excel ExcelMechanisms exl = new ExcelMechanisms(); try { // public void printLatticeInExcel(Lattice<double> lattice, Vector<double> xarr, string SheetName) string sheetName = "Lattice"; exl.printLatticeInExcel(bnEarly.getLattice(), xarr, sheetName); } catch (Exception e) { Console.WriteLine(e); } }
public void C9_9_ExcelOutput() { var opt = _testOption; var steps = 50; var S = opt.K; double k = opt.T / steps; double discounting = Math.Exp(-opt.r * k); var binParams = new CRRStrategy(opt.sig, opt.r, k);; // Factory var bn = new BinomialMethod(discounting, binParams, steps, opt.EarlyImpl); bn.ModifyLattice(opt.K); // Phase III: Backward Induction and compute option price Vector <double> RHS = new Vector <double>(bn.BasePyramidVector()); if (binParams.BinomialType == BinomialType.Additive) { RHS[RHS.MinIndex] = S * Math.Exp(steps * binParams.DownValue); for (int j = RHS.MinIndex + 1; j <= RHS.MaxIndex; j++) { RHS[j] = RHS[j - 1] * Math.Exp(binParams.UpValue - binParams.DownValue); } } var pay = opt.PayoffVector(RHS); var pr = bn.GetPrice(pay); // Display lattice in Excel var file = Path.GetTempFileName(); file = Path.ChangeExtension(file, "xlsx"); ExcelMechanisms exl = new ExcelMechanisms(file); try { // Display in Excel; first create array of asset mesh points int startIndex = 0; Vector <double> xarr = new Vector <double>(steps + 1, startIndex); xarr[xarr.MinIndex] = 0.0; for (int j = xarr.MinIndex + 1; j <= xarr.MaxIndex; j++) { xarr[j] = xarr[j - 1] + k; } string sheetName = "Lattice"; exl.printLatticeInExcel(bn.GetOptionLattice, xarr, sheetName); exl.Save(); } catch (Exception e) { Console.WriteLine(e); } Assert.AreEqual(pr, 3.0732, 0.01); }
public void C9_9_7_PadeApproximation() { var opt = new Library.Binominal.Option { K = 65, type = 1, T = 0.25, r = 0.08, sig = 0.3 }; double PriceWithJR(int numSteps, int type) { opt.type = type; var steps = numSteps; var S = 60; double k = opt.T / steps; double discounting = Math.Exp(-opt.r * k); var binParams = new PadeJRStrategy(opt.sig, opt.r, k); // Factory var bn = new BinomialMethod(discounting, binParams, steps); bn.ModifyLattice(S); // Phase III: Backward Induction and compute option price var RHS = new Vector <double>(bn.BasePyramidVector()); var pay = opt.PayoffVector(RHS); return(bn.GetPrice(pay)); } double PriceWithCRR(int numSteps, int type) { opt.type = type; var steps = numSteps; var S = 60; double k = opt.T / steps; double discounting = Math.Exp(-opt.r * k); var binParams = new PadeCRRStrategy(opt.sig, opt.r, k); // Factory var bn = new BinomialMethod(discounting, binParams, steps); bn.ModifyLattice(S); // Phase III: Backward Induction and compute option price var RHS = new Vector <double>(bn.BasePyramidVector()); var pay = opt.PayoffVector(RHS); return(bn.GetPrice(pay)); } Assert.AreEqual(PriceWithCRR(100, 1), 2.1399, 0.01); Assert.AreEqual(PriceWithCRR(100, 2), 5.8527, 0.01); Assert.AreEqual(PriceWithCRR(200, 1), 2.1365, 0.01); Assert.AreEqual(PriceWithCRR(200, 2), 5.8494, 0.01); Assert.AreEqual(PriceWithJR(100, 1), 2.1386, 0.01); Assert.AreEqual(PriceWithJR(100, 2), 5.8516, 0.01); Assert.AreEqual(PriceWithJR(200, 1), 2.1344, 0.01); Assert.AreEqual(PriceWithJR(200, 2), 5.8473, 0.01); }