Files
ferro-ta/src/options/realized_vol.rs
T
Pratik BhadaneandGitHub 3e0f289d51 chore: update ferro-ta version to 1.1.3 (#8)
- Bumped version numbers across Cargo.toml, Cargo.lock, pyproject.toml, and conda/meta.yaml to 1.1.3.
- Added new features including American option pricing, digital options, extended Greeks, and historical volatility estimators.
- Enhanced documentation and tests for new functionalities.
- Updated CHANGELOG.md to reflect changes for version 1.1.3.
2026-04-02 16:38:32 +05:30

116 lines
3.2 KiB
Rust

use numpy::{IntoPyArray, PyArray1, PyReadonlyArray1};
use pyo3::prelude::*;
use ferro_ta_core::options::realized_vol as core;
#[pyfunction]
#[pyo3(signature = (close, window, trading_days = 252.0))]
pub fn close_to_close_vol<'py>(
py: Python<'py>,
close: PyReadonlyArray1<'py, f64>,
window: usize,
trading_days: f64,
) -> PyResult<Bound<'py, PyArray1<f64>>> {
Ok(core::close_to_close_vol(close.as_slice()?, window, trading_days).into_pyarray(py))
}
#[pyfunction]
#[pyo3(signature = (high, low, window, trading_days = 252.0))]
pub fn parkinson_vol<'py>(
py: Python<'py>,
high: PyReadonlyArray1<'py, f64>,
low: PyReadonlyArray1<'py, f64>,
window: usize,
trading_days: f64,
) -> PyResult<Bound<'py, PyArray1<f64>>> {
Ok(
core::parkinson_vol(high.as_slice()?, low.as_slice()?, window, trading_days)
.into_pyarray(py),
)
}
#[pyfunction]
#[pyo3(signature = (open, high, low, close, window, trading_days = 252.0))]
#[allow(clippy::too_many_arguments)]
pub fn garman_klass_vol<'py>(
py: Python<'py>,
open: PyReadonlyArray1<'py, f64>,
high: PyReadonlyArray1<'py, f64>,
low: PyReadonlyArray1<'py, f64>,
close: PyReadonlyArray1<'py, f64>,
window: usize,
trading_days: f64,
) -> PyResult<Bound<'py, PyArray1<f64>>> {
Ok(core::garman_klass_vol(
open.as_slice()?,
high.as_slice()?,
low.as_slice()?,
close.as_slice()?,
window,
trading_days,
)
.into_pyarray(py))
}
#[pyfunction]
#[pyo3(signature = (open, high, low, close, window, trading_days = 252.0))]
#[allow(clippy::too_many_arguments)]
pub fn rogers_satchell_vol<'py>(
py: Python<'py>,
open: PyReadonlyArray1<'py, f64>,
high: PyReadonlyArray1<'py, f64>,
low: PyReadonlyArray1<'py, f64>,
close: PyReadonlyArray1<'py, f64>,
window: usize,
trading_days: f64,
) -> PyResult<Bound<'py, PyArray1<f64>>> {
Ok(core::rogers_satchell_vol(
open.as_slice()?,
high.as_slice()?,
low.as_slice()?,
close.as_slice()?,
window,
trading_days,
)
.into_pyarray(py))
}
#[pyfunction]
#[pyo3(signature = (open, high, low, close, window, trading_days = 252.0))]
#[allow(clippy::too_many_arguments)]
pub fn yang_zhang_vol<'py>(
py: Python<'py>,
open: PyReadonlyArray1<'py, f64>,
high: PyReadonlyArray1<'py, f64>,
low: PyReadonlyArray1<'py, f64>,
close: PyReadonlyArray1<'py, f64>,
window: usize,
trading_days: f64,
) -> PyResult<Bound<'py, PyArray1<f64>>> {
Ok(core::yang_zhang_vol(
open.as_slice()?,
high.as_slice()?,
low.as_slice()?,
close.as_slice()?,
window,
trading_days,
)
.into_pyarray(py))
}
/// Returns a list of (window, min, p25, median, p75, max) tuples.
#[allow(clippy::type_complexity)]
#[pyfunction]
#[pyo3(signature = (close, windows, trading_days = 252.0))]
pub fn vol_cone(
close: PyReadonlyArray1<'_, f64>,
windows: Vec<usize>,
trading_days: f64,
) -> PyResult<Vec<(usize, f64, f64, f64, f64, f64)>> {
let slices = core::vol_cone(close.as_slice()?, &windows, trading_days);
Ok(slices
.into_iter()
.map(|s| (s.window, s.min, s.p25, s.median, s.p75, s.max))
.collect())
}