Example #1
0
        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();
            }
        }
Example #3
0
 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;
 }
Example #4
0
        // 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);
        }
Example #7
0
        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);
 }