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.
| Spread | Raw half-life | Adj. half-life | Adj. DSR |
|---|---|---|---|
| Corn | 34 d | 21 d | 1.21 |
| Soy | 29 d | 19 d | 1.14 |
| Wheat | 41 d | 38 d | 0.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.