Function barone_adesi_whaley_on_future
pub(crate) fn barone_adesi_whaley_on_future<R: Scalar>(
forward: R,
strike: f64,
vol: R,
expiry: f64,
discount: R,
kind: OptionKind,
) -> Result<AmericanOnFuture<R>, ModelError>Expand description
The Barone-Adesi–Whaley quadratic approximation to an American
option on a future: zero cost of carry, the premium paid up front and
discounted by discount (the discount factor to expiry, e^{−rT}).
With r = −ln(discount)/T, M = 2r/σ² and κ = 1 − discount, the call’s
exponent is q₂ = (1 + √(1 + 4M/κ))/2 and the put’s q₁ = (1 − √(1 + 4M/κ))/2. The critical price F* solves value matching,
F* − K = c(F*) + (1 − discount·N(d₁(F*)))·F*/q₂ for a call (its mirror
for a put), and below it the value is
c(F) + (F/F*)^{q₂}·(F* − K − c(F*)); beyond it, the intrinsic value.
The early-exercise term is written in its value-matching form, which
at the root equals the textbook (F*/q₂)(1 − discount·N(d₁(F*))) and is
stationary in F* there (setting its derivative in F* to zero is exactly
smooth pasting). So the critical price is solved on passive values, and
enters the mode carrying its implicit slope ∂F*/∂θ = −g_θ/g_F* from one
Newton step on value matching g — its value pinned to the passive root.
To first order the slope is multiplied by the zero ∂V/∂F* and changes
nothing; to second order it supplies the ∂²V/∂θ∂F*·∂F*/∂θ terms, so
volga and the vol–discount cross-gamma are whole. (∂²F*/∂θ² is again
multiplied by the zero and is not needed.)
A non-positive rate (discount ≥ 1) makes early exercise never optimal,
and the value is the European one.
§Errors
ModelError::NotLognormal for a non-positive forward or strike;
ModelError::CriticalPriceUnsolved if the boundary does not solve.