Meta-Labelling and Bet Sizing

  • October 28, 2026
  • 9 min read

Article 6 of 7 — Building Momentum Systems Without Fooling Yourself. Previous: Regime Filters as Features, Not Conditions · Next: Validation: Return over Drawdown, Random Benchmarks, and the Honest Number

At the end of Article 5 I had two things that do not yet form a strategy: momentum probes that each answer a single question, long or short, here, now, with no opinion about their own reliability, and regime features that describe the market but decide nothing. The temptation is to fuse them into one model that looks at everything and outputs a trade. That is the monolithic signal the “Illusion” posts warned about, in machine-learning clothes. The problem this article solves is how to combine the two layers so that the result is more constrained than either part, not less and how to answer a question the probes cannot: not just whether to act, but how much.

Two questions, two models

Meta-labelling, in López de Prado’s formulation, is a division of labour. The primary model proposes the side of the trade. The secondary model does not see prices; it sees the proposal and a description of the context, and it estimates one number: the probability that this proposal will turn out to be correct. The primary model answers which way. The secondary model answers how much should I trust the primary model, given the state the market is in.

In my framework the primary model is a momentum probe from Article 4, exactly as it ran in the baseline, same exit structure, no filters, no optimization. The secondary model is trained on the triple-barrier labels of Article 3: each historical proposal is scored as correct or incorrect according to which barrier the path hit first, and that outcome becomes the target. The inputs are the regime features of Article 5, efficiency, persistence, choppiness, volatility state, evaluated at the moment of the proposal. Nothing about the proposal is fed in except its side, so the secondary model cannot learn to be a better probe. It can only learn when the existing probe tends to be right.

That sentence is the whole design. The secondary model is not allowed to find trades. Its only job is to grade trades that have already been found.

Why the split contains overfitting

A single model that takes features and outputs a direction must learn two things at once: the sign of the expected move and the conditions under which that sign is trustworthy. These are different targets with different signal-to-noise. The sign is a hard, noisy problem; the conditional reliability of a fixed, simple rule is an easier one. A monolithic model spends its capacity on both and, on a finite sample, mostly on the harder one, which is where the memorization happens.

Splitting them changes what is estimated. The primary model is deliberately simple and unoptimized. It has the degrees of freedom of a textbook rule, and I do not tune it; the baseline of Article 4 is the version that gets meta-labelled, not a version improved after seeing results. Because it is fixed, it contributes no selection. Whatever edge it has, it has by construction of the mechanism, not by search.

The secondary model then learns a lower-variance target. “When is this rule right?” has a natural answer, trend rules are right when the market is trending, and the regime features measure exactly that, and the model is not asked to invent a pattern in prices, only to map a small set of pre-registered descriptors to a binary outcome fixed before any of this ran.

The third property matters most for the register. The secondary model can be replaced without touching the primary. If the feature set was wrong, or a different learner generalizes better, I retrain the grader; the probe, the platform’s trade list, and the labels are unchanged. Compare sequential filtering, where every “improvement” rewrote the entry condition and silently reset the count. Here the entry condition has one version, and the versions of the grader are countable.

From probability to size

A probability is not a position. The last step converts the estimate into a bet size, and the rule is the least interesting part of the framework: size is a monotone function of confidence. A proposal rated near coin-flip gets little or nothing; a proposal rated well gets more; the mapping never decreases as confidence increases. Its form and scale are decided once, registered, and not revisited per instrument or per probe. The mapping itself is a sizing primitive in the C# library like any other. The secondary model is fitted in Python, that is judgment, not strategy logic, and once fitted it is frozen and its output is handed to the sizing primitive as an input, the same way a volatility estimate is; the platform applies the size, and Python then only sees the result in the trade list. The division holds: Python never decides what to trade, only how much a proposal already made deserves to be trusted.

Two things are deliberately absent. There is no threshold that turns a trade on or off, that would reintroduce a binary filter through the back door, and Article 5 was about why those are the problem. And there is no per-market calibration, for the same reason the barriers have none: every knob set by looking at results is a degree of freedom, and I would rather have a slightly worse universal rule than a better one I cannot count.

The consequence is that exposure varies continuously with the state of the market rather than switching. On an equity index in a clean uptrend, the grader will typically rate long proposals well and short proposals poorly, and the sizing will reflect the asymmetry Article 4 found without anyone hard-coding “no shorts on US indices.” The structural fact is learned from the labels, in a form that can be wrong and can be measured, rather than written in as a rule that can only be believed.

Training without leaking

The secondary model is trained under purged and embargoed cross-validation, and this is not optional. Ordinary k-fold assumes the label of one observation does not depend on information from another. Triple-barrier labels violate this by construction: each label is determined by the price path over a horizon, and consecutive proposals have overlapping horizons. Two observations a few days apart share most of the path that decided both their labels. If one lands in the training fold and the other in the test fold, the model is tested on an outcome it has, in effect, already seen. The score comes out flattering, and the flattery is not detectable from inside the procedure.

Purging removes from the training set any observation whose label horizon overlaps the test set. Embargoing drops a further margin after each test block, because serial correlation in the features means the information does not stop at the boundary. What is left is a training set that genuinely did not know what the test set was going to do. Only out-of-fold probabilities go forward.

When I first ran this properly, the grader’s cross-validated performance fell relative to the naive version. That is the correct outcome. The gap measures how much of the naive score was leakage, and it is one of the numbers I record.

Where it does not help

Meta-labelling limits damage; it does not manufacture edge. It fails in three specific ways that I want on the record.

It cannot rescue a primary model with no edge. If the probe’s proposals are coin flips in every regime, the grader is learning the conditional reliability of a coin, and the honest answer is a flat probability everywhere. A grader that instead finds structure has found it in the noise. This is why the unfiltered baseline of Article 4 comes first, and why the random benchmark of Article 7 is run against the primary model before any grader exists. Meta-labelling a probe that has not cleared its own baseline is decorating a corpse.

It can overfit through the feature set. The grader’s degrees of freedom are low relative to a monolithic model, but not zero, and they hide in which features are offered. Sixty regime primitives exist in the library, and every subset I try is a trial. “Let me add the choppiness measure and see” is the sequential move of the “Illusion” posts, one level up. The defence is the same as everywhere in the framework: the feature set is registered before training, and a change to it is a new hypothesis, not an edit.

And it adds a second layer whose failure is harder to see. When a simple strategy stops working, the equity curve says so. When a meta-labelled strategy stops working, the failure can be in the probe, in the grader, in the sizing map, or in a shift in how the regime features relate to the market — and the curve looks the same in all four cases. Live monitoring has to be done at the component level: the probe’s raw hit rate, the grader’s calibration on recent trades, the realized size distribution. A degraded curve without that decomposition is a symptom without a diagnosis.

Counting it in the register

The register treats the grader as what it is: a hypothesis with parameters, admitted through the same G0–G8 funnel as everything else. The entry records the primary probe and the feature subset by their registered identities, the label specification by its timestamp, the learner family, the cross-validation scheme, and the sizing map. Any change to any of those is a new row. The probe was already counted in the family-level descriptive trial of Article 4 and is not counted again; each grader specification that touches data is a separate trial.

This is where the two-level counting of Article 2 earns its keep. If every probe-times-feature-subset-times-learner combination counted independently, the deflation would be so severe that nothing would pass. It does not have to, because the probe layer is fixed and descriptive and only the grader layer is searched. The number that enters the deflated Sharpe ratio is the number of grader specifications that touched the data. It is small, it is written down, and I can defend it.

What I cannot yet defend is the resulting equity path as a measure of anything: it is still computed on the history I have. Article 7 is about turning it into a number I would put my own capital behind — return over drawdown as a distribution rather than a point, a random benchmark run across all twenty-five markets at once, combinatorial purged cross-validation, the probability of backtest overfitting, and walk-forward as the final check it should be rather than the development tool it usually becomes.

References

López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley.

quanthedgeai — the research arm of algosworksai. Systematic research on mid-frequency instruments.

 

Get the monthly Market Regime Note

Regimes, volatility and correlations across major futures markets — with the code behind the charts. Free.

Subscribe →