public void modifyLattice(double U) { // Forward induction; building the tree double down = str.downValue(); double up = str.upValue(); int si = lattice.MinIndex; lattice[si, si] = U; // Loop from the min index to the end index for (int n = lattice.MinIndex + 1; n <= lattice.MaxIndex; n++) { for (int i = 0; i < lattice.NumberColumns(n) - 1; i++) { lattice[n, i] = down * lattice[n - 1, i]; lattice[n, i + 1] = up * lattice[n - 1, i]; } } // Postcondition: we now have the complete lattice for the underlying asset }
/* 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); } }