Strategy · Medium risk · Advanced
Calendar spread
Trade mispricings between markets that resolve on different dates but cover the same underlying event. The forward curve, for prediction markets.
Published Apr 10, 2026
The idea
“Will the Fed cut rates by June?” and “Will the Fed cut rates by December?” are distinct markets, but they’re related by construction: P(by June) ≤ P(by December). When that inequality is violated — or when the spread between them is wildly different from what the dated probabilities imply — there’s a trade.
Think of it as the prediction-market version of calendar spreads in options or bond curves.
How polybot implements it
calendar_spread groups markets into “families” based on a shared resolution topic and differing resolution dates. For each family:
- Enforce monotonicity: P(earlier) ≤ P(later).
- Enforce consistency with a prior model of resolution hazard (e.g. for rate cuts, an exponential hazard model fit to the family).
- When any leg deviates beyond threshold, emit paired buy/sell signals.
# conceptual
for family in self.families:
legs = sorted(family.markets, key=lambda m: m.resolution_date)
for earlier, later in zip(legs, legs[1:]):
if earlier.price > later.price + self.config.min_violation:
self.emit(Signal(earlier.market_id, side="NO", size=size))
self.emit(Signal(later.market_id, side="YES", size=size))
Why this is subtle
Monotonicity violations are rare but obvious. The bread and butter is the second filter — hazard-model consistency. polybot ships a HazardModel base class with exponential, Weibull, and piecewise constant implementations. For sophisticated markets, a custom hazard model per family is often worthwhile.
Configuration
polybot strategy enable calendar_spread
polybot strategy config calendar_spread \
--hazard-model exponential \
--min-violation 0.015 \
--max-legs 4 \
--families-include "fed_rates,election_dates"
Families are declared in YAML:
# config/calendar_families.yaml
fed_rates_2026:
topic: "Fed rate cut in 2026"
hazard: exponential
markets:
- "fed-cut-by-march-2026"
- "fed-cut-by-june-2026"
- "fed-cut-by-september-2026"
- "fed-cut-by-december-2026"
Where it works
- Macroeconomic forecasts. Fed decisions, CPI thresholds, GDP prints — all have natural date-laddered markets.
- Election cycles. Primaries on laddered dates, with a shared candidate universe.
- Crypto price thresholds. “BTC > $X by date Y” laddered markets.
Where it fails
- Thin markets. Far-dated legs are often illiquid. You get filled on the near leg and can’t complete the spread.
- Regime changes. A hazard model fit to normal volatility mis-prices tail events. polybot’s confidence decay on high-z trades partially mitigates.
FAQ
Is this just options trading? Close in spirit — a bet on the shape of the resolution curve. But discrete-outcome prediction markets don’t have Black-Scholes analogues; you need empirical hazard models.
How do I discover families automatically? polybot’s calendar discover command clusters markets by resolution-topic embeddings (using an AI plugin) and proposes families for human review.
Source: src/polybot/strategies/calendar_spread.py.
Want this strategy tuned for your book?
Cryptuon can adapt polybot strategies to your capital, risk budget, and markets. Shadow-deployed before you go live.