Beispiel #1
0
 public void REPORT_FAILURE(string greekName, DoubleBarrier.Type barrierType, double barrierlo, double barrierhi,
                            StrikedTypePayoff payoff, Exercise exercise, double s, double q,
                            double r, Date today, double v, double expected, double calculated, double error,
                            double tolerance)
 {
     QAssert.Fail(barrierType + " " + exercise + " "
                  + payoff.optionType() + " option with "
                  + payoff + " payoff:\n"
                  + "    underlying value: " + s + "\n"
                  + "    strike:           " + payoff.strike() + "\n"
                  + "    barrier low:      " + barrierlo + "\n"
                  + "    barrier high:     " + barrierhi + "\n"
                  + "    dividend yield:   " + q + "\n"
                  + "    risk-free rate:   " + r + "\n"
                  + "    reference date:   " + today + "\n"
                  + "    maturity:         " + exercise.lastDate() + "\n"
                  + "    volatility:       " + v + "\n\n"
                  + "    expected " + greekName + ":   " + expected + "\n"
                  + "    calculated " + greekName + ": " + calculated + "\n"
                  + "    error:            " + error + "\n"
                  + "    tolerance:        " + tolerance);
 }
Beispiel #2
0
        public override void calculate()
        {
            AmericanExercise ex = arguments_.exercise as AmericanExercise;

            Utils.QL_REQUIRE(ex != null, () => "non-American exercise given");
            Utils.QL_REQUIRE(ex.dates()[0] <= process_.blackVolatility().link.referenceDate(), () =>
                             "American option with window exercise not handled yet");

            StrikedTypePayoff payoff = arguments_.payoff as StrikedTypePayoff;

            Utils.QL_REQUIRE(payoff != null, () => "non-striked payoff given");

            double spot = process_.stateVariable().link.value();

            Utils.QL_REQUIRE(spot > 0.0, () => "negative or null underlying given");

            double variance         = process_.blackVolatility().link.blackVariance(ex.lastDate(), payoff.strike());
            double dividendDiscount = process_.dividendYield().link.discount(ex.lastDate());
            double riskFreeDiscount = process_.riskFreeRate().link.discount(ex.lastDate());

            if (ex.payoffAtExpiry())
            {
                AmericanPayoffAtExpiry pricer = new AmericanPayoffAtExpiry(spot, riskFreeDiscount,
                                                                           dividendDiscount, variance,
                                                                           payoff, knock_in());
                results_.value = pricer.value();
            }
            else
            {
                AmericanPayoffAtHit pricer = new AmericanPayoffAtHit(spot, riskFreeDiscount, dividendDiscount, variance, payoff);
                results_.value = pricer.value();
                results_.delta = pricer.delta();
                results_.gamma = pricer.gamma();

                DayCounter rfdc = process_.riskFreeRate().link.dayCounter();
                double     t    = rfdc.yearFraction(process_.riskFreeRate().link.referenceDate(),
                                                    arguments_.exercise.lastDate());
                results_.rho = pricer.rho(t);
            }
        }