Auditable alpha research, built to falsify itself.
A compact autonomous research framework for causal factor synthesis, neutral portfolio evaluation, multiple-testing correction, and decision-focused ranking— without broker access or automatic strategy promotion.
The live record, redrawn every day
A frozen specification (dea0e608) holds the single best-ranked eligible name
and rotates every session. Fetching, selection, scoring and redrawing all run on a GitHub
runner from public data, so a reader can rerun it and reach the same name. A separate job
re-fetches the index series and fails if any committed benchmark return no longer matches
its source; it writes nothing, because a verifier that can rewrite the file it verifies is
not a verifier.
Two records run and answer different questions: this one-name, one-session rotation
published in advance, and a ten-name, ten-session record (b19bbc74,
c0768449) carrying the four factors that survived the 456-candidate search.
The dashed, shaded span on the left proves nothing, and it is drawn that way on purpose. Those four factors were chosen from a 456-candidate search whose data overlaps that window, and on this panel the selection step alone is worth about 3 bps per day — more than most published equity-factor results. An in-sample curve that beats every index is what a selected strategy always looks like.
Only the solid span to the right of the divider is evidence, it begins the day the specification was frozen, and at the start there is almost none of it. The strategy line is a raw return net of realised cost so that it is comparable to an index; the excess line answers a different question and is labelled separately, because plotting an excess against a raw index is the oldest trick in the genre.
The name is published before the session it applies to. Each evening the frozen specification selects one name from roughly 4,700 eligible, and it is committed here with a timestamp, at the top-right of the chart, before that market opens. A record scored afterwards always invites the question of whether the rule moved once the outcome was visible. One committed in advance cannot: it can be shown to be wrong, but never edited. The file is append-only — next_pick.json, published_picks.jsonl, rotation.jsonl.
Research only. This is a record of what a frozen rule selected, published to test that rule in public. It is not advice, not a recommendation, and no order-placement path exists anywhere in the codebase — CI asserts that on every commit.
What the search actually produced
Every factor in four published libraries (Kakushadze 101, GTJA 191, Qlib 158, academic) over a point-in-time A-share panel, ranked only on the training window by the mean excess of a ten-name book, then reported on the untouched test window. 900 sessions split at 2024-12-31, rebalanced every session, ten sessions held, entry and exit at the open after the signal, limit-locked legs dropped rather than priced. Excess is against the equal-weight eligible universe, which returned +0.85% per hold on the test window.
| # | factor | train excess | test excess | >10% odds | worst hold | hit |
|---|---|---|---|---|---|---|
| 1 | academic/hml | +2.20% | −0.04% | 1.01× | −17.5% | 49.2% |
| 2 | qlib158/imin60 | +0.81% | −0.73% | 0.53× | −11.6% | 36.7% |
| 3 | gtja191/alpha_144 | +0.73% | +0.17% | 1.16× | −7.5% | 46.5% |
| 4 | academic/cma | +0.67% | +0.26% | 0.72× | −9.4% | 48.9% |
| 5 | qlib158/vsumn20 | +0.66% | +0.40% | 0.86× | −6.4% | 50.5% |
Costs are excluded, and said to be. On an overlapping series three defensible turnover conventions give three different answers, and a gross figure anyone can recompute is worth more than a net one nobody can; at 30 bps a round trip, a book that fully rotates each hold gives back 0.30% of every number above. All 456 rows are published in library_ranking.json.
Selection works, and it is not enough
The number that matters is not in the table. Across all 456 factors, training-window excess predicts test-window excess at Spearman ρ = +0.48 (p < 0.001). Training-side ranking carries real information; anyone calling this pure noise is contradicted by that number. Then look at what it buys.
| mean test excess per hold | share beating the universe | |
|---|---|---|
| all 456 factors | −0.71% | 21.3% |
| the training-window top ten | −0.24% | 30.0% |
Choosing cleanly on the training window is worth +0.47 percentage points per hold over choosing at random, and is still negative. The best ten of 456, selected without a glance at the test window, went on to underperform the universe they were drawn from — before a single basis point of cost. That is neither of the two stories usually told: the signal is real, and it is smaller than what decay and concentration take away.
Row 1 is the problem in one line. hml leads the training
window by a mile and lands at zero out of sample, while the fifth-placed factor, at a third
of its training excess, is the best of the five on test. Ranks are correlated across the
full 456 and nearly unrelated at the top — which is exactly where everyone selects.
The libraries also contain duplicates: gtja191/alpha_120 and
alpha101/alpha_042 are identical formulas published under different names, and
this run reproduces them to the digit, so a deflated-Sharpe denominator should count
distinct behaviours rather than files.
The table this replaces could not be reproduced. An earlier version reported a different top five and nothing on disk could regenerate it. Rebuilding from its description recovered the universe benchmark exactly, and matched no individual factor under any of three rebalancing and cost conventions — one came out with the opposite sign. Varying the convention until the numbers agreed would have been fitting the method to the answer, so the table was replaced rather than reconciled. The four factors under forward observation were chosen by that ranking; under this one they place 4th, 30th, 57th and 234th of 456. That does not weaken the forward record, which is tested by what happens after the freeze rather than by how it was picked — but the account of why those four were chosen cannot be checked.
Four biases, measured and removed
Each was quantified on a real equity panel while building this pipeline, and each is large enough to invent a strategy on its own. Red is what the flaw reports; violet is what survives once it is removed. Neither column is a return claim.

The first row is the one worth sitting with. Same panel, same cost model, same
portfolio construction — only the rule for choosing factors differs, and the gap
is about 3 bps/day. That exceeds most published equity-factor results, which is
why a pipeline unable to audit its own selection step cannot separate a discovery from
an artifact of choosing. The mechanism reproduces on synthetic data containing no
signal at all: an information ratio of 4.53, manufactured in ten seconds by
examples/selection_artifact.py.
Status, stated plainly: candidates are generated and fully evaluated; none has yet cleared the counterfactual, walk-forward and multiple-testing gates together. That is the gates working on a price-and-volume library, not the engine failing to run — and unlike most backtests, this one reports the count.
Research architecture
Discovery is separated from acceptance. Candidate generation receives training data; validation and shadow windows are structurally excluded from parent selection and refitting.
Scientific primitives
The library exposes compact reference implementations. A primitive is available for preregistered falsification; availability is not evidence of predictive power.
Causal Hidden Markov Filter
Forward-filtered state probabilities based on Hamilton-style regime switching. Full-path Viterbi labels are excluded from online-safe features.
EWS + BOCPD
Critical-slowing statistics and Bayesian run-length inference diagnose transitions without claiming directional alpha.
Koopman / DMD Residual
A fixed historical window estimates a local linear operator and reports the unexplained dynamical residual.
Simplified LPPLS
Fixed-grid calibration reports residual and critical-time stability distributions—never a single deterministic crash date.
Black–Litterman
Combines an equilibrium prior with uncertain views. Shrinkage improves conditioning; it cannot create information.
Triple Barrier
Profit, loss, and time barriers standardize outcomes. Future-dependent labels are permanently separated from features.
Bounded Top-K Pairwise Loss
Optimizes the ranking boundary directly under simplex constraints and exposes instability with complete-block replicas.
Proper Scoring Diagnostics
Brier, LogLoss, AUC, ECE, and probability buckets evaluate discrimination and calibration separately.
Dependence-aware Evidence Lab
A standalone falsification workbench for a searched family of factors, forecasts, or policies. One shared resampling design preserves serial and cross-candidate dependence, then tests both the global winner and individual survivors.
Stationary Bootstrap
Geometrically distributed circular blocks preserve weak serial dependence and drive confidence intervals and every joint test from one frozen design.
White Reality Check
Tests whether any member of the full searched family outperforms a frozen benchmark after recentering the joint bootstrap distribution.
Romano–Wolf Step-down
Studentized max-t inference controls family-wise error while retaining the measured dependence between competing candidates.
BH / BY q-values
Reports both standard false-discovery control and the conservative arbitrary-dependence correction—without treating either as deployment authority.
Research basis
The code follows published methods while retaining explicit implementation boundaries.
Probability of Backtest Overfitting
CSCV estimates how often model selection reverses out of sample after searching many alternatives. Bailey et al.
Deflated Sharpe Ratio
DSR adjusts apparent performance for trial count, return non-normality, and selection bias. Bailey & López de Prado
Predict-then-Optimize
Downstream decision loss can be more relevant than point-prediction error. Elmachtoub, Liang & McNellis
Strictly Proper Scoring Rules
Proper scores incentivize honest probability forecasts and separate confidence from ranking. Gneiting & Raftery
Markov-Switching Models
Latent discrete states provide a tractable representation of regime-dependent dynamics. Hamilton
Formulaic Alpha Synthesis
Modern research combines formula generation with dynamic factor selection; this repository uses a smaller audited DSL. AlphaForge
Reality Check
The winner of a specification search must be tested against the joint null, not as a solitary preregistered strategy. White
Step-down max-t
Studentized joint resampling can control family-wise error while exploiting dependence to improve power. Romano & Wolf
Factor research surface
| Domain | Research objects | Primary audit |
|---|---|---|
| Price and volume | Momentum, reversal, volatility, beta, liquidity | Turnover, crowding, cost sensitivity |
| Fundamentals | Value, profitability, growth, cash conversion, balance-sheet safety | Disclosure timing, restatements, survivorship |
| Hybrid mechanisms | Quality × risk, value × reversal, growth × momentum | Incremental value over both component legs |
| State and dynamics | HMM, EWS, BOCPD, DMD, LPPLS | True predictive increment versus mechanical abstention |
Research integrity contract
{
"status": "diagnostic_only_research_only_not_trading",
"orders": [],
"automatic_trading_changes": []
}