1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
//! # blackscholes
//! This library provides an simple, lightweight, and efficient (though not heavily optimized) implementation of the Black-Scholes-Merton model for pricing European options.
//!
//! Provides methods for pricing options, calculating implied volatility, and calculating the first, second, and third order Greeks.
//!
//! Example:
//! ```
//! use blackscholes::{Inputs, OptionType, pricing::Pricing};
//! let inputs = Inputs::new(OptionType::Call, 100.0, 100.0, None, 0.05, 0.2, 20.0/365.25, Some(0.2));
//! let price: f32 = inputs.calc_price().unwrap();
//! ```
//!
//! See the [Github Repo](https://github.com/hayden4r4/blackscholes-rust/tree/master) for full source code. Other implementations such as a [npm WASM package](https://www.npmjs.com/package/@haydenr4/blackscholes_wasm) and a [python module](https://pypi.org/project/blackscholes/) are also available.
mod common;
mod constants;
pub mod greeks;
pub mod implied_volatility;
pub mod pricing;
pub use greeks::Greeks;
pub use implied_volatility::ImpliedVolatility;
pub use pricing::Pricing;
use std::fmt::{Display, Formatter, Result as fmtResult};
/// The type of option to be priced.
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum OptionType {
Call,
Put,
}
impl Display for OptionType {
fn fmt(&self, f: &mut Formatter) -> fmtResult {
match self {
OptionType::Call => write!(f, "Call"),
OptionType::Put => write!(f, "Put"),
}
}
}
/// The inputs to the Black-Scholes-Merton model.
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Inputs {
/// The type of the option (call or put)
pub option_type: OptionType,
/// Stock price
pub s: f32,
/// Strike price
pub k: f32,
/// Option price
pub p: Option<f32>,
/// Risk-free rate
pub r: f32,
/// Dividend yield
pub q: f32,
/// Time to maturity in years
pub t: f32,
/// Volatility
pub sigma: Option<f32>,
}
/// Methods for calculating the price, greeks, and implied volatility of an option.
impl Inputs {
/// Creates instance ot the `Inputs` struct.
/// # Arguments
/// * `option_type` - The type of option to be priced.
/// * `s` - The current price of the underlying asset.
/// * `k` - The strike price of the option.
/// * `p` - The dividend yield of the underlying asset.
/// * `r` - The risk-free interest rate.
/// * `q` - The dividend yield of the underlying asset.
/// * `t` - The time to maturity of the option in years.
/// * `sigma` - The volatility of the underlying asset.
/// # Example
/// ```
/// use blackscholes::{Inputs, OptionType};
/// let inputs = Inputs::new(OptionType::Call, 100.0, 100.0, None, 0.05, 0.2, 20.0/365.25, Some(0.2));
/// ```
/// # Returns
/// An instance of the `Inputs` struct.
pub fn new(
option_type: OptionType,
s: f32,
k: f32,
p: Option<f32>,
r: f32,
q: f32,
t: f32,
sigma: Option<f32>,
) -> Self {
Self {
option_type,
s,
k,
p,
r,
q,
t,
sigma,
}
}
}
impl Display for Inputs {
fn fmt(&self, f: &mut Formatter) -> fmtResult {
writeln!(f, "Option type: {}", self.option_type)?;
writeln!(f, "Stock price: {:.2}", self.s)?;
writeln!(f, "Strike price: {:.2}", self.k)?;
match self.p {
Some(p) => writeln!(f, "Option price: {:.2}", p)?,
None => writeln!(f, "Option price: None")?,
}
writeln!(f, "Risk-free rate: {:.4}", self.r)?;
writeln!(f, "Dividend yield: {:.4}", self.q)?;
writeln!(f, "Time to maturity: {:.4}", self.t)?;
match self.sigma {
Some(sigma) => writeln!(f, "Volatility: {:.4}", sigma)?,
None => writeln!(f, "Volatility: None")?,
}
Ok(())
}
}