Skip to main content

AlphaLens — an event-driven backtesting & walk-forward engine for systematic strategies

Project description

alphalens-core

An event-driven backtesting & walk-forward engine for systematic trading strategies.

Write a strategy as a Python class, run a single forward pass over an in-memory OHLCV feed, and get back an equity curve, a trade log, and a rich set of performance statistics — plus walk-forward analysis, parameter sweeps, and an HTML dashboard. alphalens-core is the open engine behind AlphaLens.

Install

pip install alphalens-core              # core engine (pandas + numpy only)
pip install "alphalens-core[viz]"       # + matplotlib / quantstats dashboard & reports
pip install "alphalens-core[polygon]"   # + Polygon market-data fetching
pip install "alphalens-core[live]"      # + Alpaca execution and Polygon history
pip install "alphalens-core[fast]"      # + pyarrow parquet cache

Quickstart

from alphalens_core import Algorithm, Backtester

class GoldenCross(Algorithm):
    start = "2020-01-01"
    end = "2024-12-31"
    universe = ["SPY"]

    def initialize(self):
        self.set_warmup(50)

    def on_data(self, slice):
        hist = self.history("SPY", 50)["close"]
        if len(hist) < 50:
            return
        self.set_holdings("SPY", 1.0 if hist.tail(10).mean() > hist.mean() else 0.0)

result = Backtester().run(GoldenCross)
print(result.stats)     # Sharpe, Sortino, CAGR, max drawdown, win rate, …
result.dashboard        # inline HTML report in Jupyter, or opens in your browser

Live data needs a POLYGON_API_KEY (a .env / .env.local file is loaded automatically). To run fully offline, inject your own DataFeed.

Live / Alpaca Paper Trading

The live runner uses the same Algorithm class and history API as the backtester. LiveSession.from_cache seeds a bounded rolling history, then each completed Slice is appended before on_data runs:

from alphalens_core import AlpacaBrokerage, LiveSession, NO_BAR
from my_data import next_completed_slice
from my_strategy import MyStrategy

broker = AlpacaBrokerage(paper=True)
session = LiveSession.from_cache(
    MyStrategy,
    brokerage=broker,
    next_bar_fn=next_completed_slice,  # Slice, NO_BAR while idle, None to stop
    history_bars=500,
    state_path=".alphalens/live/my_strategy.json",
)
session.run()

from_cache uses UniverseCache and Polygon by default; inject an existing cache to use another DataSource. The runner:

  • exposes seeded and appended bars through history(), history_array(), and history_arrays();
  • keeps history bounded and suppresses duplicate timestamps;
  • rejects out-of-order bars and unreconciled broker orders;
  • synchronizes Alpaca cash/positions and FIFO lots at startup;
  • respects strategy resolution and warmup settings;
  • checkpoints the last processed bar to avoid replay after restart.

Market-data transport is intentionally separate from execution. A callback must emit completed, consolidated slices for the strategy universe. See alphalens_core.examples.paper_trade for an Alpaca polling example. Live membership changes are not yet supported: the session fails explicitly for dynamic universes until removal orders can be reconciled with broker fills.

Features

  • Event-driven lifecycleinitialize, on_data, on_order_event, on_securities_changed, on_end_of_day, on_warmup_finished.
  • Realistic fills — next-bar execution with pluggable slippage / fee / fill models, and a one-bar look-ahead guard so decisions on bar t can't peek at bar t's close.
  • Walk-forward analysis with per-fold parameter search.
  • Parameter sweeps + PBO (probability of backtest overfitting).
  • Live execution through Alpaca paper/live brokerage with buffered rolling history and restart-safe bar processing.
  • Reportingresult.stats, an HTML result.dashboard, and quantstats reports.

CLI

alphalens run --strategy mymod:MyStrategy
alphalens wfa --strategy mymod:MyStrategy --train 504 --test 63 --step 63
alphalens cache --info

License

Apache-2.0 © AlphaLens LLC

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

alphalens_core-0.3.8.tar.gz (320.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

alphalens_core-0.3.8-py3-none-any.whl (297.3 kB view details)

Uploaded Python 3

File details

Details for the file alphalens_core-0.3.8.tar.gz.

File metadata

  • Download URL: alphalens_core-0.3.8.tar.gz
  • Upload date:
  • Size: 320.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.2

File hashes

Hashes for alphalens_core-0.3.8.tar.gz
Algorithm Hash digest
SHA256 0626a56db9a715e940a5306c5e09c0c6ae0562c3e6ebbdbb7847bdec9d88e43d
MD5 89f478e9ffa6cc37e0fed0fa61828e77
BLAKE2b-256 00cff8eb17f3454a40a97e1ff0a6c904568c3a33d021d00d77c7f64d52d3599d

See more details on using hashes here.

File details

Details for the file alphalens_core-0.3.8-py3-none-any.whl.

File metadata

  • Download URL: alphalens_core-0.3.8-py3-none-any.whl
  • Upload date:
  • Size: 297.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.2

File hashes

Hashes for alphalens_core-0.3.8-py3-none-any.whl
Algorithm Hash digest
SHA256 74fc9277106796bf7b0136e6bb018901622b284062d5467c3d15e028f5d6f243
MD5 5113edd08ce2357244c6313923985bdc
BLAKE2b-256 6f57a29ef1f5302302a273a2b55f997eb3b0ab93bc9d1fd2f31781d131e38758

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page