Our entry for SIG ALGOTHON 2026 (Susquehanna × UNSW FinTech Society): a
multi-sleeve book on the competition’s synthetic multi-asset panel
(51 instruments, 1500 daily prices in prices.txt). Each day the strategy
returns an integer share vector from getMyPosition(prcSoFar).
Implementation: devtokens.py.
Constant provenance: STRATEGY.md.
Charts over days 1–1500: analysis/figures/.
The book is a blend of several edges, not a single signal. Confidence in ([-1, 1]) is built per name, converted to dollars under position limits, then augmented with cointegration overlays.
Yesterday’s cross-sectional return vector is mapped through a ridge regression
matrix (B) to forecast today’s returns. (B) is refit periodically, shrunk
toward a low-rank factor structure, and smoothed against the previous fit.
Signals are tilted toward low-vol / high in-sample (R^2) names. This sleeve
carries most of the weight (W_LL ≈ 0.75) and most of the measured edge.
Remove the top two PCA factors from recent returns, then fade each name’s
idiosyncratic residual z-score over a ~20-day window. The idea: after common
moves are stripped out, residuals mean-revert over multi-week horizons. This
is the main diversifier to lead-lag (W_RESID ≈ 0.25).
Smaller sleeves add information that is explicitly residualised against lead-lag (so they don’t just restate the same forecast):
- short-horizon momentum (10d / 20d)
- fade of yesterday’s lead-lag forecast error
- fade of 60-day name returns
- fade of price vs a 100-day moving average
After the blend is demeaned, an equal-weight index momentum tilt adds
intentional net long/short market exposure (asymmetric on up days). Positions
are then scaled by inverse EWMA volatility before mapping confidence →
shares via a capital multiplier (ALLOC).
On top of the share map:
- ALGO hub pairs — Engle–Granger spreads of instrument 0 vs other names
- Broader pairs — rolling discovery of non-ALGO cointegrated pairs, faded when the spread is stretched
- High-hit pairs — a small frozen set of historically reliable spreads that get extra size when (|z|) is large
ALGO (the high-limit name) uses a hysteresis deadband so small target changes don’t churn the large book. A finals-period trend floor can also nudge historically strong up-names when history exceeds 1000 days.
returns → lead-lag B + residual MR + orthog fades
→ demean → index tilt → inv-vol → shares
→ + coint pairs / HH → ALGO hysteresis → positions
| Path | Role |
|---|---|
devtokens.py |
Live strategy (getMyPosition) |
eval.py |
Local backtest on prices.txt |
STRATEGY.md |
Architecture + where each constant came from |
analysis/ |
Figure generator + charts for days 1–1500 |
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txt
python3 eval.py # run the day-loop backtest
python3 analysis/generate_figures.py # refresh analysis/figures/