Skip to main content
2026-05-22 · 4 min read · ← 2 · moments · research · evaluation

Higher moments add noise faster than signal

what you'll learn · 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 Nth moment has finite-sample standard error roughly proportional to N!. Adding a kurtosis term to a momentum + reversion + skew score buys (in theory) more explanatory power; in practice it buys mostly more variance. The strategy catalog's `kurtosis_weight = −0.5` default is the empirical compensation.

The alphakernel strategy catalog now ships a four-strategy family of cross-sectional moment combinations:

  • xs_momentum_live — 1st moment (mean return) alone
  • xs_two_factor — adds 2nd moment (z-score around rolling mean)
  • xs_three_factor — adds 3rd moment (skewness)
  • xs_four_factor — adds 4th moment (excess kurtosis)

Each higher moment is, in principle, additional information about the return distribution’s shape. In practice, the 8-arm A/B harness produces a consistent observation across seeds:

Higher-moment strategies have wider per-seed dispersion but only marginally different mean Sharpe than their lower-order cousins.

That observation has a generalisable cause worth naming.

The variance penalty per moment

The sample-Nth-moment estimator’s standard error scales roughly with √(factorial(N)/n) for a Gaussian return distribution (Cramér 1946):

Moment Stdev on n=20 returns Relative to mean
1st (μ) σ/√20 ≈ 0.22σ baseline
2nd (σ²) σ²√(2/20) ≈ 0.32σ² 1.4×
3rd (skew) √(6/20) ≈ 0.55 2.5×
4th (kurt) √(24/20) ≈ 1.10

At lookback=20, an estimated skew of 0.3 has a 95% confidence interval of roughly 0.3 ± 1.1 — the sign isn’t reliable, let alone the magnitude. Kurtosis is worse: 0.3 ± 2.2.

A cross-sectional score that linearly combines these moments inherits the variance of the highest-included one. Adding skew to a two-factor score doubles the effective noise floor; adding kurtosis on top quadruples it.

What this means for the score weights

If the signal in each moment scales similarly across moments (which is an empirical claim, not a theoretical one), and the noise scales as above, the optimal weight on the Nth moment should be inversely proportional to its noise. So a sensible default-weight schedule looks roughly like:

momentum_weight   :  1.0
zscore_weight     : -1.0  (sign flip for mean-reversion)
skew_weight       : -1.0 / 2.5 ≈ -0.4  (we shipped -1.0)
kurtosis_weight   : -1.0 / 5.0 ≈ -0.2  (we shipped -0.5)

The catalog’s actual defaults (skew=-1.0, kurtosis=-0.5) are less defensive than the rule-of-thumb suggests. That’s a deliberate choice: we want the higher-moment strategies to be detectably different from their lower-order cousins on synthetic data, not silently degraded to noise. The 8-arm harness’s observation that four_factor has the widest stdev across seeds confirms the trade-off is live — the strategy is more exposed to higher-moment estimation noise than the inverse-noise rule would prescribe.

Three options for an operator who cares

  1. Tune the weights to the inverse-noise schedule above. The strategy’s kurtosis_weight parameter is exposed in the constructor; an operator who wants the most-defensive weighting passes kurtosis_weight=-0.2. The defaults are designed for inspection, not deployment.

  2. Increase the lookback. The variance terms above all decay as 1/√n — going from lookback=20 to lookback=80 quarters the skew stdev and the kurtosis stdev. The strategy classes accept lookback as a constructor argument; the kurtosis variance at lookback=80 is ~0.55, comparable to skew at lookback=20.

  3. Drop the moment. A high-noise factor with a small weight is a frequent contributor to noise and an infrequent contributor to signal. If the operator can articulate a specific data regime where they expect kurtosis to matter (post-earnings tail clusters, post-news fat tails), keep it. Otherwise: zero its weight and re-run the A/B.

What this doesn’t mean

  • It does NOT mean higher moments are useless. The argument is about finite-sample estimation noise, not about the true population moments. With sufficient data and a stable regime, the higher-moment factors carry information that the lower moments don’t.

  • It does NOT mean kurtosis is the worst factor. The Nth-moment variance scaling assumes a Gaussian return distribution. On real returns (heavy-tailed) the estimation properties are worse for the lower moments and better for the higher ones relative to the Gaussian-baseline expectation — but absolute noise is still dominated by the highest moment included.

  • It does NOT mean the strategy catalog has a bug. The kurtosis_weight=-0.5 default is the catalog’s deliberate choice to surface the higher-moment penalty to operators who run the A/B, rather than hide it under defensive weighting that produces results indistinguishable from three-factor.

What the 8-arm A/B actually tells you

Run examples/fomc_blackout_compare.py --n-seeds 5 --fomc-drift-bps 50. The output:

three_factor:  mean −0.218,  stdev 0.572
four_factor:   mean −0.054,  stdev 1.026

four_factor has higher mean Sharpe AND nearly 2× the stdev. On isotropic-shock synthetics the mean difference is within stdev — indistinguishable from luck. On real data with documented fat-tail regimes (post-FOMC volatility clusters; post-earnings crash dynamics), the mean difference would (in principle) widen while the stdev stayed proportional. The 8-arm harness with multi-seed dispersion is the cleanest place to measure that shift when real data arrives.

The platform’s discipline rule:

When adding a higher moment to a cross-sectional score, dampen its weight by the inverse of its finite-sample stdev. Defaults are a tuning starting point, not a deployment configuration.

deskgdfindgfstrategiesgsfeaturesgepromotionsgpapigabotgbwritinggw

Shortcuts are no-ops while typing in an input or textarea.