Volatility Risk Premium: The Practical Guide to Trading the Most Persistent Edge in Options | FlashAlpha

Volatility Risk Premium: The Practical Guide to Trading the Most Persistent Edge in Options

A practical guide to harvesting the volatility risk premium - the most persistent edge in options markets. Learn how to identify, measure, and trade VRP using real-time analytics: z-scores, directional VRP, GEX-conditioned regimes, strategy suitability scores, and dealer flow risk.

T
Tomasz Dobrowolski Quant Engineer
Mar 27, 2026
Updated Jun 7, 2026
63 min read
VRP VolatilityRiskPremium Options Trading AlphaGeneration Volatility OptionsStrategy

What Is the Volatility Risk Premium (and Why Does It Exist)

The volatility risk premium is the systematic spread between implied volatility and subsequent realized volatility. In plain terms: options are consistently priced as if the underlying will move more than it actually does. The difference between what the market expects (IV) and what actually happens (RV) is the VRP.

The math is straightforward:

Volatility Risk Premium $$ \text{VRP} = \text{IV}_{\text{ATM}} - \text{RV}_{\text{window}} $$

If SPY's ATM implied volatility is 20% and the 20-day realized volatility is 16%, the VRP is 4 percentage points. That 4% is what you're being paid - annualized - to sell options. It's the compensation you receive for bearing the risk that realized vol could spike above implied vol.

Need the formula and a worked example? See Volatility Risk Premium Formula: How to Calculate VRP From IV and RV for the math, a step-by-step SPY worked example, and a 30-line Python implementation.

Why Does This Premium Exist?

The VRP isn't a market inefficiency - it's a structural feature. It exists because of a persistent supply-demand imbalance in the options market:

  • Institutional hedgers systematically buy protection. Portfolio managers, pension funds, and risk-constrained institutions are required to hedge. They buy puts and pay for collars regardless of whether vol is cheap or expensive. This demand is price-insensitive - they're buying insurance, not speculating on vol.
  • Insurance buyers overpay by design. Just as homeowners pay more for fire insurance than the actuarial cost of fires, options buyers pay more than the expected payout. The premium compensates sellers for bearing tail risk - the chance that realized vol could be 2x or 3x implied vol on any given day.
  • The market prices in worst-case scenarios that usually don't materialize. IV reflects the distribution of possible outcomes, weighted by fear. Realized vol reflects what actually happened. The gap between fear and reality is, on average, positive.
  • Leverage constraints create asymmetric demand. Institutions that want downside protection must buy it in the options market - they can't simply hold more cash or reduce leverage fast enough. This structural demand floor keeps IV elevated relative to RV.

This Is Not a Free Lunch

The VRP is often described as "picking up pennies in front of a steamroller," and there's truth to that characterization. The premium exists precisely because selling volatility has fat-tail risk. You collect small, consistent premiums on most days, then occasionally face outsized losses when realized vol explodes past implied vol.

Historical data tells the story:

  • VRP is positive on the majority of trading days - index implied volatility has historically exceeded subsequent realized volatility most of the time, one of the more robust stylized facts in index options.
  • The average VRP is 2-4 percentage points (IV minus subsequent RV), depending on the window.
  • The worst drawdowns come in clusters. VRP doesn't go negative gradually - it inverts violently during market stress (2008, 2018 Volmageddon, 2020 COVID, 2022 rate shock). These are the events that destroy undisciplined sellers.
  • Long-term, systematic VRP harvesting has historically produced a positive but modest Sharpe ratio - the figures commonly cited fall in roughly the 0.3 to 0.6 range, heavily implementation-dependent - with meaningful max drawdowns and sharp left-tail risk.

The edge is real. The question is whether you're measuring it before you trade, or just assuming it's there.

Why do most retail traders already trade VRP badly?

If you sell covered calls, you're harvesting VRP. If you sell iron condors, you're harvesting VRP. If you write credit spreads, cash-secured puts, or strangles, you're harvesting VRP. Nearly every premium-selling strategy is, at its core, a bet that IV will overstate realized vol.

The problem isn't the strategy - it's the execution. Most retail premium sellers make three critical errors:

Error 1: Selling Premium Without Checking if VRP Is Positive

If you sell a 30-DTE iron condor on SPY every month regardless of conditions, you're assuming VRP is always positive. It isn't. When IV is 18% and 20-day realized vol is 22%, you're selling insurance below cost. You're paying the market for the privilege of taking their risk.

This happens more often than you'd think - especially after sustained trending moves where realized vol spikes but IV hasn't caught up, or during extended low-vol regimes where IV compresses to levels that barely exceed RV.

Error 2: Using Symmetric Strategies When VRP Is Directional

The "total" VRP is an average across puts and calls. But the risk premium on the put side (crash protection) is structurally different from the call side. Selling an iron condor assumes the VRP is equal on both sides. It rarely is. We'll cover directional VRP in detail later, but the short version is: if put VRP is 5% and call VRP is 1%, your iron condor is mostly a put trade with a call leg that's adding risk for minimal premium.

Error 3: Ignoring the Regime

VRP can be 4% - solidly positive - while dealers are in negative gamma and positioned to amplify any downturn. The premium looks attractive, but the tail risk is elevated because dealer hedging will worsen any sell-off. Measuring VRP without accounting for dealer positioning is like checking the weather forecast but not the flood warnings.

The fix for all three errors is the same: measure before you trade. That's what the rest of this guide is about.

Before & After - The Same Trade, Different Outcomes

To make this concrete, here's the same trade decision made two ways.

Without VRP Data (How Most Retail Traders Do It)

It's March 15, 2026. SPY is at $572. ATM IV for the 30-DTE cycle is 19.8%. A 10-wide iron condor ($560/$570 puts, $580/$590 calls) collects $2.85 in premium. The trader thinks: "IV is close to 20%, premiums look fat, theta is on my side. I'll sell the condor."

What the trader doesn't know:

  • 20-day realized vol is 23.1% - IV is BELOW realized vol. VRP is -3.3%. The trader is selling insurance below cost.
  • VRP z-score is -1.4 - deeply negative. This is the 8th percentile of the last year. Premium hasn't been this cheap in months.
  • Dealers are in negative gamma. The gamma flip is at $578, and SPY is below it. Any sell-off will be amplified by dealer hedging flows.
  • Put-side VRP is -4.8%. The put spread (which carries most of the condor's risk) has the worst risk/reward of any component.

Over the next week, SPY drops to $561. The iron condor loses $6.80 against $2.85 collected - a 2.4:1 loss ratio. Dealers amplified the move exactly as their positioning predicted. The VRP was negative the entire time - there was never an edge.

With VRP Data (Systematic Approach)

Same day, same setup. The trader pulls the VRP endpoint before placing the trade:

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

print(f"VRP 20d: {data['vrp']['vrp_20d']:+.2f}%")             # -3.30%
print(f"Z-score: {data['vrp']['z_score']:+.2f}")               # -1.42
print(f"Regime:  {data['regime']['gamma']}")                    # negative_gamma
print(f"Put VRP: {data['directional']['downside_vrp']:+.2f}%") # -4.80%

The data is unambiguous: VRP is deeply negative, z-score is in the 8th percentile, regime is negative gamma, put VRP is worse than total VRP. Every signal says do not sell premium.

The trader passes. No trade. Keeps capital for a better day. A week later, after the sell-off exhausts itself, VRP flips to +4.2% with a z-score of +1.8 in positive gamma. Now the trader sells - with the data confirming the edge exists.

Same trader, same market, same strategy - different outcome because of one API call.

Would you have known to sit out that trade?

The VRP endpoint tells you in one call whether premium selling has an edge right now - or whether you're selling insurance below cost.

Get Alpha Access

Measuring VRP - The Four Windows

VRP isn't a single number. Because realized vol depends on the lookback window, you get a different VRP reading for each time horizon. The FlashAlpha VRP endpoint returns four simultaneous windows, each telling you something different about the current vol environment.

WindowCalculationCharacterBest For
5-day VRPATM IV - RV5Noisy, fast-reacting, captures intraday regime shiftsSame-week premium selling, 0DTE context
10-day VRPATM IV - RV10Short-term signal with moderate smoothingWeekly expiration strategies, 5-10 DTE trades
20-day VRPATM IV - RV20The "standard" window, most commonly referencedMonthly premium selling, iron condors, strangles
30-day VRPATM IV - RV30Smoothed, less reactive to recent outliers30-45 DTE strategies, structural positioning

Here's how to pull all four VRP spreads for any symbol:

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

vrp = data["vrp"]
print("=== SPY Volatility Risk Premium ===")
print(f"ATM IV:     {vrp['atm_iv']:.1f}%")
print(f"5-day VRP:  {vrp['vrp_5d']:+.2f}%  (RV5 = {vrp['rv_5d']:.1f}%)")
print(f"10-day VRP: {vrp['vrp_10d']:+.2f}%  (RV10 = {vrp['rv_10d']:.1f}%)")
print(f"20-day VRP: {vrp['vrp_20d']:+.2f}%  (RV20 = {vrp['rv_20d']:.1f}%)")
print(f"30-day VRP: {vrp['vrp_30d']:+.2f}%  (RV30 = {vrp['rv_30d']:.1f}%)")

Reading the VRP Spread

VRP Level (20d)InterpretationAction
> 6%VRP is extremely elevated - IV is pricing in far more vol than realizedAggressive premium selling. Consider wider strikes for larger credit.
3% to 6%VRP is healthy - solid compensation for selling volStandard premium selling. Full-size positions.
1% to 3%VRP is thin - you're being paid, but not muchReduce size. Favor defined-risk structures. Be selective on strikes.
0% to 1%VRP is marginal - barely any edgeMinimal exposure or sit out. The risk/reward doesn't justify the trade.
< 0%VRP is negative - IV understates realized volDo not sell premium. Consider buying vol or hedging existing short positions.

The key insight is that not every positive VRP reading is equally tradeable. A VRP of 1.5% is technically positive, but after commissions, slippage, and the risk of a tail event, the expected value is marginal. Save your capital for the 3%+ readings where the edge is clear.

Check SPY's VRP right now

See the live VRP spread, z-score, and regime for SPY - updated every 15 minutes during market hours.

View SPY Dashboard

Z-Score and Percentile - Is VRP Rich or Cheap Right Now?

Raw VRP tells you the spread between IV and RV. But "4% VRP" means something very different in a low-vol regime (where 4% is unusually wide) versus a high-vol regime (where 4% might be compressed). You need context.

That's what the z-score and percentile provide. The VRP endpoint returns both, calculated over a rolling 60-day lookback:

VRP Z-Score $$ z = \frac{\text{VRP}_{\text{today}} - \mu_{\text{VRP, 60d}}}{\sigma_{\text{VRP, 60d}}} $$

The z-score tells you how many standard deviations today's VRP is from its trailing mean. The percentile tells you where today's VRP falls in the distribution of the last 60 readings.

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

z = data["vrp"]["z_score"]
pct = data["vrp"]["percentile"]
vrp_20d = data["vrp"]["vrp_20d"]

print(f"VRP (20d): {vrp_20d:+.2f}%")
print(f"Z-score:   {z:+.2f}")
print(f"Percentile: {pct:.0f}th")

# Decision framework
if z > 1.5:
    print("SIGNAL: VRP is significantly elevated vs history.")
    print("ACTION: Aggressive premium selling. Full size. Wider strikes for max credit.")
elif z > 0.5:
    print("SIGNAL: VRP is above average. Healthy edge.")
    print("ACTION: Standard premium selling. Normal position sizing.")
elif z > -0.5:
    print("SIGNAL: VRP is near average. Marginal edge.")
    print("ACTION: Reduce size. Tighter strikes. Be selective.")
elif z > -1.0:
    print("SIGNAL: VRP is compressed. Thin or no edge.")
    print("ACTION: Minimal exposure. Consider sitting out.")
else:
    print("SIGNAL: VRP is deeply compressed or negative. No edge.")
    print("ACTION: Do not sell premium. Consider buying vol.")

Z-Score Decision Matrix

Z-Score RangePercentile (approx)InterpretationPosition Sizing
> 2.097th+Extreme VRP expansion - rare, usually post-eventMaximum size. This is the fat pitch.
1.5 to 2.090th - 97thVRP is significantly rich - aggressive selling window75-100% of max size
0.5 to 1.570th - 90thAbove-average VRP - solid premium selling conditions50-75% of max size
-0.5 to 0.530th - 70thAverage VRP - marginal edge, be selective25-50% of max size
-1.0 to -0.515th - 30thCompressed VRP - thin or no edge0-25% of max size
< -1.0Below 15thVRP is negative or deeply compressed - selling vol is -EVZero. Do not sell premium.

The z-score is the single most important filter for VRP trading. A positive VRP with a z-score of -0.8 is telling you that while IV still exceeds RV, the spread is unusually narrow compared to recent history - the risk/reward has deteriorated. Wait for better conditions.

Deep dive: VRP Z-Score: How to Time Premium Selling with Statistical Edge - z-score entry tiers, daily monitoring scripts, and the complete timing framework.

Directional VRP - The Put Side vs Call Side

Total VRP is an average. It masks the real structure of the premium, which is almost always asymmetric. The FlashAlpha VRP endpoint decomposes VRP into put-side and call-side components, revealing where the actual edge sits.

Why Directional VRP Matters

Put options carry a structural premium over calls because institutional hedgers are persistent net buyers of downside protection. This creates a skew premium - the put side of the volatility surface is consistently richer than the call side. When you decompose VRP directionally, you typically see:

  • Put VRP is larger than call VRP in most environments. The crash protection premium inflates put IV above what downside realized vol justifies. This is the norm - roughly 80% of the time.
  • Call VRP is smaller but more consistent. Because call-side hedging demand is lower, call IV is closer to "fair value." The premium is thinner but more stable.
  • The spread between put VRP and call VRP tells you where the edge is. If put VRP is 5.2% and call VRP is 1.1%, the edge is overwhelmingly on the put side. Selling puts has 5x the premium of selling calls.
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

directional = data["directional"]
put_vrp = directional["downside_vrp"]
call_vrp = directional["upside_vrp"]
skew_spread = put_vrp - call_vrp

print(f"Put-side VRP:  {put_vrp:+.2f}%")
print(f"Call-side VRP: {call_vrp:+.2f}%")
print(f"Skew spread:   {skew_spread:+.2f}%")

# Directional decision
if put_vrp > call_vrp * 2:
    print("\nEDGE: Heavily skewed to puts.")
    print("STRATEGY: Sell put credit spreads or naked puts.")
    print("AVOID: Iron condors (call side adds risk for minimal premium).")
elif call_vrp > put_vrp * 1.5:
    print("\nEDGE: Unusual call-side premium. Check for earnings/events.")
    print("STRATEGY: Sell call credit spreads or covered calls.")
elif abs(put_vrp - call_vrp) < 1.0:
    print("\nEDGE: Roughly symmetric. Iron condors are appropriate.")
    print("STRATEGY: Sell strangles or iron condors.")
else:
    print(f"\nEDGE: Moderately skewed to {'puts' if put_vrp > call_vrp else 'calls'}.")
    print("STRATEGY: Skew your position  -  larger size on the richer side.")

When Call VRP Exceeds Put VRP

This is rare in broad market indices but does happen in specific situations:

  • Meme stock euphoria. When a stock experiences extreme upside momentum, call buyers overpay for upside exposure. The call-side VRP can spike above put-side VRP.
  • Pre-earnings on high-momentum names. If traders are positioning for a blow-out quarter with heavy call buying, call IV can become inflated relative to realized upside vol.
  • Short squeeze setups. When short interest is high and calls are being used to force a squeeze, call-side IV can become detached from fundamental vol.

In these cases, selling calls (or call spreads) may offer the better risk/reward - the opposite of the normal playbook.

Why Iron Condors Are Often Suboptimal

Iron condors assume symmetric VRP - equal edge on both sides. In reality, if put VRP is 4.8% and call VRP is 0.9%, your iron condor is essentially a put credit spread that happens to also have a call spread attached. The call spread adds margin requirement and tail risk but contributes almost no premium.

The directional VRP data lets you make a better decision: sell puts when put VRP is rich, sell calls when call VRP is rich, and only use iron condors when the skew spread is narrow (both sides have similar premium). This alone can improve the efficiency of a premium-selling portfolio.

Deep dive: Directional VRP: Why Iron Condors Are Usually Wrong - the full case against symmetric strategies, with alternatives that capture the asymmetric edge.

GEX-Conditioned Regime - When VRP Is Safe vs Dangerous

VRP tells you the size of the premium. It doesn't tell you about the risk environment. A 4% VRP in a positive gamma regime (dealers dampening moves) is a fundamentally different trade than a 4% VRP in a negative gamma regime (dealers amplifying moves). The outcome distribution is the same on average, but the tail risk is radically different.

This is the key insight: VRP harvesting works best when dealer positioning suppresses the very tail events that make selling vol dangerous.

How GEX Regime Affects VRP Trades

The VRP endpoint returns a regime object that includes the current gamma regime, the gamma flip level, and net GEX, plus a vanna_conditioned object with the vanna outlook. Here's what each regime means for your VRP trade:

RegimeVRP LevelAssessmentAction
Positive gammaHigh (z > 1.0)Best case - fat premium AND dealer dampeningFull size. Aggressive premium selling.
Positive gammaLow (z < 0)Safe but thin - dealers are dampening but premium is marginalReduce size. The edge is small.
Negative gammaHigh (z > 1.0)Tempting but dangerous - premium is there but tail risk is elevatedReduce size 50%. Widen strikes. Use defined risk only.
Negative gammaLow (z < 0)Worst case - no premium AND amplified riskSit out entirely. Do not sell premium.
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

vrp_20d = data["vrp"]["vrp_20d"]
z = data["vrp"]["z_score"]
regime = data["regime"]

label = regime["gamma"]
gamma_flip = regime["gamma_flip"]
net_gex = regime["net_gex"]
vanna = data["vanna_conditioned"]["outlook"]

print(f"VRP (20d): {vrp_20d:+.2f}% | Z-score: {z:+.2f}")
print(f"Regime: {label} | Gamma flip: ${gamma_flip}")
print(f"Net GEX: {net_gex:,.0f} | Vanna: {vanna}")

# GEX-conditioned decision matrix
if label == "positive_gamma" and z > 1.0:
    print("\n*** GREEN LIGHT  -  Full size premium selling ***")
    print("Dealers are dampening moves AND VRP is elevated.")
    print("Strategies: short straddle, short strangle, put credit spread.")
elif label == "positive_gamma" and z > 0:
    print("\n*** YELLOW  -  Standard premium selling ***")
    print("Regime is supportive but VRP is only moderately elevated.")
    print("Strategies: iron condor (defined risk), put credit spread.")
elif label == "negative_gamma" and z > 1.0:
    print("\n*** CAUTION  -  Reduce size, widen strikes ***")
    print("VRP is attractive but dealers will amplify any adverse move.")
    print("Strategies: wide iron condor (defined risk only), reduce size 50%.")
elif label == "negative_gamma":
    print("\n*** RED  -  Do not sell premium ***")
    print("No edge AND elevated tail risk. Sit this one out.")
    print("Consider: long straddle if vol is cheap, or simply wait.")

Get VRP + GEX regime in a single API call

The Alpha plan gives you unlimited access to VRP, GEX, volatility surface, and every other endpoint. Build your systematic VRP strategy with real-time data.

View Pricing

The Gamma Flip and VRP Timing

The gamma_flip level tells you the price at which the regime changes from positive to negative gamma (or vice versa). This is critical for VRP trade management:

  • If price is well above the gamma flip (positive gamma territory), your short vol position has the structural wind at its back. Dealers are buying dips and selling rallies, creating the mean-reverting environment that premium sellers thrive in.
  • If price is near the gamma flip, the regime could flip at any time. Size down and set tighter stops.
  • If price crosses below the gamma flip into negative gamma, consider closing short vol positions regardless of P&L. The regime has shifted against you.

Vanna and Charm Effects on VRP

The vanna_conditioned object adds a second-order dimension. Vanna measures how delta changes with implied volatility - when IV drops, vanna-driven flows can amplify the rally (as dealers unwind hedges). When IV rises, vanna can amplify the sell-off.

For VRP trades, vanna matters because:

  • In a positive gamma + positive vanna environment, any IV compression (which is what you're betting on when you sell premium) also creates supportive dealer buying flows. Your trade has a built-in tailwind.
  • In a negative gamma + negative vanna environment, any IV expansion creates additional selling pressure from dealer hedging. Your short vol position faces compounding headwinds.

Deep dive: GEX-Conditioned VRP: Why Dealer Positioning Changes Everything - the full 4-cell matrix with trade examples, regime change triggers, and a regime-aware sizing system.

Strategy Suitability Scores

Knowing that VRP is positive and the regime is supportive answers whether to sell premium. But which structure? A short straddle and an iron condor are both short vol, but they behave very differently in different environments.

The VRP endpoint returns strategy suitability scores (0-100) for five common structures, computed from the current VRP level, directional skew, GEX regime, realized vol, and term structure. These scores are not backtested performance predictions - they're suitability assessments based on current market conditions.

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

scores = data["strategy_scores"]

print("=== Strategy Suitability Scores (0-100) ===")
for strategy, score in sorted(scores.items(), key=lambda x: -x[1]):
    bar = "#" * (score // 5)
    print(f"{strategy:20s} {score:3d}  {bar}")

What Each Score Means

StrategyBest WhenScore Drivers
Short straddleVRP is high, regime is positive gamma, RV is lowRequires wide VRP AND low realized vol. High scores (80+) are the "sell vol" fat pitch - premium is rich and the underlying isn't moving.
Short strangleVRP is moderate-to-high, regime is positive gammaSimilar to straddle but more forgiving. Wider strikes tolerate moderate RV. Scores above 60 indicate good conditions.
Iron condorVRP is moderate, you need defined risk, skew is symmetricFavored when VRP is positive but not extreme, and when put/call VRP are similar. The defined-risk structure suits moderate-confidence environments.
Put credit spreadPut VRP >> call VRP, put skew is steepScores highest when the directional VRP is heavily skewed to puts. The asymmetric structure captures the richer side of the premium.
Calendar spreadVRP term structure is steep (front-month richest)Scores highest when front-month IV is significantly elevated relative to back-month - you're selling expensive front IV against cheaper back IV.
Jade lizardCall VRP is thin, put VRP is fatThe jade lizard (short put + short call spread) eliminates upside risk. Scores highest when put premium is rich but call premium is thin - you don't want call-side exposure anyway.

Using Scores in Practice

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

scores = data["strategy_scores"]
vrp = data["vrp"]["vrp_20d"]
z = data["vrp"]["z_score"]
regime = data["regime"]["gamma"]

# Find the highest-scoring strategy
best = max(scores, key=scores.get)
best_score = scores[best]

print(f"VRP: {vrp:+.2f}% | Z: {z:+.2f} | Regime: {regime}")
print(f"Best strategy: {best} (score: {best_score})")

if best_score >= 75:
    print(f"High conviction  -  {best} is well-suited to current conditions.")
elif best_score >= 50:
    print(f"Moderate conviction  -  {best} is reasonable but size accordingly.")
elif best_score >= 25:
    print(f"Low conviction  -  consider reducing size or waiting for better conditions.")
else:
    print("No strategy scores well. The environment doesn't favor premium selling.")

The strategy scores save you from the most common structural mistake in premium selling: using the same strategy every time regardless of conditions. An iron condor trader who checks the scores might discover that today, a put credit spread scores 82 while the iron condor scores 41 - because put VRP is rich but call VRP is nonexistent. The data tells you which tool fits the job.

Try the VRP endpoint in your browser

The Playground lets you call the VRP endpoint with your API key and see the full response - spreads, z-score, directional VRP, strategy scores, and dealer context.

Open Playground

Deep dive: VRP Strategy Scoring: How to Pick the Right Options Structure - what drives each of the 5 strategy scores, decision trees for tie-breaking, and a full week of daily recommendations.

Dealer Flow Risk - The Hidden Risk in VRP Trades

Most VRP traders think about risk in terms of realized volatility: "If RV spikes above IV, I lose." That's true but incomplete. The more immediate risk for short vol positions is mechanical dealer flow - the forced buying and selling that dealers do to maintain delta neutrality.

How Dealer Positioning Creates Non-Linear Risk

When dealers are net short gamma (which happens when traders are net long options), every point of market movement forces dealers to hedge in the same direction as the move. If SPY drops $2 and dealers are short gamma, they must sell shares to maintain their hedge. That selling pushes SPY lower, triggering more hedging, which pushes it lower still. This is the gamma feedback loop that turns orderly sell-offs into flash crashes.

For a short vol position, this feedback loop is devastating. Your short straddle's loss isn't just from the underlying move - it's from the amplified move that dealer hedging creates. A 1% decline in positive gamma might stay at 1%. The same decline in negative gamma can cascade to 2-3% as dealer hedging amplifies the move.

The Dealer Risk Object

The VRP endpoint includes a dealer_flow_risk score (0-100) that quantifies these dynamics:

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/vrp/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()

risk = data["dealer_flow_risk"]  # 0-100 score

print("=== Dealer Flow Risk Assessment ===")
print(f"Gamma regime:  {data['regime']['gamma']}")
print(f"Gamma flip:    ${data['regime']['gamma_flip']}")
print(f"Harvest score: {data['gex_conditioned']['harvest_score']}")
print(f"Risk score:    {risk}/100")

if risk >= 75:
    print("\nDANGER: Dealer positioning is actively hostile to short vol.")
    print("Do not sell premium. Consider hedging existing short vol positions.")
elif risk >= 50:
    print("\nWARNING: Dealer positioning creates amplified tail risk.")
    print("If selling premium, reduce size by 50% and use defined-risk structures only.")
else:
    print("\nDealer risk is contained. Proceed with normal sizing.")

Integrating Dealer Risk Into Position Sizing

The simplest approach is a multiplier system:

  • Dealer risk 0-25: 100% of intended size. Dealers are dampening moves.
  • Dealer risk 25-50: 75% of intended size. Some hedging pressure exists.
  • Dealer risk 50-75: 50% of intended size. Material amplification risk.
  • Dealer risk 75-100: 0% of intended size. Do not enter new short vol trades.

This is the edge that separates systematic VRP traders from retail premium sellers. Both might see a 4% VRP and think "sell." The systematic trader also checks dealer risk and discovers that negative gamma + vanna-driven selling pressure means the tail distribution is 2x wider than normal. Same premium, radically different risk.

Building a Systematic VRP Strategy

Here's a complete daily VRP workflow that integrates everything covered so far - VRP spreads, z-score, directional analysis, GEX regime, strategy selection, and position sizing. This is a framework, not a backtest - adapt the thresholds to your risk tolerance and account size.

import requests
from datetime import datetime

API_KEY = "YOUR_API_KEY"
BASE = "https://lab.flashalpha.com"

def get_vrp(symbol):
    """Pull VRP data for a symbol."""
    resp = requests.get(
        f"{BASE}/v1/vrp/{symbol}",
        headers={"X-Api-Key": API_KEY}
    )
    return resp.json()

def get_volatility(symbol):
    """Pull volatility surface data for entry timing."""
    resp = requests.get(
        f"{BASE}/v1/volatility/{symbol}",
        headers={"X-Api-Key": API_KEY}
    )
    return resp.json()

def assess_trade(symbol):
    """Full VRP trade assessment."""
    data = get_vrp(symbol)
    vol = get_volatility(symbol)

    vrp = data["vrp"]
    z = vrp["z_score"]
    pct = vrp["percentile"]
    directional = data["directional"]
    regime = data["regime"]
    scores = data["strategy_scores"]
    risk = data["dealer_flow_risk"]

    print(f"\n{'='*50}")
    print(f"  VRP Assessment: {symbol}")
    print(f"  {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    print(f"{'='*50}")

    # Step 1: Is VRP positive and significant?
    print(f"\n1. VRP SPREAD")
    print(f"   20-day VRP: {vrp['vrp_20d']:+.2f}%")
    z_str = f"{z:+.2f}" if z is not None else "N/A"
    pct_str = f"{pct:.0f}th" if pct is not None else "N/A"
    print(f"   Z-score:    {z_str} ({pct_str} percentile)")

    if z < -0.5:
        print("   VERDICT: VRP is too thin. No trade today.")
        return None

    # Step 2: What's the regime?
    print(f"\n2. GEX REGIME")
    print(f"   Regime: {regime['gamma']}")
    print(f"   Gamma flip: ${regime['gamma_flip']}")

    if regime["gamma"] == "negative_gamma" and (z is None or z < 0.5):
        print("   VERDICT: Negative gamma + thin VRP. No trade.")
        return None

    # Step 3: Dealer risk check
    print(f"\n3. DEALER RISK")
    print(f"   Risk score: {risk}/100")

    if risk < 25:
        size_multiplier = 1.0
    elif risk < 50:
        size_multiplier = 0.75
    elif risk < 75:
        size_multiplier = 0.5
    else:
        size_multiplier = 0.0

    if size_multiplier == 0:
        print("   VERDICT: Dealer risk too high. No trade.")
        return None

    # Step 4: Directional analysis
    print(f"\n4. DIRECTIONAL VRP")
    put_vrp = directional["downside_vrp"]
    call_vrp = directional["upside_vrp"]
    print(f"   Put VRP:  {put_vrp:+.2f}%")
    print(f"   Call VRP: {call_vrp:+.2f}%")

    # Step 5: Strategy selection
    print(f"\n5. STRATEGY SCORES")
    for strat, score in sorted(scores.items(), key=lambda x: -x[1])[:3]:
        print(f"   {strat:20s} {score:3d}/100")

    best = max(scores, key=scores.get)
    best_score = scores[best]

    # Step 6: Position sizing
    base_size = 1.0  # Normalize to 1.0 = full position
    z_adj = min(z / 2.0, 1.0)  # Scale with z-score, cap at 1.0
    final_size = base_size * z_adj * size_multiplier

    print(f"\n6. POSITION SIZING")
    print(f"   Base:       {base_size:.0%}")
    print(f"   Z-adj:      {z_adj:.0%}")
    print(f"   Risk adj:   {size_multiplier:.0%}")
    print(f"   Final size: {final_size:.0%}")

    print(f"\n{'='*50}")
    print(f"  RECOMMENDATION: {best} at {final_size:.0%} size")
    vrp_20 = vrp['vrp_20d']
    print(f"  Score: {best_score}/100 | VRP: {vrp_20:+.2f}%")
    print(f"{'='*50}")

    return {
        "symbol": symbol,
        "strategy": best,
        "score": best_score,
        "size": final_size,
        "vrp": vrp["vrp_20d"],
        "z_score": z,
        "regime": regime["gamma"]
    }

# Run assessment for a watchlist
watchlist = ["SPY", "QQQ", "IWM", "AAPL", "TSLA"]
results = []

for sym in watchlist:
    try:
        result = assess_trade(sym)
        if result:
            results.append(result)
    except Exception as e:
        print(f"Error processing {sym}: {e}")

# Summary
if results:
    print(f"\n\n{'='*50}")
    print("  TODAY'S TRADEABLE VRP OPPORTUNITIES")
    print(f"{'='*50}")
    for r in sorted(results, key=lambda x: -x["score"]):
        print(f"  {r['symbol']:5s} | {r['strategy']:20s} | "
              f"Score: {r['score']:3d} | Size: {r['size']:.0%} | "
              f"VRP: {r['vrp']:+.2f}% | {r['regime']}")
else:
    print("\nNo tradeable VRP opportunities today. Sit tight.")

VRP History for Backtesting

The /v1/vrp/{symbol}/history endpoint returns a daily time series (up to 365 days) with per-day VRP spreads, realized vol windows, ATM IV, and straddle prices. Call it once to pull the full lookback needed for regime analysis or backtesting. If you want to archive snapshots incrementally, a nightly cron job against the live endpoint works too - both approaches give you the same history.

Risk Management Rules

No VRP strategy works without discipline on the risk side. Here are the rules that keep you in the game:

  • Max portfolio allocation to short vol: Never allocate more than 15-20% of portfolio notional to short vol positions across all names. VRP is a persistent edge, but concentration kills.
  • Per-position max loss: Define your max loss before entry. For undefined risk strategies (straddles, strangles), set a hard stop at 2x the credit received. For defined risk (iron condors, spreads), the max loss is already defined by the wings.
  • Regime-based exit: If the GEX regime flips from positive to negative gamma while you're in a trade, close 50% immediately regardless of P&L. The thesis has changed.
  • VRP inversion exit: If the VRP z-score drops below -1.0, close all short vol positions. The premium has collapsed and you're now exposed to naked risk with no compensation.
  • Calendar-based rules: Reduce size by 50% going into FOMC, CPI, and NFP. Eliminate short vol entirely on the day of the event unless VRP z-score is above 2.0 (extreme premium compensates for event risk).
  • Correlation awareness: If you're short vol on SPY, QQQ, and IWM simultaneously, you have one trade, not three. Size as if it's a single position in "short market vol."

Common Mistakes in VRP Trading

After covering the mechanics, let's address the most frequent errors that undermine VRP strategies - even for traders who understand the concept.

Mistake 1: Selling Premium When VRP Is Negative

This is the single most expensive retail mistake. VRP is negative roughly 25-30% of trading days, and those days often cluster during the exact periods when selling premium feels most tempting - after a spike in IV that makes option premiums look "juicy." The problem is that if RV is running above IV, those premiums aren't juicy - they're fairly priced or cheap. You're selling insurance below actuarial cost.

The fix: Check VRP before every trade. If vrp_20d is negative or the z-score is below -0.5, don't sell.

Mistake 2: Ignoring Dealer Positioning

A 4% VRP in positive gamma has a realized loss tail that's fundamentally different from a 4% VRP in negative gamma. In positive gamma, dealers absorb shocks. In negative gamma, they amplify them. The same VRP reading, the same strategy, but the risk profile is night-and-day.

The fix: Always check regime.gamma and dealer_flow_risk. In negative gamma, cut size by at least 50% or use defined-risk structures only.

Mistake 3: Not Adjusting for Term Structure

If front-month VRP is 2% but 30-day VRP is 5%, selling weekly options is suboptimal - the edge is in the back months. The VRP term structure tells you which expiration cycle has the richest premium relative to expected realized vol. Ignoring it means you're often selling the cheapest part of the curve.

The fix: Compare VRP across all four windows and the term_vrp array. If 30-day VRP is significantly wider than 5-day VRP, consider calendar spreads or longer-dated premium selling.

Mistake 4: Over-Sizing Because VRP "Seems Safe"

VRP is persistent, but it has fat tails. The distribution of VRP outcomes is not normal - it's positively skewed with a long left tail. This means your average day is a small win, but your worst day is a much larger loss than a normal distribution would predict. Position sizing must account for these tails.

The fix: Size based on worst-case loss, not average return. Use the z-score as a sizing guide, but cap maximum position size at a level where a 3-sigma adverse move doesn't threaten the portfolio.

Mistake 5: Using Symmetric Strategies When VRP Is Directional

If put VRP is 5% and call VRP is 0.5%, an iron condor is 90% a put trade. The call spread adds margin, adds risk, and contributes almost nothing to total premium. You're better off selling a put credit spread and using the freed-up margin for another position or keeping it as a risk buffer.

The fix: Check directional. If downside_vrp is more than 2x upside_vrp, tilt your structure toward the richer side.

Read the full VRP API documentation

Every field, every response object, every parameter - documented with examples. Understand exactly what the endpoint returns before you build on it.

VRP API Docs

The Kinks - Subtle Mistakes That Survive the Basic Checklist

The five execution mistakes above are the obvious ones. They're also the ones most VRP resources cover. The kinks below are the ones that catch traders after they've already internalized the basics - the subtle traps that persist even when you're checking VRP, z-score, and regime.

Kink 1: High IV Rank Is Not the Same as Rich VRP

IV Rank tells you where today's implied volatility sits within its 52-week range. A rank of 80 means IV is higher than 80% of readings over the past year. This feels like a strong signal to sell. It's not - not by itself.

VRP is the spread between IV and realized vol. IV Rank says nothing about what RV is doing. If IV has been in a low range for a year and recently jumped to 20% (rank: 80), but the underlying has been moving violently and 20-day RV is 24%, the IV Rank looks great while the actual VRP is deeply negative. You're selling into a bad trade that looks like a good one on the surface.

The correct filter is VRP z-score - which normalizes the IV-minus-RV spread against its own history, not just IV against its history. High IV Rank with low VRP z-score is a trap that catches experienced traders who've learned the IV Rank heuristic but haven't made the step to measuring the full spread. See IV Rank vs IV Percentile: Which to Use for why the distinction matters and how VRP z-score replaces both as the cleaner signal.

Kink 2: Single-Name VRP Around Earnings Is Not Index VRP

The VRP edge on index options (SPY, QQQ, IWM) is structural and persistent because it's driven by diversified institutional hedging demand across hundreds of names. Single-stock VRP has a different character, and earnings cycles break the analogy almost completely.

Before an earnings announcement, a single name's IV spikes to price in the unknown binary event. After the event, IV collapses (IV crush). The pre-earnings IV spike creates the illusion of a large positive VRP - implied vol looks much higher than the trailing 20-day RV. But the trailing RV doesn't include the event move you're now exposed to. The "VRP" you think you're being paid to harvest includes compensation for a discrete jump risk that your realized-vol estimator isn't capturing.

The practical implications:

  • Don't sell single-name options in the 5-7 days before earnings using a standard VRP signal. The z-score will often be elevated (IV is high relative to recent RV), but that reflects event risk compensation, not a harvestable premium.
  • Post-earnings, the signal is cleaner. After the event resolves, if IV stays elevated because the market is still jittery but RV is settling back down, that's a genuine VRP opportunity. The z-score reflects actual harvest potential.
  • Index VRP is more reliable as a timing filter for single-name decisions. When SPY VRP is positive and z-score is elevated, single-name VRP tends to be more reliable too. When index VRP is negative or compressed, even single-name plays with nominally positive VRP carry elevated correlation risk.

Kink 3: Not Sizing for IV Expansion, Only for RV

Standard VRP sizing accounts for the probability that RV exceeds IV (negative VRP realization). It doesn't directly account for the risk that IV itself expands mid-trade even if RV ultimately stays below IV.

Consider a short strangle where VRP is 4% and z-score is 1.2 at entry. A week later, a macro shock spikes IV by 6 points. RV hasn't moved - the underlying is still trading quietly. Your short strangle is underwater simply because implied volatility expanded. You're right about realized vol, but you're losing on vega.

VRP harvest is a theta-and-vega trade. Theta earns you premium over time; vega costs you if IV expands before the trade has time to decay. For strategies with significant vega exposure (short straddles, strangles), size as if IV could expand 50-100% from current levels mid-trade, not just as if RV could spike. In practice this means:

  • Use the /v1/volatility/{symbol} endpoint to check the current vol surface shape and term structure. A steeply inverted term structure (front IV much higher than back IV) indicates the market is already pricing in near-term stress - your vega risk is elevated.
  • For z-scores between 0.5 and 1.0, use defined-risk structures (spreads over naked positions) to cap vega exposure even if VRP is nominally positive.
  • If IV is already at an elevated absolute level (VIX above 25), your short options have larger vega per dollar of premium. The same dollar premium gives you more exposure to adverse IV moves than it would in a low-vol environment.

Kink 4: Pins and Walls Drifting Into Short Strikes

When you sell an iron condor or credit spread, you choose strikes based on probability, VRP richness, or delta targets. But the options market has a structural quirk that can make those strikes move from "safely OTM" to "at risk" without the underlying trending: gamma walls and dealer pinning effects.

Large open interest clusters at specific strikes create dealer hedging pressure that can pin prices to those strikes near expiration. But they can also act as magnets or repellers depending on the gamma regime. In positive gamma, a large OI strike above current price tends to act as a ceiling - good for your short call. In negative gamma, that same wall can become a magnet as dealers scramble to hedge, pulling the underlying toward it.

The GEX endpoint (/v1/exposure/gex/{symbol}) returns strike-level gamma exposure, identifying exactly where the walls are and which direction the gravitational pull favors. For VRP traders, this has two uses:

  • Strike selection: When selling spreads, check that your short strikes aren't clustered near large negative GEX strike levels, which are zones of potential amplified movement. Put your short strikes on the far side of a positive GEX wall where dealers act as a cushion.
  • Trade management: If the underlying is drifting toward a short strike and the GEX structure shows that strike is a negative-GEX zone (dealers would amplify movement through it), close the trade before the strike is breached. Don't wait for the loss to materialize.

Kink 5: The Realized-Vol Estimator Matters More Than You Think

The "RV" in the VRP formula looks simple: it's just historical volatility. But the choice of realized-vol estimator changes your VRP reading significantly, and some estimators are systematically better predictors of future volatility than others.

The two common choices are:

Close-to-Close (standard) $$ \sigma_{CC} = \sqrt{\frac{252}{n} \sum_{i=1}^{n} \left(\ln \frac{C_i}{C_{i-1}}\right)^2} $$
Yang-Zhang (OHLC) $$ \sigma_{YZ}^2 = \sigma_{OC}^2 + k \cdot \sigma_{CC,YZ}^2 + (1-k) \cdot \sigma_{RS}^2 $$

Here \(k = 0.34 / (1.34 + (n+1)/(n-1))\) is the weighting coefficient that minimises the estimator variance given sample size \(n\); \(\sigma_{OC}^2\) is the overnight (open-to-close) variance, \(\sigma_{RS}^2\) is the Rogers-Satchell intraday range variance. See Yang-Zhang vs Close-to-Close Realized Volatility for the full derivation.

Close-to-close volatility uses only closing prices. It's simple, widely used, and easy to replicate. Yang-Zhang uses opens, highs, lows, and closes - all four price points - and is roughly 4-8x more statistically efficient than close-to-close for the same number of observations. Practically, Yang-Zhang produces a lower RV estimate during overnight-gap-heavy regimes and a higher estimate during intraday-range-heavy regimes.

Why this matters for VRP:

  • Close-to-close underestimates RV in high-intraday-range environments. If the market is making large intraday swings but closing near where it opened, close-to-close says RV is low. Yang-Zhang says it's elevated. The true VRP is smaller (or negative) than close-to-close implies - you're about to sell vol that's cheaper than it looks.
  • Close-to-close overestimates RV in gap-heavy, low-intraday-range environments. If the market is gapping overnight but barely moving during the day, Yang-Zhang will show lower RV. The VRP appears smaller on close-to-close, potentially causing you to skip a genuinely rich selling opportunity.
  • FlashAlpha's main /v1/volatility and VRP endpoints compute realized vol close-to-close (log returns, sample standard deviation, annualised by √252). Range-based estimators including Yang-Zhang are available separately on /v1/volatility/realized/{ticker} (Alpha). Whichever you use, don't mix estimators across the two legs of a single VRP comparison - that can create phantom signals.

Want Yang-Zhang-based VRP readings without building the estimator yourself? The /v1/vrp/{symbol} endpoint computes all four VRP windows using Yang-Zhang RV. See pricing for Alpha plan access.

Kink 6: Regime Dependence in Persistent Negative-Gamma Trends

The GEX regime check (positive vs negative gamma) is a snapshot. The more dangerous situation is a persistent negative-gamma trend - an extended period where the underlying is in a sustained directional move and dealers are continuously short gamma throughout.

In these environments, the mechanics of VRP harvesting break down structurally. The mean-reversion that VRP sellers rely on - the thing that makes short straddles profitable - depends on the underlying trading in a range. A sustained trend means the underlying is not mean-reverting. It's trending. Each day, one of your short strikes gets closer to the underlying. Your theta earn is overwhelmed by the delta loss from the trend direction, and your gamma short is amplified by dealer hedging at every step.

The tell is in the term structure of GEX, not just the spot reading. If the gamma flip has been below current price for 10+ consecutive days, you're not in a normal negative-gamma period - you're in a trend regime. In trend regimes:

  • Short straddles and strangles are the wrong structure. You're not harvesting range, you're fighting momentum.
  • If you sell premium at all, only sell in the direction of the trend - put credit spreads in a downtrend, call credit spreads in an uptrend. This converts VRP harvesting into a directional premium strategy rather than a neutral one.
  • The z-score can still be elevated in a trend. IV often rises with realized vol in a trending market, but the z-score may stay positive because IV is rising even faster than RV. This is a false positive for premium selling - the premium reflects trend continuation risk, not harvestable variance risk.
  • Wait for the gamma flip to re-establish above current price (for bullish trends) before resuming neutral VRP harvesting. The structural tailwind from dealer dampening needs to be in place again before selling premium with full conviction.

Workflow reference: See VRP Trading: From Signal to Execution - The Complete Workflow for how to weave regime checks, kink filters, and sizing rules into a daily pre-trade checklist.

Tooling - Endpoints and MCP Connector

Everything in this guide - VRP spreads, z-scores, directional decomposition, regime context, strategy scores, and historical snapshots - flows from three FlashAlpha endpoints:

EndpointReturnsPrimary Use
GET /v1/vrp/{symbol}VRP 5d/10d/20d/30d, z-score, percentile, directional VRP, strategy scores, GEX regime (gex_conditioned.harvest_score), vanna outlook (vanna_conditioned.outlook), dealer flow risk, macro contextDaily pre-trade assessment. The single call that tells you whether to sell and at what size.
GET /v1/vrp/{symbol}/historyDaily time series (up to 365 days): per-day VRP spreads, RV windows, ATM IV, straddle price - populated nightly after market closeBacktesting, regime analysis, trend identification across VRP z-score history.
GET /v1/volatility/{symbol}Realized vol windows, IV-RV spreads, skew profiles, term structure, ATM IV per tenor, GEX by DTE, theta decay, liquidity analysisStrike selection, vega sizing, term structure comparison for calendar spreads.
GET /v1/exposure/gex/{symbol}Gamma exposure by strike: call/put GEX, OI, volume, day-over-day OI changes, gamma flip, net GEX labelStrike selection around GEX walls, trade management near negative-GEX zones.

All three are available on the Alpha plan. Authenticate with an X-Api-Key header. Base URL: https://lab.flashalpha.com.

MCP Connector - Premium Seller Persona for AI Workflows

If you're building with an AI assistant or running automated analysis, FlashAlpha exposes an MCP (Model Context Protocol) connector scoped to the premium-seller toolset. This gives any MCP-compatible AI agent - Claude, Cursor, VS Code Copilot, or a custom agent - direct access to live VRP data, volatility surface data, and historical context through natural language.

MCP Premium-Seller Endpoint

OAuth (recommended): https://lab.flashalpha.com/mcp-oauth/premium

API Key: https://lab.flashalpha.com/mcp/premium (send X-Api-Key header)

The OAuth endpoint is the standard path for customer-facing integrations. Use the API Key path for server-side scripts and automation where you control the credential.

With the MCP connector loaded, you can ask an AI assistant questions like "Is SPY VRP rich enough to sell a strangle today?", "Compare VRP z-scores across SPY, QQQ, and IWM and rank the best opportunity," or "Pull SPY VRP history for the last 30 days and flag any regime changes." The AI calls the FlashAlpha endpoints live, interprets the response, and delivers a premium-seller-focused answer without you needing to write a single line of code.

This is particularly useful for the signal-to-execution workflow - the MCP connector can run the full pre-trade checklist (VRP spread, z-score, regime, strategy scores) against your watchlist in a single prompt, surfacing only the names that clear all filters.

Need MCP access or a plan upgrade?

The MCP premium-seller connector and all VRP + volatility endpoints require the Alpha plan. One call returns VRP spreads, regime, strategy scores, and historical context - no pipeline needed.

Upgrade to Alpha

Get the Data

The VRP endpoint is available on the Alpha plan ($1,199/mo annual, unlimited requests). A single API call returns everything covered in this guide:

  • VRP spreads across 4 windows (5d, 10d, 20d, 30d)
  • Z-score and percentile for context vs trailing 60-day history
  • Directional VRP - downside and upside VRP decomposition with wing IVs
  • VRP term structure - which expiration cycle has the richest premium
  • GEX-conditioned regime - gamma regime, harvest score, gamma flip level, net GEX
  • Strategy suitability scores - 0-100 ratings for five common structures (can be null)
  • Dealer flow risk - 0-100 risk score for dealer rebalancing pressure
  • Macro context - VIX, VIX 3M, term slope, Treasury yields, credit spreads
  • Daily history - pull up to 365 days of per-day VRP spreads, realized vol, ATM IV, and straddle prices via /v1/vrp/{symbol}/history; or archive incrementally with a nightly cron against the live endpoint

Get API Access VRP API Docs Try It in the Playground

Related Reading

VRP Deep Dives

Related Concepts

The volatility risk premium is the most persistent edge in options markets - but persistence doesn't mean permanence. VRP is positive most of the time, which is exactly why undisciplined sellers eventually blow up: they confuse "usually works" with "always works."

The difference between a profitable VRP strategy and a blown account is five data points: the VRP spread (is it positive?), the z-score (is it rich?), the directional decomposition (where's the edge?), the GEX regime (are dealers helping or hurting?), and the dealer risk level (is the tail fat?). Every one of those is available in a single API call to /v1/vrp/{symbol}.

Without this data, you're selling premium based on how options "look" on your broker's chain - the same thing every retail trader does before the market teaches them an expensive lesson. With it, you know whether the edge exists before you risk a dollar.

That's the difference between trading VRP and hoping VRP is there.

Live Market Pulse

Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.

Intelligent Screening

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

Export-Ready

Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.

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!