Earnings calendar spreads
A Python bot that finds large US stocks reporting earnings within 30 days, checks whether near-term options are priced unusually high, and sizes a calendar spread from a Monte Carlo estimate.
- Status
- Modelled backtest complete
- Built with
- Python, Interactive Brokers API, yfinance, NumPy, SciPy
Results on this page are modelled. Historical option prices were not available, so implied volatility around each earnings date is estimated rather than observed. Read the numbers as a test of the idea, not as a track record.
The idea
Options that expire just after an earnings release have to price the size of the move, so their implied volatility rises in the days before it. Options expiring a month later spread the same event over more time and stay calmer.
When that gap is wide, selling the near-term option and buying the later one at the same strike aims to profit as the near-term volatility collapses once results are out, while the later option keeps most of its value.
How it works
-
Scan
Rank large US stocks by market value and keep those reporting earnings in the next 30 days.
-
Filter
Keep a stock only if its last four earnings moves were smaller than 0.8 times its last eight. The market tends to price the next move from the longer history, so shrinking moves are where the near-term option is most likely overpriced.
-
Check prices
Require the near-term at-the-money call to be priced at least 10% richer in implied volatility than the later one, with both trading over 1,000 contracts a day.
-
Price
Simulate 10,000 price paths from the stock's past earnings moves to estimate the spread's expected gain, its probability of profit and its payoff ratio.
-
Size
Size the position at half the Kelly criterion, capped at 5% of capital.
-
Approve and exit
Show the best candidate for manual approval, with a plan to close both legs at the close on the first trading day after the release.
Modelled backtest
January 2016 to September 2026, 19 large US stocks. Base case: the market prices each earnings move 10% above the stock's recent history, and every option trade costs 1% of its price.
The improved rules cut the worst drawdown from 21.5% to 4.6%, but in the base case the strategy still loses a little. It only makes money if the market overprices earnings moves by about 25% and trading costs stay at 1% or less.
- Trades
- 52
- Profitable trades
- 40%
- Total return
- (3.4%)
- Largest drawdown
- (4.6%)
Account value in the base case
Total return since January 2016, with positions sized as in the live bot
Show year-end figures
| Last trade closed in the year | Account total return since January 2016 |
|---|
Every combination
All twenty-four runs the backtester produced: both sets of rules, four levels of earnings overpricing, three levels of trading cost. Pick a cell to see that run in full.
Limitations
- Implied volatility is estimated, so real option prices, spreads and fills could differ a lot.
- The improvements were chosen by testing on the same data, so the backtest likely flatters them.
- Real option prices may already react to shrinking earnings moves, which would weaken the filter.
- Earnings dates come from Yahoo Finance and can move after the scan runs.