OpenQuant Docs banner
OpenQuant icon openquant-rs / documentation terminal

Examples by Subject

Examples follow the same five subject dividers used in the index, subjects, and API pages.

1. Event-Driven Data and Labeling

use chrono::NaiveDateTime;
use openquant::filters::{cusum_filter_timestamps, Threshold};
use openquant::labeling::{add_vertical_barrier, get_bins, get_events};
use openquant::util::volatility::get_daily_vol;

let close: Vec<(NaiveDateTime, f64)> = /* timestamped close series */;
let prices: Vec<f64> = close.iter().map(|(_, p)| *p).collect();
let timestamps: Vec<NaiveDateTime> = close.iter().map(|(ts, _)| *ts).collect();

let events = cusum_filter_timestamps(&prices, ×tamps, Threshold::Scalar(0.02));
let target = get_daily_vol(&close, 100);
let barriers = add_vertical_barrier(&events, &close, 1, 0, 0, 0);

let labeled_events = get_events(
    &close,
    &events,
    (1.0, 1.0),
    &target,
    0.005,
    3,
    Some(&barriers),
    None,
);
let labels = get_bins(&labeled_events, &close);

2. Sampling, Validation and ML Diagnostics

use openquant::sampling::seq_bootstrap;
use openquant::cross_validation::{ml_cross_val_score, PurgedKFold, Scoring};

let ind_mat = vec![vec![1, 0, 1], vec![0, 1, 1], vec![1, 1, 0]];
let boot = seq_bootstrap(&ind_mat, Some(3), None);

// Use PurgedKFold and ml_cross_val_score with your classifier implementation.
let _ = (boot, Scoring::NegLogLoss);

3. Position Sizing and Trade Construction

use openquant::bet_sizing::bet_size_probability;
use chrono::NaiveDateTime;

let ts0 = NaiveDateTime::parse_from_str("2024-01-01 09:30:00", "%Y-%m-%d %H:%M:%S")?;
let ts1 = NaiveDateTime::parse_from_str("2024-01-01 16:00:00", "%Y-%m-%d %H:%M:%S")?;
let events = vec![
    (ts0, ts1, 0.55, 1.0),
    (ts0, ts1, 0.62, 1.0),
    (ts0, ts1, 0.48, -1.0),
];
let size = bet_size_probability(
    &events,
    2,
    0.1,
    false,
);

4. Portfolio Construction and Risk

use nalgebra::DMatrix;
use openquant::portfolio_optimization::{
    allocate_max_sharpe, allocate_min_vol, AllocationOptions, ReturnsMethod
};

let prices: DMatrix<f64> = /* rows=time, cols=assets */;
let min_vol = allocate_min_vol(&prices, None, None)?;
let max_sharpe = allocate_max_sharpe(&prices, 0.0, None, None)?;

let opts = AllocationOptions {
    returns_method: ReturnsMethod::Exponential { span: 50 },
    ..Default::default()
};
let exp_weighted = openquant::portfolio_optimization::allocate_inverse_variance_with(&prices, &opts)?;

5. Market Microstructure, Dependence and Regime Detection

use openquant::risk_metrics::RiskMetrics;
use openquant::microstructural_features::get_roll_measure;
use openquant::structural_breaks::get_sadf;

let returns = vec![-0.015, 0.007, 0.011, -0.006, 0.004];
let var_95 = RiskMetrics::calculate_value_at_risk(&returns, 0.05)?;
let es_95 = RiskMetrics::calculate_expected_shortfall(&returns, 0.05)?;
let spread = get_roll_measure(&[100.0, 100.2, 100.1, 100.3], 2);
let _ = (es_95, var_95, spread);
// get_sadf(...) is typically run on longer time series with explicit lag config.

Example Design Principles

  • Prefer deterministic fixture-backed experiments for comparisons.
  • Separate exploratory notebooks from committed regression tests.
  • Track benchmark and numerical tolerance drift explicitly in PRs.