Reviewed 6 September 2026

Part I: Domains

Markets and financial data

Library Description
yfinance Unofficial client for Yahoo Finance endpoints. No stability guarantee.
Alpha Vantage, Finnhub, EODHD, Tiingo Commercial market data APIs; equities, FX, fundamentals.
Polygon.io, Databento Tick and trade-level market data, including historical order book.
ccxt Unified API across cryptocurrency exchanges, sync and async.
ib_async Interactive Brokers TWS/Gateway API (successor to ib_insync).
OpenBB Open-source aggregation layer over many data providers.
TA-Lib, pandas-ta Technical indicators; C bindings and pure-Python respectively.
VectorBT Vectorized backtesting and portfolio simulation on NumPy arrays.
NautilusTrader Event-driven backtesting and live trading platform; Rust core.
backtesting.py Event-driven backtester with a small API.
QuantLib-Python Derivatives pricing, curve construction, term structures.
PyPortfolioOpt, Riskfolio-Lib Portfolio optimization, risk models, efficient frontiers.
arch GARCH and volatility models, bootstrap methods.
exchange_calendars Trading sessions, holidays and market hours.

Research data store. Vendor APIs → raw JSON archive → normalization → Parquet partitioned by date and symbol → DuckDB

Raw payloads are archived before normalization so the historical record survives changes to the parsing code and vendor re-statements can be detected. Corporate actions and delistings are stored as separate tables and applied at query time, which keeps a point-in-time view available and avoids a universe consisting only of current index members. exchange_calendars aligns bars to real sessions, including half days. Each record carries both the event timestamp and the timestamp at which the data became available; without the second one, no backtest built on the store can be trusted.

Backtesting stack. Parquet feature store → VectorBT parameter sweep → NautilusTrader event-driven validation → arch / PyPortfolioOpt for sizing

The vectorized pass covers wide parameter grids cheaply; the shortlist is then re-run in an event-driven engine that models order types, fills, fees and latency, since vectorized results tend to be optimistic. Signals are computed only from data whose availability timestamp precedes the decision time. Volatility estimates from arch feed position sizing, and results are reported with transaction costs applied.