Loadingβ¦
No run selected.
Configure a run on the left and press Run backtest. A 300-name synthetic run takes well under a minute.
Model fund the model invests on its own
Your holdings
Analytics
If the model had $10,000
Holdings
A paper record, not a broker. Nothing is ordered β quantities and entry prices are what you told it, valued at the latest price. No costs, tax or slippage are applied.
Live forecast record
Every time you run qsm update, that day's forecasts are written down.
Once the horizon elapses the real outcome is joined on. This is the model's record on
predictions whose answers were genuinely unknown when it made them β the backtest
numbers elsewhere are replays.
Update history
cd /Users/Johnny/quant-stock-model .venv/bin/qsm update --universe sp500
Display
Live prices
Polling pauses automatically while this tab is in the background.
Run defaults
These pre-fill the New run panel. Changing them here does not re-run anything.
Account & environment
This runs entirely on your machine β there is no account, no login and no data leaves your computer except the price requests to the data provider.
What the model did
Console
Nothing running.
Live feed
Daily adjusted prices from Yahoo β no API key or account needed. Downloads are cached for 12 hours; tick Force refresh under Advanced settings to pull fresh bars.
What the numbers mean
- IC (information coefficient)
- Daily rank correlation between the forecast and what actually happened. This is the cleanest read on forecast quality because it does not depend on how you build the portfolio. 0.01β0.03 is a real signal. Above 0.15 on daily data is almost always a bug β start with the null test.
- IC t-stat
- Whether that IC is distinguishable from zero. Below about 2, you have not found anything, regardless of how good the equity curve looks.
- Sharpe before vs after costs
- The gap is what trading costs you. A signal that only works before costs is not a strategy. Raise the cost slider until it breaks β that tells you the real margin.
- Turnover
- Fraction of the book traded per day. High turnover against a thin edge is a donation to your broker.
- Max drawdown
- Peak-to-trough loss. The number that actually ends strategies, since it determines whether you are still holding the position when it recovers.
Why the null test matters
Backtest bugs almost always produce good-looking results, so a strong number is weak evidence on its own. The null test runs the whole pipeline on data containing no signal at all, where the correct answer is βnothing.β Run it after any change you make to features or labels. If it passes, you did not introduce lookahead.
Known limitations
- Survivorship bias β including on the live feed. A price API tells you what companies trading today did in the past. It cannot tell you which names were in the index in 2016 and have since been delisted, and the preset universes are lists of firms prominent now. Every backtest here is therefore optimistic. Fresher prices do not fix this; point-in-time constituent data (CRSP, Compustat, Sharadar) does, and it is not free.
- Stale data on the archives. Kaggle coverage ends 2017 (huge) or 2020 (jackson). The live source runs to the last close.
- No sector neutrality. The book can concentrate in one sector, so some apparent alpha may be an uncompensated factor tilt.
- Simplified costs. A flat per-notional charge. Real costs include the spread, market impact, borrow fees, and names you simply cannot short.
- Multiple testing. Every knob you turn while watching the result spends some of the sample's validity. The walk-forward is honest per run; it cannot protect you from picking the best of fifty runs.