structural arbitragevalidation

Carry-Adjusted Z-Scores in CBOT Calendar Spreads

Testing whether carry-adjustment improves half-life stability across corn, soy, and wheat spreads — and why wheat keeps failing to converge.

Calendar spreads in grains are a classic mean-reversion playground: the front-to-back price difference is anchored by the cost of carry, and deviations from that anchor tend to snap back. The trouble is that the anchor itself moves. A raw z-score on the spread treats a widening carry environment as signal when it’s really just the term structure repricing storage.

This note asks a narrow question: if we subtract the theoretical carry before computing the z-score, does the reversion become more stable — specifically, does the half-life of the z-score tighten and stop drifting across sub-periods?

The setup

For each of corn, soybeans, and wheat, we take the nearest two active contracts and build the calendar spread. Carry is estimated from full-carry storage rates and financing, then removed from the spread series. We fit an Ornstein–Uhlenbeck process to both the raw and carry-adjusted spreads and compare the implied half-lives on a rolling basis.

The hypothesis: carry-adjustment removes a slow-moving nuisance trend, leaving a cleaner stationary series with a shorter, more stable half-life.

What corn and soy say

For corn and soybeans, the story holds up. The carry-adjusted half-life is both shorter and markedly less variable across the 2014–2026 window. The Deflated Sharpe Ratio of a simple z-score reversion trade — enter beyond ±2, exit at 0 — clears 1.2 after adjustment, versus a DSR that doesn’t survive the trial-count penalty on the raw series.

SpreadRaw half-lifeAdj. half-lifeAdj. DSR
Corn34 d21 d1.21
Soy29 d19 d1.14
Wheat41 d38 d0.42

Why wheat keeps failing

Wheat is the interesting failure. Carry-adjustment barely moves its half-life, and the DSR never clears the bar. The reason is that wheat’s spread isn’t primarily a storage story — it’s a deliverability and quality story. The three wheat classes (soft red, hard red, hard white) trade on different exchanges with different delivery mechanics, and the front-back relationship is driven as much by which class is cheapest-to-deliver as by carry. Subtracting a storage-based carry term doesn’t touch that.

That’s the useful negative result: carry-adjustment helps exactly where carry is the dominant anchor, and does nothing where it isn’t. It’s a reminder that a preprocessing step is only as good as the economic mechanism it’s standing in for.

Takeaway

Carry-adjustment is worth doing for corn and soy calendar spreads and is close to free to compute. For wheat, the effort is better spent modeling the cheapest-to-deliver switch directly. The live positioning that follows from this sits in the CFTC dashboard, linked from the tools app.

Get the research, not the noise.

Weekly notes on systematic strategy design, validation methodology, and what's actually working — no promotions, no signals for sale.

Free · Unsubscribe anytime · Delivered via email