Stop recomputing OHLCV indicators after every new bar
The Problem
A four-year, 15-minute stock backtest is about 140k bars for one stock. With 50 stocks, that is already around 7 million rows before parameter sweeps. If you are preparing features for a model, it is easy to spend 10 minutes just building the data table before training even starts.
That is the part that kept bothering me. The strategy or model is supposed to be the hard part, but the research loop often gets stuck rebuilding the feature table: RSI, MACD, ATR, Bollinger Bands, and dozens more.
In a live loop or a bar-by-bar backtest, every new OHLCV bar can trigger a full-column recompute even though most of the column is already valid.
The Solution
I built volas for that workflow: keep the OHLCV table familiar, but make indicator refresh cheap.
volas is a Rust-backed Python DataFrame for OHLCV/candlestick pipelines. Indicators are addressed like DataFrame columns:
df["rsi:14"]
df.append(new_bar)
df["rsi:14"] # refreshes only the affected tail
What it gives you
- A pandas-shaped API for market data
- 250+ built-in trading indicators
- Indicator directives as cached columns
- Append/update semantics for live bars
- Rust kernels for the hot paths
- NumPy/Torch output for downstream Python code
Benchmarks
The benchmark suite is public and reproducible:
- Benchmark report: https://volas.ost.ai/
- Benchmark challenge issue: https://github.com/kaelzhang/volas/issues/13
Feedback Request
If you work with live OHLCV pipelines, crypto bots, technical screeners, or ML feature tables, I would be interested in feedback on three things:
- Does the directive API fit how you write indicator pipelines?
- Which indicators or market conventions are still missing?
- Do you have realistic cases where this approach loses to TA-Lib, pandas-ta, or your own implementation?
Comments
No comments yet. Start the discussion.