public FdmHestonEquityPart(FdmMesher mesher, YieldTermStructure rTS, YieldTermStructure qTS, FdmQuantoHelper quantoHelper = null, LocalVolTermStructure leverageFct = null) { varianceValues_ = new Vector(0.5 * mesher.locations(1)); dxMap_ = new FirstDerivativeOp(0, mesher); dxxMap_ = new SecondDerivativeOp(0, mesher).mult(0.5 * mesher.locations(1)); mapT_ = new TripleBandLinearOp(0, mesher); mesher_ = mesher; rTS_ = rTS; qTS_ = qTS; quantoHelper_ = quantoHelper; leverageFct_ = leverageFct; // on the boundary s_min and s_max the second derivative // d^2V/dS^2 is zero and due to Ito's Lemma the variance term // in the drift should vanish. FdmLinearOpLayout layout = mesher_.layout(); FdmLinearOpIterator endIter = layout.end(); for (FdmLinearOpIterator iter = layout.begin(); iter != endIter; ++iter) { if (iter.coordinates()[0] == 0 || iter.coordinates()[0] == layout.dim()[0] - 1) { varianceValues_[iter.index()] = 0.0; } } volatilityValues_ = Vector.Sqrt(2 * varianceValues_); }
public FdmHestonLocalVolatilityVarianceMesher(int size, HestonProcess process, LocalVolTermStructure leverageFct, double maturity, int tAvgSteps = 10, double epsilon = 0.0001) : base(size) { leverageFct_ = leverageFct; FdmHestonVarianceMesher mesher = new FdmHestonVarianceMesher(size, process, maturity, tAvgSteps, epsilon); for (int i = 0; i < size; ++i) { dplus_[i] = mesher.dplus(i); dminus_[i] = mesher.dminus(i); locations_[i] = mesher.location(i); } volaEstimate_ = mesher.volaEstimate(); if (leverageFct != null) { double s0 = process.s0().currentLink().value(); List <double> acc = new List <double>(); acc.Add(leverageFct.localVol(0.0, s0, true)); Handle <YieldTermStructure> rTS = process.riskFreeRate(); Handle <YieldTermStructure> qTS = process.dividendYield(); for (int l = 1; l <= tAvgSteps; ++l) { double t = (maturity * l) / tAvgSteps; double vol = volaEstimate_ * acc.Average(); double fwd = s0 * qTS.currentLink().discount(t) / rTS.currentLink().discount(t); int sAvgSteps = 50; Vector u = new Vector(sAvgSteps), sig = new Vector(sAvgSteps); for (int i = 0; i < sAvgSteps; ++i) { u[i] = epsilon + ((1.0 - 2.0 * epsilon) / (sAvgSteps - 1.0)) * i; double x = new InverseCumulativeNormal().value(u[i]); double gf = x * vol * Math.Sqrt(t); double f = fwd * Math.Exp(gf); sig[i] = Math.Pow(leverageFct.localVol(t, f, true), 2.0); } double leverageAvg = new GaussLobattoIntegral(10000, 1E-4).value(new interpolated_volatility(u, sig).value, u.First(), u.Last()) / (1.0 - 2.0 * epsilon); acc.Add(leverageAvg); } volaEstimate_ *= acc.Average(); } }
public FdmHestonSolver( Handle <HestonProcess> process, FdmSolverDesc solverDesc, FdmSchemeDesc schemeDesc = null, Handle <FdmQuantoHelper> quantoHelper = null, LocalVolTermStructure leverageFct = null) { process_ = process; solverDesc_ = solverDesc; schemeDesc_ = schemeDesc ?? new FdmSchemeDesc().Douglas(); quantoHelper_ = quantoHelper == null ? new Handle <FdmQuantoHelper>() : quantoHelper; leverageFct_ = leverageFct; }
// Constructor public FdHestonRebateEngine( HestonModel model, int tGrid = 100, int xGrid = 100, int vGrid = 50, int dampingSteps = 0, FdmSchemeDesc schemeDesc = null, LocalVolTermStructure leverageFct = null) : base(model) { tGrid_ = tGrid; xGrid_ = xGrid; vGrid_ = vGrid; dampingSteps_ = dampingSteps; schemeDesc_ = schemeDesc == null ? new FdmSchemeDesc().Hundsdorfer() : schemeDesc; leverageFct_ = leverageFct; model_.registerWith(update); }
public FdHestonVanillaEngine( HestonModel model, FdmQuantoHelper quantoHelper, int tGrid, int xGrid, int vGrid, int dampingSteps, FdmSchemeDesc schemeDesc, LocalVolTermStructure leverageFct) : base(model) { tGrid_ = tGrid; xGrid_ = xGrid; vGrid_ = vGrid; dampingSteps_ = dampingSteps; schemeDesc_ = schemeDesc; leverageFct_ = leverageFct; strikes_ = new List <double>(); cachedArgs2results_ = new List <Pair <DividendVanillaOption.Arguments, OneAssetOption.Results> >(); quantoHelper_ = quantoHelper; }
public FdHestonVanillaEngine( HestonModel model, int tGrid = 100, int xGrid = 100, int vGrid = 50, int dampingSteps = 0, FdmSchemeDesc schemeDesc = null, LocalVolTermStructure leverageFct = null) : base(model) { tGrid_ = tGrid; xGrid_ = xGrid; vGrid_ = vGrid; dampingSteps_ = dampingSteps; schemeDesc_ = schemeDesc == null ? new FdmSchemeDesc().Hundsdorfer() : schemeDesc; leverageFct_ = leverageFct; strikes_ = new List <double>(); cachedArgs2results_ = new List <Pair <DividendVanillaOption.Arguments, OneAssetOption.Results> >(); quantoHelper_ = null; model_.registerWith(update); }
public FdmHestonOp(FdmMesher mesher, HestonProcess hestonProcess, FdmQuantoHelper quantoHelper = null, LocalVolTermStructure leverageFct = null) { correlationMap_ = new SecondOrderMixedDerivativeOp(0, 1, mesher) .mult(hestonProcess.rho() * hestonProcess.sigma() * mesher.locations(1)); dyMap_ = new FdmHestonVariancePart(mesher, hestonProcess.riskFreeRate().currentLink(), hestonProcess.sigma(), hestonProcess.kappa(), hestonProcess.theta()); dxMap_ = new FdmHestonEquityPart(mesher, hestonProcess.riskFreeRate().currentLink(), hestonProcess.dividendYield().currentLink(), quantoHelper, leverageFct); }
public MakeFdHestonVanillaEngine withLeverageFunction( LocalVolTermStructure leverageFct) { leverageFct_ = leverageFct; return(this); }