instruments

European Vanilla Options

To price a vanilla European option, we begin by defining the option itself:

    // Define the option contract.
    let option = EuropeanVanillaOptionBuilder::default()
        .strike(100.0)
        .expiry(date!(2025 - 12 - 31))
        .type_flag(TypeFlag::Call)
        .build()?;

Then we need to define a model to price the option with:

    // Define some models to price the option.
    let bs73 = BlackScholes73::new(100., 0.05, 0.2);
    let m73 = Merton73::new(100., 0.05, 0.03, 0.2);
    let b76 = Black76::new(100., 0.05, 0.2);
    let a82 = Asay82::new(100., 0.2);
    let gk83 = GarmanKohlhagen83::new(100., 0.05, 0.03, 0.2);
    let h93 = Heston93::new(100., 0.05, 0.03, 0.2, 0.1, 0.1, 0.1, 0.1);
    let bch = Bachelier::new(100., 0.05, 0.2);

Lastly, we construct an AnalyticOptionPricer, from which we can generate a report. The report simply prints the option, model, price, and Greeks.

    // Print the option, model, price and greeks.
    AnalyticOptionPricer::new(option, bs73).report();
    AnalyticOptionPricer::new(option, m73).report();
    AnalyticOptionPricer::new(option, b76).report();
    AnalyticOptionPricer::new(option, a82).report();
    AnalyticOptionPricer::new(option, gk83).report();
    AnalyticOptionPricer::new(option, h93).report();
    AnalyticOptionPricer::new(option, bch).report();

The output will look something like this:

// Model: BlackScholes73 { s: 100.0, r: 0.05, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "theta": -6.21680948799122,
//     "vega": 39.12469842218203,
//     "charm": 0.06220900042967281,
//     "zomma": -0.0837348839459069,
//     "price": 11.08579175284256,
//     "lambda": 5.802560832438351,
//     "rho": 58.59700502681849,
//     "delta": 0.6432598102161233,
//     "vanna": -0.2934352381663651,
//     "speed": -0.0004887850033760005,
//     "color": 0.009163226593140452,
//     "gamma": 0.01777400012276366,
//     "vomma": 11.303583301850122,
//     "ultima": -160.90535329601363,
// }

// Model: Merton73 { s: 100.0, r: 0.05, q: 0.03, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "theta": -4.272756285502488,
//     "gamma": 0.017995444677726104,
//     "zomma": -0.08997722338863051,
//     "speed": -0.0003599088935545221,
//     "color": 0.009074941597741354,
//     "delta": 0.5641575465829798,
//     "ultima": -43.59776593173644,
//     "price": 9.092954864173855,
//     "rho": 52.084231395586315,
//     "vanna": 5.2399933461312134e-17,
//     "charm": 0.01906616295796282,
//     "vega": 39.6121492700665,
//     "vomma": -1.1534441205446944e-15,
//     "lambda": 6.204336819109864,
// }

// Model: Black76 { f: 100.0, r: 0.05, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "zomma": -0.09046830043585345,
//     "speed": -0.00026845029437156125,
//     "vomma": -2.1679251440048266,
//     "ultima": 10.958928376819475,
//     "color": 0.009114622059396617,
//     "gamma": 0.017896686291437418,
//     "vanna": 0.19697379573327434,
//     "theta": -3.183941196979144,
//     "delta": 0.5127676040720752,
//     "vega": 39.394759146654856,
//     "rho": 47.7324390165048,
//     "price": 7.907921226166792,
//     "charm": -0.007741693912166335,
//     "lambda": 6.4842275157643305,
// }

// Model: Asay82 { f: 100.0, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "ultima": 11.578909557862003,
//     "theta": -3.7818316687297053,
//     "rho": 50.4328138066247,
//     "vega": 41.62344506035159,
//     "vanna": 0.208117225301758,
//     "gamma": 0.018909158343648525,
//     "charm": 0.018909158343648536,
//     "lambda": 6.48422751576433,
//     "zomma": -0.0955863778447514,
//     "speed": -0.0002836373751547279,
//     "color": 0.008684807091491406,
//     "price": 8.355297299155879,
//     "delta": 0.5417764864957794,
//     "vomma": -2.290571514614832,
// }

// Model: GarmanKohlhagen83 { s: 100.0, r_d: 0.05, r_f: 0.03, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "ultima": -43.59776593173644,
//     "vega": 39.6121492700665,
//     "theta": -4.272756285502488,
//     "lambda": 6.204336819109864,
//     "color": 0.009074941597741354,
//     "charm": 0.01906616295796282,
//     "rho": 52.084231395586315,
//     "vanna": 5.2399933461312134e-17,
//     "zomma": -0.08997722338863051,
//     "price": 9.092954864173855,
//     "gamma": 0.017995444677726104,
//     "delta": 0.5641575465829798,
//     "speed": -0.0003599088935545221,
//     "vomma": -1.1534441205446944e-15,
// }

// Model: Heston93 { s: 100.0, v: 0.05, r: 0.03, q: 0.2, rho: 0.1, kappa: 0.1, theta: 0.1, sigma: 0.1 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "delta": 0.2008452387306263,
//     "gamma": 0.010457662539600598,
//     "price": 2.683032821893125,
//     "rho": 19.152359760630095,
// }

// Model: Bachelier { f: 100.0, r: 0.05, v: 0.2 }
// Option: EuropeanVanillaOption { strike: 100.0, expiry: 2025-12-31, type_flag: Call }
// {
//     "delta": 0.5,
//     "vega": 0.4185313362945294,
//     "gamma": 1.9013503803678706,
//     "atm_price": 0.08370626725890587,
//     "theta": -0.03802700760735742,
//     "price": 0.079224298540133,
// }