Class Bachelier

java.lang.Object
com.quantfinlib.pricing.Bachelier

public final class Bachelier extends Object
Bachelier (normal) model for options on a forward: the forward follows dF = σ_N dW, so it can go negative and σ_N is quoted in absolute rate units (0.0080 = 80 basis points a year). Rates desks quote swaptions and caps in normal vol since negative rates made the lognormal model unusable (Bachelier 1900; for the modern use see Andersen and Piterbarg 2010, Interest Rate Modeling, vol. 1, section 7.1).
  call = df · [(F − K) Φ(d) + σ_N √T φ(d)],   d = (F − K) / (σ_N √T)
  put  = df · [(K − F) Φ(−d) + σ_N √T φ(d)]

Forward and strike may be any finite numbers, including negative. rate is the continuously compounded discount rate to the payment date (pass 0 and multiply by an annuity for swaptions).

  • Method Summary

    Modifier and Type
    Method
    Description
    static double
    delta(BlackScholes.OptionType type, double forward, double strike, double rate, double normalVol, double timeYears)
    Sensitivity to the forward: df·Φ(d) for a call, −df·Φ(−d) for a put.
    static double
    impliedVol(BlackScholes.OptionType type, double price, double forward, double strike, double rate, double timeYears)
    Implied normal vol from a discounted price.
    static double
    price(BlackScholes.OptionType type, double forward, double strike, double rate, double normalVol, double timeYears)
    Discounted normal-model price.
    static double
    vega(double forward, double strike, double rate, double normalVol, double timeYears)
    Vega per 1.00 of normal vol: df·√T·φ(d).

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • price

      public static double price(BlackScholes.OptionType type, double forward, double strike, double rate, double normalVol, double timeYears)
      Discounted normal-model price.
    • delta

      public static double delta(BlackScholes.OptionType type, double forward, double strike, double rate, double normalVol, double timeYears)
      Sensitivity to the forward: df·Φ(d) for a call, −df·Φ(−d) for a put.
    • vega

      public static double vega(double forward, double strike, double rate, double normalVol, double timeYears)
      Vega per 1.00 of normal vol: df·√T·φ(d).
    • impliedVol

      public static double impliedVol(BlackScholes.OptionType type, double price, double forward, double strike, double rate, double timeYears)
      Implied normal vol from a discounted price. NaN for a price below intrinsic or for invalid inputs, 0 at intrinsic.

      Out of the money the time value is v = σ√T·h(u) with u = |F − K|/(σ√T) and h(u) = φ(u) − u·Φ(−u), h'(u) = −Φ(−u) (Jäckel 2017, "Implied normal volatility", Wilmott). The solver runs a bracketed Newton iteration on ln(h(u)/u) = ln(v/|F − K|), which is smooth and monotone; at the money σ = v·√(2π/T) exactly.