Backtesting Overview

The tick-by-tick simulation engine

Horizon’s backtest engine runs the same 7-layer pipeline as live trading, only the data source changes. You write a Strategy, pass it to hz.run(mode="backtest", ...) with a DataSource, and get back a BacktestResult with equity curve, trade log, Sharpe, Sortino, and max drawdown.

The promise

What runs every tick

Quick start

python
import horizon as hz
from horizon.asset_classes import AssetClass, Equity
from horizon.data import SyntheticGBM
from horizon.discovery import StaticUniverse
from horizon.discovery.base import Market
from horizon.portfolio import KellyOptimizer
from horizon.quant import TSMomentum
from horizon.risk import RiskProfile

result = hz.run(
    mode="backtest",
    strategies=[TSMomentum(lookback=20)],
    asset_classes=[Equity],
    universe=StaticUniverse([
        Market(id=t, asset_class=AssetClass.Equity)
        for t in ["AAPL", "MSFT", "NVDA"]
    ]),
    portfolio=KellyOptimizer(kelly_fraction=0.25),
    risk=RiskProfile.moderate(),
    data_source=SyntheticGBM(["AAPL", "MSFT", "NVDA"], n_bars=252, seed=42),
    backtest=hz.BacktestConfig(initial_cash_usd=100_000),
)

print(f"Sharpe: {result.sharpe:+.3f}")
print(f"Max DD: {result.max_drawdown:.2%}")

Deep-dive pages

Zero-dependency core

The backtest engine is pure stdlib Python (plus optional numpy for some paths). You can run the full 163-test suite and a realistic backtest without installing pandas, cvxpy, or any broker SDK.

Optional heavyweight features are gated behind install groups:

  • horizon[research]: jupyter, plotly, quantstats, empyrical
  • horizon[ml]: scikit-learn, lightgbm
  • horizon[opt]: cvxpy, pypfopt, riskfolio-lib