Skip to main content

barone_adesi_whaley_on_future

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.