Пример #1
0
 public Fj_Helper(double kappa, double theta, double sigma,
                  double v0, double s0, double rho,
                  AnalyticHestonEngine engine,
                  ComplexLogFormula cpxLog,
                  double term,
                  double strike,
                  double ratio,
                  int j)
 {
     j_      = j;
     kappa_  = kappa;
     theta_  = theta;
     sigma_  = sigma;
     v0_     = v0;
     cpxLog_ = cpxLog;
     term_   = term;
     x_      = Math.Log(s0);
     sx_     = Math.Log(strike);
     dd_     = x_ - Math.Log(ratio);
     sigma2_ = sigma_ * sigma_;
     rsigma_ = rho * sigma_;
     t0_     = kappa - ((j == 1) ? rho * sigma : 0);
     b_      = 0;
     g_km1_  = 0;
     engine_ = engine;
 }
Пример #2
0
        protected override double blackVolImpl(double t, double strike)
        {
            HestonProcess process = hestonModel_.link.process();

            double df        = process.riskFreeRate().link.discount(t, true);
            double div       = process.dividendYield().link.discount(t, true);
            double spotPrice = process.s0().link.value();

            double fwd = spotPrice
                         * process.dividendYield().link.discount(t, true)
                         / process.riskFreeRate().link.discount(t, true);

            var payoff = new PlainVanillaPayoff(fwd > strike ? Option.Type.Put : Option.Type.Call, strike);

            double kappa = hestonModel_.link.kappa();
            double theta = hestonModel_.link.theta();
            double rho   = hestonModel_.link.rho();
            double sigma = hestonModel_.link.sigma();
            double v0    = hestonModel_.link.v0();

            AnalyticHestonEngine.ComplexLogFormula cpxLogFormula = AnalyticHestonEngine.ComplexLogFormula.Gatheral;

            AnalyticHestonEngine hestonEnginePtr = null;

            double?npv         = null;
            int    evaluations = 0;

            AnalyticHestonEngine.doCalculation(
                df, div, spotPrice, strike, t,
                kappa, theta, sigma, v0, rho,
                payoff, integration_, cpxLogFormula,
                hestonEnginePtr, ref npv, ref evaluations);

            if (npv <= 0.0)
            {
                return(Math.Sqrt(theta));
            }

            Brent solver = new Brent();

            solver.setMaxEvaluations(10000);
            double guess    = Math.Sqrt(theta);
            double accuracy = Const.QL_EPSILON;

            var f = new ImpliedVolHelper(payoff.optionType(), strike, fwd, t, df, npv.Value);

            return(solver.solve(f, accuracy, guess, 0.01));
        }
Пример #3
0
        public static void doCalculation(double riskFreeDiscount,
                                         double dividendDiscount,
                                         double spotPrice,
                                         double strikePrice,
                                         double term,
                                         double kappa, double theta, double sigma, double v0, double rho,
                                         TypePayoff type,
                                         Integration integration,
                                         ComplexLogFormula cpxLog,
                                         AnalyticHestonEngine enginePtr,
                                         ref double?value,
                                         ref int evaluations)
        {
            double ratio = riskFreeDiscount / dividendDiscount;

            double c_inf = Math.Min(10.0, Math.Max(0.0001,
                                                   Math.Sqrt(1.0 - (Math.Pow(rho, 2))) / sigma))
                           * (v0 + kappa * theta * term);

            evaluations = 0;
            double p1 = integration.calculate(c_inf,
                                              new Fj_Helper(kappa, theta, sigma, v0, spotPrice, rho, enginePtr,
                                                            cpxLog, term, strikePrice, ratio, 1).value) / Const.M_PI;

            evaluations += integration.numberOfEvaluations();

            double p2 = integration.calculate(c_inf,
                                              new Fj_Helper(kappa, theta, sigma, v0, spotPrice, rho, enginePtr,
                                                            cpxLog, term, strikePrice, ratio, 2).value) / Const.M_PI;

            evaluations += integration.numberOfEvaluations();

            switch (type.optionType())
            {
            case Option.Type.Call:
                value = spotPrice * dividendDiscount * (p1 + 0.5) - strikePrice * riskFreeDiscount * (p2 + 0.5);
                break;

            case Option.Type.Put:
                value = spotPrice * dividendDiscount * (p1 - 0.5) - strikePrice * riskFreeDiscount * (p2 - 0.5);
                break;

            default:
                Utils.QL_FAIL("unknown option type");
                break;
            }
        }
Пример #4
0
 public Fj_Helper(VanillaOption.Arguments arguments,
                  HestonModel model,
                  AnalyticHestonEngine engine,
                  ComplexLogFormula cpxLog,
                  double term, double ratio, int j)
 {
     j_      = j; //arg_(arguments),
     kappa_  = model.kappa();
     theta_  = model.theta();
     sigma_  = model.sigma();
     v0_     = model.v0();
     cpxLog_ = cpxLog;
     term_   = term;
     x_      = Math.Log(model.process().s0().link.value());
     sx_     = Math.Log(((StrikedTypePayoff)(arguments.payoff)).strike());
     dd_     = x_ - Math.Log(ratio);
     sigma2_ = sigma_ * sigma_;
     rsigma_ = model.rho() * sigma_;
     t0_     = kappa_ - ((j_ == 1) ? model.rho() * sigma_ : 0);
     b_      = 0;
     g_km1_  = 0;
     engine_ = engine;
 }