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

  1. Scan

    Rank large US stocks by market value and keep those reporting earnings in the next 30 days.

  2. 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.

  3. 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.

  4. 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.

  5. Size

    Size the position at half the Kelly criterion, capped at 5% of capital.

  6. 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.

Total return over the whole period. Negative figures in brackets; a dash means no trade passed the filters.
Trading cost

Trades
Profitable trades
Total return
Largest drawdown
Return a year
Average per trade
Median per trade
Average position, share of capital

Modelled, not traded. Overpricing is how much more the market charges for an earnings move than the stock’s own recent moves would justify, and the whole result turns on it. The base case is marked with a tick.

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.