@@ -57,15 +57,21 @@ namespace QuantLib {
5757 Rate riskFreeDiscount =
5858 process_->riskFreeRate ()->discount (ex->lastDate ());
5959
60+ Real t_ex = process_->blackVolatility ()->timeFromReference (ex->lastDate ());
61+ Real forward = spot / riskFreeDiscount * dividendDiscount;
62+
6063 results_.additionalResults [" spot" ] = spot;
64+ results_.additionalResults [" forward" ] = forward;
6165 results_.additionalResults [" strike" ] = payoff->strike ();
6266 results_.additionalResults [" variance" ] = variance;
67+ results_.additionalResults [" volatility" ] = std::sqrt (variance / t_ex);
68+ results_.additionalResults [" timeToExpiry" ] = t_ex;
6369 results_.additionalResults [" riskFreeDiscount" ] = riskFreeDiscount;
64- results_.additionalResults [" dividendDiscount" ] = dividendDiscount;
65-
70+ results_.additionalResults [" dividendDiscount" ] = dividendDiscount;
71+
6672 if (ex->payoffAtExpiry ()) {
6773 AmericanPayoffAtExpiry pricer (spot, riskFreeDiscount,
68- dividendDiscount, variance,
74+ dividendDiscount, variance,
6975 payoff, knock_in ());
7076 results_.value = pricer.value ();
7177 } else {
@@ -81,7 +87,14 @@ namespace QuantLib {
8187 arguments_.exercise ->lastDate ());
8288 results_.rho = pricer.rho (t);
8389 }
90+
91+ auto coo = ext::dynamic_pointer_cast<CashOrNothingPayoff>(payoff);
92+ Real payout = coo != nullptr ? coo->cashPayoff () : forward;
93+ Real valueToPayoutRatio = results_.value / payout;
94+
95+ results_.additionalResults [" payout" ] = payout;
96+ results_.additionalResults [" discountedTouchProbability" ] =
97+ knock_in () ? valueToPayoutRatio : 1.0 - valueToPayoutRatio;
8498 }
8599
86100}
87-
0 commit comments