MLOps for quant research isn't MLOps for ML
Why the MLOps vocabulary you know doesn't quite fit when the model trades.
Short pieces on how I think about research-engineering for systematic trading. Practical, opinionated, sized for an evening's commute.
Read these three in order for a quick orientation to how this site thinks about research-engineering for systematic trading.
Why the MLOps vocabulary you know doesn't quite fit when the model trades.
How to pick the smallest research-data architecture that fits your team's current size — and when to upgrade.
Why the 3–4 promises a quant makes before going to production matter more than how the framework enforces them.
Why the pairwise rule's 'low correlation predicts stack' needs a sign qualifier — and how the empirical surface of anti-correlated parents differs from low-positive-correlation parents.
Why composing two winning strategies on the same data can produce a result worse than either alone, and how to read 'interferes' as evidence about what mechanism a strategy is actually using.
The six concrete steps for taking an event-aware idea from hypothesis to defensible-cost strategy on the alphakernel platform.
Why the 'gate on change, not level' fix didn't work, and what this tells us about the mismatch between per-symbol vol filtering and cross-sectional momentum on this synthetic.
The two bars a risk gate must clear before it earns shelf space in the platform — and how to run the cheap experiment that tells you which bar (if any) it cleared.
Why the sign of `drift − reversal` is the cleanest counterfactual for asking whether a post-event regime is continuation- or reversion-flavored, and what it doesn't tell you.
How each of the 27 harness arms ranks on dual-signal data at N=100, and how the dual-signal rankings differ from the single-signal rankings of PR #759.
Why composite-strategies-can-interfere flips to composite-strategies-stack when the data has multiple independent alpha sources, and what it means for real-data deployment.
Why composites that didn't stack on single-signal data at N=100 DO stack on dual-signal data, and what the small magnitude tells us about how much independent alpha is available to compose.
Why an event-aware capture wrapper's edge depends on how concentrated the post-event signal is, not just on the signal existing in the data.
Why an event-flatten gate underperforms its own baseline when the data generator gives the event a directional edge — and what the three arms (baseline, gate, gate's inverse) need to read together to find out.
What the full N=50 leaderboard reveals about each arm's role on this synthetic, and why the previously-named 'top arms' shift in ranking at higher seed counts.
Why the first composite-arm result to beat baseline at N=10 reverted to a tie at N=50, and what this confirms about the discipline rule of trusting only multi-seed-survivable claims.
Why each additional moment in a cross-sectional score brings noise faster than it brings signal, and how the strategy catalog's weight magnitudes compensate.
The end-to-end workflow for adding a strategy to the comparison harness, running multi-seed dispersion, exporting CSV, computing pairwise correlation, and reading the answer through ADR-0060's discipline rules.
What an N=100 run adds over N=50: tighter means, narrower disagreements between arms, and clearer identification of arms that are statistically identical.
Why moving from per-symbol to cross-symbol intervention recovered most of the Sharpe lost by the per-symbol filter variants, and what this confirms about the intervention-point discipline rule.
Why long-only momentum has higher per-seed Sharpe variance than long-short momentum on the same data, and what that means for operators with no-short mandates.
Why the pairwise per-seed correlation matrix is a stronger predictor of composite stack-vs-interfere outcome than the headline mean Sharpe, and how to read the matrix.
Why composite-interferes outcomes correspond to pairwise correlation of 1.0 between parent and composite, and how the correlation matrix is the cheapest pre-test for composite-stack-or-interfere predictions.
Why a single property-based test over the family of event-aware wrappers caught a citation-contract bug that three independent per-strategy tests had missed.
Why pairwise correlation alone is insufficient in the +0.5 to +0.8 band — the parents' relationship (same-quantity vs different-quantity) matters as much as the correlation magnitude.
Why scaling `gross_leverage` doesn't change a strategy's Sharpe — and why that makes Sharpe a bad metric for comparing strategies with different risk budgets.
Why composing two strategies with different but ALIGNED edges stacks, while composing two strategies with different but OPPOSING edges interferes — and how to read this from the strategies' shape before running the harness.
Why some findings need regression tests while others don't, and how the six tests in the test_example_fomc_blackout_compare.py file form a coherent corpus.
Why a single-factor strategy with a chop filter outperformed a four-factor strategy without one, on the same synthetic data, across 5 seeds.
Why a strategy that matches its baseline exactly on synthetic data is informative — it tells you what problem your data lacks, not just what the strategy doesn't do.
Why measuring a risk-reduction gate against its inverse on the same data tells you something the two-arm version structurally can't.
Why an attempt to write a regression test pinning vol_regime_filter's clustered-vol failure mode discovered that the failure mode itself was N=3 noise — and what this teaches us about which research notes need re-running at higher N.
Why the panel clock and the event clock need the same point-in-time discipline but different feature shapes, and the minimum surface that makes both work in one platform.
Why baseline × ma_crossover stacks where other +0.7-correlated composites might not — and what this teaches about which 'marginal' composites materialise as actual stacks.
What the full 28-arm pairwise correlation matrix shows: the dormancy clusters that group with baseline, the diagnostic-arm anti-correlations, and the three lowest-correlation pairs the matrix flags as composite candidates.
The complete pairwise-rule decision procedure — what to check before proposing a composite, what each check rules out, and why same-stage / sign-preserving / decorrelated all matter.
Why score-stage composition of decorrelated parents stacked where mixed-stage composition of higher-correlation parents interfered, and what this confirms about the pairwise rule as a pre-test.
Why a single-seed backtest leaderboard is a sample of one, why the leader you read off it is more often a high-stdev arm having a good day than the actual best arm, and what reading the multi-seed sweep changes.
The twenty-nine strategies currently registered in alphakernel, how they share the cross-sectional ranking machinery, and how they decompose along the panel-clock × event-clock axis.
Why combining short / medium / long momentum windows beats picking any single window, even with naive weights — and what the negative short-term coefficient is doing.
Why three different per-symbol vol-intervention shapes (filter/transition-filter/penalty) all underperform baseline on this synthetic, and what the cluster of negative results tells us about where the next experiment should go.
Why the vol-regime gate fails on the very signal it was designed to detect, and what this tells us about the difference between 'mean-reverting threshold gates' and 'persistent-state classifiers'.
Why second-order volatility (vol-of-vol) carries information that vol_20 alone doesn't, and how to use it as a regime gate.
Why the vol_5/vol_60 ratio is more useful than vol_5 or vol_60 alone for cross-sectional regime classification, and how to use it as a gate.
Why a regime gate that wins on mean Sharpe across seeds can simultaneously be a worse choice for operators with bounded drawdown tolerance, and how to read the trade-off.
A navigable index of the four load-bearing claims the 19-arm A/B harness produced this session — what was measured, where each claim is documented, and what the open questions are for real-data deployment.
Eight load-bearing claims this session's harness work surfaced — four from the original summary, four new — and the load-bearing discipline rules each one supports.
Eleven load-bearing claims this session's harness work produced — eight from v2, three added since — and the discipline rules each supports.
Twelve load-bearing claims this session's harness work produced — eight from v2, three from v3, one new — and the four regression tests + ADR-0062 that pin them against future drift.
Why per-symbol time-series-momentum with an absolute return threshold outperforms cross-sectional ranking on single-signal data, and what this tells us about the entry-rule design axis.
What the platform owes an AI agent — and what it owes the operator who runs it.
Why audit-readiness is a shape decision — the columns you put on every decision-row — not a feature flag you flip on under regulatory pressure.
Why typed refusals — slugs like `no_state_root`, not prose — are the part of a tool surface that decides whether an agent can plan.
Why every discovery method should refuse its own unbounded version, and what 'bounded' actually means once you write the spec down.
Why writing the same citation pattern through every layer is the thing that lets agents, sandboxes, and live trades share one audit story.
Why structural-impossibility (a gate) beats human-reaction (a dashboard) for data validation.
A concrete checklist for catching point-in-time leaks before they reach production.
The three dashboards every traded model should answer — and why they shouldn't share owners.
Forward edges from `cites:` frontmatter (validated at build time). Reverse edges are the same data, indexed by target — read across the row to follow a thesis backward.