alpaca-option 0.29.0

Provider-neutral option semantics and math for the alpaca-rust workspace
Documentation
use crate::DEFAULT_RISK_FREE_RATE;

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct RiskFreeRatePoint {
    pub years: f64,
    pub rate: f64,
}

pub const DEFAULT_RISK_FREE_RATE_CURVE: [RiskFreeRatePoint; 14] = [
    RiskFreeRatePoint {
        years: 1.0 / 12.0,
        rate: 0.0370,
    },
    RiskFreeRatePoint {
        years: 1.5 / 12.0,
        rate: 0.0370,
    },
    RiskFreeRatePoint {
        years: 2.0 / 12.0,
        rate: 0.0371,
    },
    RiskFreeRatePoint {
        years: 3.0 / 12.0,
        rate: 0.0380,
    },
    RiskFreeRatePoint {
        years: 4.0 / 12.0,
        rate: 0.0379,
    },
    RiskFreeRatePoint {
        years: 6.0 / 12.0,
        rate: 0.0383,
    },
    RiskFreeRatePoint {
        years: 1.0,
        rate: 0.0385,
    },
    RiskFreeRatePoint {
        years: 2.0,
        rate: 0.0415,
    },
    RiskFreeRatePoint {
        years: 3.0,
        rate: 0.0421,
    },
    RiskFreeRatePoint {
        years: 5.0,
        rate: 0.0429,
    },
    RiskFreeRatePoint {
        years: 7.0,
        rate: 0.0442,
    },
    RiskFreeRatePoint {
        years: 10.0,
        rate: 0.0456,
    },
    RiskFreeRatePoint {
        years: 20.0,
        rate: 0.0505,
    },
    RiskFreeRatePoint {
        years: 30.0,
        rate: 0.0503,
    },
];

pub fn risk_free_rate_for_years(years: f64) -> f64 {
    if !years.is_finite() {
        return DEFAULT_RISK_FREE_RATE;
    }

    let first = DEFAULT_RISK_FREE_RATE_CURVE[0];
    if years <= first.years {
        return first.rate;
    }

    for window in DEFAULT_RISK_FREE_RATE_CURVE.windows(2) {
        let left = window[0];
        let right = window[1];
        if years <= right.years {
            let span = right.years - left.years;
            let weight = (years - left.years) / span;
            return left.rate + (right.rate - left.rate) * weight;
        }
    }

    DEFAULT_RISK_FREE_RATE_CURVE[DEFAULT_RISK_FREE_RATE_CURVE.len() - 1].rate
}