binomial_tree 0.5.0

A generic binomial pricing tree for options
Documentation
#[macro_use]
extern crate criterion;
extern crate black_scholes;

use criterion::{Criterion, ParameterizedBenchmark};
fn bench_black_scholes_american(c: &mut Criterion) {
    let r=0.03;
    let sig=0.3;
    let s0=50.0 as f64;
    let maturity=1.0;
    let strike=50.0;
    let alpha_div_sigma=move |_t:f64, _underlying:f64, _dt:f64, _width:usize| r/sig;
    let sigma_pr=move |_t:f64, _underlying:f64, _dt:f64, _width:usize| sig;
    let sigma_inv=move |_t:f64, x:f64, _dt:f64, _width:usize| (x*sig).exp();
    let py_off=move |_t:f64, underlying:f64, _dt:f64, _width:usize| if strike<underlying {underlying-strike} else {0.0};
    let disc=move |_t:f64, _underlying:f64, dt:f64, _width:usize| (-r*dt).exp();
    c.bench("compare binomial and black scholes",
        ParameterizedBenchmark::new(
            "black scholes",
            move |b, _i|{
                b.iter(|| {
                    black_scholes::call(s0, strike, r, sig, maturity)
                })
            },
            vec![100, 500, 1000]
        ).with_function("binomial", move |b, i|{
            b.iter(||{
                binomial_tree::compute_price_american(
                    &alpha_div_sigma,
                    &sigma_pr,
                    &sigma_inv,
                    &py_off,
                    &disc,
                    s0.ln()/sig,
                    maturity,
                    *i
                )
            });
        })
    );
}

criterion_group!(benches, bench_black_scholes_american);
criterion_main!(benches);