Example #1
0
        public LeisenReimer(StochasticProcess1D process, double end, int steps, double strike)
            : base(process, end, (steps % 2 != 0 ? steps : steps + 1))
        {
            Utils.QL_REQUIRE(strike > 0.0, () => "strike must be positive");
            int    oddSteps = (steps % 2 != 0 ? steps : steps + 1);
            double variance = process.variance(0.0, x0_, end);
            double ermqdt   = Math.Exp(driftPerStep_ + 0.5 * variance / oddSteps);
            double d2       = (Math.Log(x0_ / strike) + driftPerStep_ * oddSteps) / Math.Sqrt(variance);

            pu_ = Utils.PeizerPrattMethod2Inversion(d2, oddSteps);
            pd_ = 1.0 - pu_;
            double pdash = Utils.PeizerPrattMethod2Inversion(d2 + Math.Sqrt(variance), oddSteps);

            up_   = ermqdt * pdash / pu_;
            down_ = (ermqdt - pu_ * up_) / (1.0 - pu_);
        }