Commit History
-
feat: default ingest to Yahoo and restore a full README
Edwin Salguero +1: CursorUse Yahoo Finance as the default tape for config, CLI, Gradio, and UIs; fail closed instead of silently simulating. Merge the algotrader 2.0 lab docs with the v1 FinRL/agentic README and drop the Northwestern line. Co-authored-by: Cursor <cursoragent@cursor.com>3d257f3 -
Add multi-asset portfolio support with a cross-sectional null
ClaudeUnverified signatureSingle-asset backtesting caps this at hobbyist use: anyone doing real cross-sectional work (rank N names, long the top decile, short the bottom) could not express their strategy at all. This adds the portfolio path. Panel (algotrader/panel.py): aligned T x N field frames with per-symbol provenance. Missing data deliberately stays missing — forward-filling a symbol through days it did not trade invents liquidity and lets a strategy hold a delisted name forever. That choice is what makes survivorship measurable, and Panel.survivorship() reports it: a universe where every name still trades after a decade was chosen after the fact, and the Reality Score now caps at 60 when it finds one. Matrix engine (algotrader/portfolio.py): T x N weights with drift-aware turnover. Hold 50% of a book in a name that doubles and you are at 67% without trading, so charging |target[t] - target[t-1]| understates the cost of doing nothing. Turnover is measured against the drifted weight instead. A rebalance …2d2e42a -
Add algotrader 2.0: a backtester that tries to prove itself wrong
ClaudeUnverified signatureMost backtesting tools answer "how much would this have made?". This adds a second, harder question: how much of that was luck? New `algotrader` package (additive — v1's agentic_ai_system, its tests, CI and Docker setup are untouched): - engine.py: vectorised backtester with an explicit no-look-ahead contract. A strategy emits a target exposure at bar t's close; the engine holds position[t] = target[t - lag] with lag >= 1, so a signal computed on a bar cannot earn that bar's move. Costs are charged on exposure changes, plus a borrow fee on shorts. - validation/: the point of the release. - permutation.py — Monte-Carlo permutation test. Shuffles bar order while preserving each bar's anatomy, then re-runs the same rule on hundreds of structure-free markets. Block-bootstrap mode preserves vol clustering. - deflated_sharpe.py — Bailey & Lopez de Prado's PSR/DSR, charging for every parameter variant tried and for skew and fat tails. - pbo.py — probability of back…3339913