Polars-native quantitative research platform. All computation executes as Rust-backed Polars expressions with no Python loops in the hot path.
Pre-1.0 development. API is stabilizing but may have breaking changes between minor versions. See CHANGELOG.md.
Elvers covers the full quantitative research workflow:
| Step | Module | Status |
|---|---|---|
| 1. Universe Selection | universe/ |
Planned |
| 2. Data Acquisition | data/providers/ |
Planned |
| 3. Data Storage | data/store.py |
Planned |
| 4. Factor Computation | ops/ |
72 operators |
| 5. Factor Analysis | analysis/ |
Planned |
| 6. Multi-Factor Synthesis | synthesis/ |
Planned |
| 7. Portfolio Construction | portfolio/ |
Planned |
| 8. Backtesting | backtest/ |
Planned |
| 9. Risk Management | risk/ |
Planned |
| 10. Execution | execution/ |
Planned |
| 11. Post-Trade Analysis | execution/post_trade.py |
Planned |
| 12. Monitoring | monitor/ |
Planned |
- Column-based. Factor stores a column name + Panel reference. All data lives in a single Panel DataFrame. Zero intermediate copies, zero hash joins. Same-expression memoization.
- Balanced alignment. Panel guarantees every symbol shares the same timestamp index. Missing values are explicit nulls. Look-ahead bias is prevented by construction.
- Single null semantics. NaN and Inf are converted to null on column creation. One missing-value type eliminates NaN-infection.
pip install elversfrom elvers import load, ts_rank, zscore, signal
panel = load()
close = panel["close"]
alpha = signal(zscore(ts_rank(close, 30)))72 operators. All accept and return Factor.
Time-Series -- per-symbol rolling window:
ts_delay ts_delta ts_mean ts_sum ts_std_dev ts_min ts_max ts_median ts_rank ts_skewness ts_kurtosis ts_zscore ts_corr ts_covariance ts_product ts_step ts_decay_linear ts_decay_exp_window days_from_last_change ts_av_diff ts_scale ts_percentile ts_quantile ts_cv ts_autocorr ts_count_nans ts_backfill kth_element last_diff_value inst_tvr ts_delta_limit ts_regression trade_when
Cross-Sectional -- across symbols at each timestamp:
rank zscore mean median scale normalize quantile signal winsorize truncate left_tail right_tail
Neutralization and Group -- sector/industry control:
vector_neut regression_neut group_neutralize group_rank group_zscore group_scale group_normalize group_mean group_median group_backfill
Math -- element-wise transforms:
log sqrt sign power signed_power inverse s_log_1p maximum minimum where
Arithmetic:
add subtract multiply divide reverse densify bucket and standard operators (+ - * / ** abs)
Full specifications: OPERATORS.md
pip install -e ".[dev]"
pytest tests/ -v
ruff check elvers/
pyright elvers/See CONTRIBUTING.md for the contributor guide.