- combined relabeled 'Crypto momentum book (vestigial trend overlay)': the engine is validated
crypto momentum; the futures-trend leg riding the crypto spine has no edge and never gates.
- Retired eqfactor_long/eqfactor_tilt (US-equity price-factors — weakly-held, edge never
established) + their orphaned shared eqfactor_scores asset. Strategy classes stay in
equity_factor_strategy.py. _seed_registry prunes stale rows automatically.
Cockpit fleet now = 4 tracks: 2 validated crypto edges (xsfunding, unlock) + the crypto-momentum
book + the 60/40 benchmark. 7 Dagster assets. Tests updated (labels + retarget to surviving
tracks); full suite 511 passed, mypy clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Prune the dead/superseded paper tracks: multistrat + gd (futures/TradFi premia — falsified
this session, scale-gated, no deployable edge) + poc (old crypto residual-mom+VRP PoC,
superseded by the two validated edges). Strategy classes stay in paper_strategies.py (shelf).
Removed their assets, registry entries, job/Definitions membership, cockpit_forward deps.
ROOT-CAUSE FIX: _seed_registry() now PRUNES strategy_registry rows absent from the Python
registry — previously it merge-upserted but never deleted, so retired tracks lingered on the
dashboard forever (the stale-funding bug). Retirements now stick automatically.
Fleet now 10 assets / 6 tracks: 3 crypto edges (combined, xsfunding, unlock) + 2 equity-factor
sleeves + 60/40 benchmark. Ingest is registry-driven so leftover state files are safely ignored
(no nightly-run crash risk). Tests updated; full suite 511 passed, mypy clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codebase-wide type-annotation cleanup (5 parallel agents, disjoint file sets): add missing
dict/list type parameters, function param/return annotations, fix no-any-return (float/cast/
typed returns), no-untyped-call cascades (annotate the called fn), untyped-decorator (langchain
@tool ignores), dict-item (widen JSON-column value types to match inserted values). NO runtime
logic, control flow, or values changed — pure typing. Two cosmetic guard tweaks (web/app.py
funnel, always-true added clause for mypy narrowing) behavior-identical.
mypy src/fxhnt: 80 errors -> Success: no issues found in 167 source files.
Full suite 511 passed (zero regressions).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The second uncorrelated edge, found via synthesis + validated. Short insider/investor
vesting-cliff names in the 10 days before the cliff (anticipatory), market-neutral
(short alt perp + long BTC). Driver = supply dilution (NOT leverage) -> corr to funding
+0.010. Data: DefiLlama emissions + CoinGecko (free).
- domain.unlock_shorts: supply_shock (unlock notional / ADV), inverse_vol_capped_weights,
short_leg_pnl with SQUEEZE STOP (floors per-name loss — the short-book killer). 5 tests.
- application.unlock_runner.UnlockShortRunner: full risk stack — per-name inverse-vol
sizing + weight cap + squeeze stop + portfolio vol-target.
Risk management TAMED the naive book: unsized Sharpe 1.26 / -74% DD / DSR 0.852 (FAIL)
-> risk-managed Sharpe 1.4-2.3 / -10 to -13% DD / DSR 0.97-0.999 (PASS), positive every
year incl 2022 bear, corr to funding ~0. The squeeze stop is the high-leverage lever
(tighter stop raises Sharpe AND cuts DD by removing the moon-squeeze fat tail). Even the
un-tuned conservative config passes -> not a parameter-mining artifact.
Per-event proof: +3.38% mkt-neutral, t=6.01 (non-overlapping), monotonic dose-response,
OOS-stable. Caveat: live thin-alt gap-risk through stops; not yet forward-proven.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The paper->micro-live gap for the canonical cross-sectional funding deploy: the only
order tool was crypto_funding_paper.py's cmd_orders for the RETIRED absolute harness.
- domain.cross_sectional_funding.delta_neutral_orders: pure, tested. Signed book ->
delta-neutral legs. w>0 (long top-funding) = BUY spot + SHORT perp (short collects +funding);
w<0 (short bottom) = SELL/borrow spot + LONG perp (long collects -funding). |weight|
iteratively capped at max_weight + renormed to gross 1; notional/leg = w*capital/(1+1/lev)
so spot+perp margin fits capital. Flags coins unhedgeable on Binance (no spot leg).
- CLI xsfunding-orders --capital: reads the LIVE book from tracker state, fetches Binance
spot+perp prices, prints orders for MANUAL execution. Places NOTHING; keys never read;
deploy only after the gate = GO. Verified: gate logic (gate.py) correctly flips WAIT->GO
on min_days+return+Sharpe.
5 new unit tests (leg mapping, capital budget, weight cap, unhedgeable flag, empty book);
suite green, mypy clean on changed lines.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The cockpit ran TWO funding tracks: 'funding' (absolute 5bp-hurdle, long-only, faithful
port of crypto_funding_paper.py) and 'xsfunding' (cross-sectional long-top/short-bottom,
delta-neutral). Investigation (regime-switch backtest) showed the absolute-hurdle variant
sits idle ~60% of days and was flat through 2022, while the cross-sectional construction
harvests funding DISPERSION, trades continuously, and made +71% in the 2022 backtest
(LUNA/FTX deleveraging dispersion). The two were a confusing parallel where the conservative
one masqueraded as the dormant crown jewel.
Retire the absolute 'funding' track (asset funding_nav, registry entry, job membership) and
promote 'xsfunding' as the canonical funding deploy (relabelled 'Crypto funding harvest
(cross-sectional, delta-neutral)'). FundingCarryStrategy stays in paper_strategies.py
(tested, on the shelf) — only the live deploy changes. Tests updated (12 assets now);
full suite 499 passed, mypy clean on changed lines.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The live combined-book forward track was frozen at 2026-06-12. Root cause: build() set
the date axis to crypto INTERSECT futures. Crypto updates daily; futures fetch is
Sunday-only + Databento-lagged, so the track could only reach the last available futures
weekday and stalled between Sunday fetches — gated by the futures trend sleeve we already
proved has no edge.
Fix: book on the CRYPTO date spine (fresh daily); the trend sleeve contributes on days it
has data (0.0 otherwise) and never gates the track. Sharpe-weights and the reported
correlation still use the real crypto-futures overlap, so weighting stays honest. The
forward tracker (append-only, forward-of-last_date) picks up the un-booked crypto days on
the next run and resumes daily advance. Tests 25 passed, mypy clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The ForwardTracker now optionally throttles booked exposure off the live track's own
running drawdown: flatten to 0 once drawdown exceeds kill_dd, re-enter once it recovers
inside reenter_dd. The drawdown SIGNAL tracks shadow (un-throttled) equity so recovery is
observable while flat; the booked NAV reflects the throttled book. No-lookahead (each
day's decision uses prior-day kill-state); state is persisted (shadow_nav/shadow_peak/
killed) and lazy-inits for tracks that predate the switch.
Wired ON in both live entry points via new settings combined_book_kill_dd (0.15) /
combined_book_reenter_dd (0.07): the Dagster combined_forward_nav asset and the
forward-track CLI. Default OFF at the tracker/factory level so existing trackers and
tests are unchanged. Tests 54 passed (incl. new live-killswitch test); mypy clean on
changed lines (pre-existing debt untouched).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
apply_drawdown_killswitch: flatten the book once running drawdown exceeds kill_dd
(default 15%), re-enter only after recovery inside reenter_dd (7%) hysteresis. The
drawdown signal tracks un-throttled equity so recovery is observable while flat; output
is the throttled series; no lookahead (each day uses prior-day kill-state). The small-
capital tail control - survive a crypto-deleveraging by standing down, not by paying for
a hedge sleeve. Pure + composable overlay on combine_book output. Test + mypy green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The correct quality/decay layer the naive Sharpe floor couldn't be. A raw Sharpe
floor benches legitimate anticorrelated hedges (low standalone Sharpe but vol-reducing)
as readily as dead sleeves. marginal_gate (default False) instead benches a sleeve only
when REMOVING it raises the inverse-vol book's trailing per-period Sharpe — so it keeps
hedges (removing them lowers book Sharpe) and benches only dead, non-diversifying
sleeves (removing them raises it). Greedy leave-one-out, shrinks to >=1, pure on the
trailing window (no lookahead).
Verified: anticorrelated hedge pair stays fully invested (book vol ->0 via cancellation,
the case the Sharpe floor broke); a dragging dead sleeve is benched in its clearly-
negative windows. Acts on trailing-window evidence, so a marginally-negative sleeve
within estimation noise is kept (correct). Suite green, mypy clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reusable infra from the diversifier research (the strategies themselves found no
deployable edge on our 22-market panel, but the construction is validated):
- dbn_local.load_curve: front + 2nd-nearby CONTINUOUS series + annualized carry
(log(F1/F2)/gap_years) from parent-symbology outright expiries. Unlocks carry +
basis-momentum without re-reading raw .dbn.
- cta_trend.py / cta_runner.py: literature-grounded managed-futures trend
(vol-normalized risk-adj momentum -> tanh(x/0.89) response -> 1/3/12mo blend ->
inverse-vol -> equal-risk-per-sector budget -> portfolio vol-target -> long/short).
Construction validated (reproduces SG Trend +29% in 2022); premium absent for us
(Sharpe ~0 over 2010-26 on 22 markets, ends mid-historic-drawdown).
- book_allocator: OPTIONAL edge-quality gate (min_sleeve_sharpe, default None=OFF) to
bench dead/decaying sleeves so they can't be levered up by the vol-target. Off by
default because a naive Sharpe floor also benches legitimate anticorrelated hedges;
a correct quality/decay layer is future work. Suite green, mypy clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>