IV Crush: How to Track and Profit from Earnings Volatility Collapse | FlashAlpha Research

IV Crush: How to Track and Profit from Earnings Volatility Collapse

IV crush is the sharp drop in implied volatility after an earnings announcement. Learn how it works, see real examples with data, and build an IV crush tracker in Python using the FlashAlpha API.


Tomasz Dobrowolski - Quant Engineer

  • #IVCrush #ImpliedVolatility #EarningsTrading #Options #Python

What Is IV Crush

Implied volatility reflects the market's expectation of future price movement. Before an earnings announcement, that uncertainty is at its peak — nobody knows the numbers, nobody knows guidance, and the stock could gap in either direction. Options market makers price this uncertainty in by inflating IV.

The moment the earnings call ends, that uncertainty is resolved. Even if the numbers are surprising, the unknown has become known. IV drops sharply — often 20-60% in a single session. This mechanical, repeatable phenomenon is IV crush.

It's not a theory or an edge case. It happens on virtually every earnings announcement, every quarter. The magnitude varies, but the direction doesn't — IV goes up into earnings, IV comes down after. If you're trading options around earnings and you don't account for this, you're flying blind.

Why This Matters

IV crush means you can be right on direction and still lose money on a long options position. The stock moves 3% in your favor, but IV drops 40%, and your option is worth less than you paid for it. Understanding this is the difference between profitable and losing earnings trades.

Visualizing IV Crush — Real Example

Pull historical volatility data around an earnings date to see the spike-and-collapse pattern. Here's how to visualize it using the Volatility Analysis endpoint:

from flashalpha import FlashAlphaClient
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
import numpy as np

client = FlashAlphaClient(api_key="your_api_key")

# Pull current vol data for NVDA
vol = client.get_volatility("NVDA")

print(f"NVDA ATM IV:     {vol['atm_iv']}%")
print(f"NVDA RV (20d):   {vol['realized_vol']['rv_20d']}%")
print(f"IV-RV Spread:    {vol['iv_rv_spreads']['vrp_20d']}%")
print(f"Assessment:      {vol['iv_rv_spreads']['assessment']}")
print(f"\nTerm Structure:  {vol['term_structure']['state']}")

# Check skew for nearest expiry
if vol.get("skew_profiles"):
    nearest = vol["skew_profiles"][0]
    print(f"\nNearest Expiry Skew:")
    print(f"  25d Risk Reversal: {nearest.get('rr_25d', 'N/A')}")
    print(f"  Smile Ratio:       {nearest.get('smile_ratio', 'N/A')}")

Before earnings, you'll typically see ATM IV significantly elevated above realized vol — the VRP widens as the market prices in the earnings event. After earnings, ATM IV collapses back toward realized vol levels.

The pattern is consistent: a gradual ramp in the 2-3 weeks before earnings, a sharp spike in the final 2-3 days, and then an overnight collapse of 30-50%.

How Much Does IV Typically Drop After Earnings?

The magnitude of IV crush varies by sector and individual stock volatility profile:

Sector Typical IV Drop Examples
Mega-cap tech 30-50% AAPL, MSFT, GOOGL, AMZN
High-beta tech 35-55% TSLA, NVDA, AMD, NFLX
Biotech 40-70% MRNA, BIIB, REGN
Financials 20-35% JPM, GS, BAC, WFC
Consumer staples 15-30% COST, WMT, PG, KO
Utilities 15-25% NEE, DUK, SO

Biotech names see the largest crush because binary outcomes (FDA approvals, trial results) create extreme pre-event uncertainty. Utilities see the smallest because their earnings are predictable and low-vol by nature.

These are averages — individual stocks vary quarter to quarter. The only way to know the actual IV premium going into a specific earnings event is to measure it. That's what the tracker below does.

Build an IV Crush Tracker

This script identifies which stocks have the highest IV premium going into earnings — the ones most likely to experience significant crush:

from flashalpha import FlashAlphaClient
import pandas as pd

client = FlashAlphaClient(api_key="your_api_key")

# Stocks with upcoming earnings (manually maintained or from external source)
earnings_watchlist = [
    "NVDA", "TSLA", "AAPL", "MSFT", "AMZN", "GOOGL", "META", "NFLX",
    "AMD", "CRM", "ORCL", "MU", "AVGO", "COIN", "PLTR", "NKE",
    "JPM", "GS", "BAC", "UNH", "JNJ", "LLY", "PFE", "COST"
]

results = []
for ticker in earnings_watchlist:
    try:
        vol = client.get_volatility(ticker)
        rv_20 = vol["realized_vol"]["rv_20d"]
        atm = vol["atm_iv"]
        vrp = vol["iv_rv_spreads"]["vrp_20d"]

        # IV premium ratio: how much IV exceeds RV
        iv_premium_pct = ((atm - rv_20) / rv_20 * 100) if rv_20 > 0 else 0

        results.append({
            "ticker": ticker,
            "atm_iv": atm,
            "rv_20d": rv_20,
            "vrp": vrp,
            "iv_premium_%": round(iv_premium_pct, 1),
            "assessment": vol["iv_rv_spreads"]["assessment"],
            "term_state": vol.get("term_structure", {}).get("state", "unknown")
        })
    except Exception:
        continue

df = pd.DataFrame(results)
df = df.sort_values("iv_premium_%", ascending=False)

print("\n=== Earnings IV Crush Candidates ===")
print("Sorted by IV premium over realized vol\n")
print(df.head(15).to_string(index=False))

Sample output:

=== Earnings IV Crush Candidates ===
Sorted by IV premium over realized vol

ticker  atm_iv  rv_20d   vrp  iv_premium_%      assessment    term_state
  COIN   48.70   31.20  7.50          56.1  moderate_premium  backwardation
  TSLA   52.30   35.80  6.50          46.1  moderate_premium  backwardation
  PLTR   45.20   31.40  6.30          43.9  moderate_premium  backwardation
   MU    34.50   24.80  4.70          39.1     fair_premium   contango
   AMD   39.50   28.90  4.30          36.7     fair_premium   backwardation
  NFLX   32.40   24.10  4.50          34.4     fair_premium   contango
  NVDA   42.80   32.60  3.70          31.3     fair_premium   backwardation
  COIN   30.50   23.50  4.70          29.8     fair_premium   contango
   NKE   31.80   25.20  5.40          26.2     fair_premium   contango

The iv_premium_% column shows how much IV exceeds realized vol as a percentage. COIN at 56% means IV is pricing in 56% more movement than the stock has actually been making. That premium has to go somewhere after earnings — and most of it gets crushed.

Also note the term_state column: backwardation (near-term IV higher than far-term) is the classic earnings setup, confirming that the front expiration is inflated by the event.

Strategies That Exploit IV Crush

Short Straddle / Short Strangle

Sell an ATM straddle or OTM strangle 1-2 days before earnings. You collect premium inflated by the IV spike. If the stock stays within the expected move, you profit from the vol collapse.

This is the most direct IV crush play, but also the highest risk. An ATM straddle has unlimited loss potential in both directions. A strangle gives you a wider breakeven range but still has undefined risk. Position size conservatively — this is not a strategy for overleveraging.

Iron Condor

The defined-risk version: sell an OTM call spread + OTM put spread, creating a range where you profit. Your maximum loss is capped at the spread width minus premium received. The expected move (priced into the straddle) gives you a natural reference for where to set your short strikes.

Iron condors work best when IV crush is large enough that the premium received is meaningful relative to risk. Stocks with 40%+ IV premium are ideal candidates.

Calendar Spread

The purest IV crush play: sell the front-month option (earnings expiry) and buy the back-month option at the same strike. Front IV collapses after earnings while back-month IV holds relatively steady. You profit from the IV differential.

Calendars have limited risk (you can't lose more than the debit paid) and directly isolate the crush effect. The tradeoff is that a large gap in the underlying can overwhelm the vol benefit.

The Trap: When IV Crush Isn't Enough

IV crush is not free money. The expected move is priced in for a reason. If TSLA's straddle prices in a $15 move and the stock gaps $40, the crush on your short straddle saved you $5 but the directional loss destroyed you by $25.

Earnings surprises that exceed the expected move are not rare — they happen ~30% of the time across the market. When they do, IV crush on a short vol position is a rounding error compared to the directional loss.

Risk management for IV crush strategies:

  • Use defined-risk structures (iron condors, credit spreads) unless your account can absorb a 3-sigma gap
  • Position size to the worst case, not the expected case — if the spread can lose $500, that's your risk, not the "expected" $50 profit
  • Diversify across multiple earnings — don't put 20% of your account on a single TSLA earnings straddle
  • Know the stock — some names (TSLA, COIN) gap through expected moves regularly; others (AAPL, MSFT) rarely do

Track IV Crush with FlashAlpha

The Volatility Analysis endpoint gives you everything needed to assess IV crush risk:

  • ATM IV vs realized vol — the premium you're selling
  • Term structure state — backwardation confirms event premium in front expirations
  • Skew profiles — how the crush affects different strikes differently
  • VRP assessment — whether the premium is historically rich, fair, or cheap

Monitor Earnings IV in Real-Time

Know when premium is rich, when it's fair, and when to stay away.

Get API Key → Try the Playground

Related Reading


Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!