Published on

Realized Volatility Distributions and What They Tell Us | With stories of the Bond Vigilantes, Spot Vol Correlation, and Vol Trades

Authors
  • avatar
    Name
    Teddy Xinyuan Chen
    Twitter

It's been a while since I wrote on this blog. One thing I'm learning recently is volatility modeling - recent market regime shift fascinates me.

From increased correlation bewteen bond and equities, to how the options markets price vol, and how market reacted negatively to good news (good news is bad news - 1/10/2025 dump after NFP beat), and spot vol correlation. I have so many things I wanted to write about but didn't, but I'll talk about them briefly here.

Table of Contents

The Bond Vigilantes

The bond market participants clearly did not like Fed's 50 bps cut at the FOMC on 9/18/2024. Normally rate cut means lower yields and thus higher bond prices, but the 10 year bond started dumping since that day, and all the way down until we got a colder than expected CPI data on 1/15/2025.

ZN daily chart, the red verticle lines are dates where FOMC was hosted

It was until after the painful Powell Plunge on 12/18/2024 that I learned about the Bond Vigilantes - they protest the Fed's monetary policy by pushing the bond price to the other direction, thus influcencing the future policy path (in this case, forcing the Fed to slow / halt cuts).

Clinton political adviser James Carville said at the time, "I used to think that if there was reincarnation, I wanted to come back as the president or the pope or as a .400 baseball hitter. But now I would like to come back as the bond market. You can intimidate everybody."

https://en.wikipedia.org/wiki/Bond_vigilante

Higher 10 year yield -> higher rates (in the future) -> bonds more attractive to equities compared to before -> equities priced out cuts and dump

No that's not the main reason obviously. Cheaper cost of lending is good for business.

Did change in spot and implied vol correlation warn us? | We're heading into a deadly storm, but many are unaware of the pending danger

I believe it did.

SPX at the top, below are SPX's correlation efficient and beta against SPX implied vol: VIX1D, VIX9D, VIX, all the way to VIX1Y. Blue lines are correlation coefficient while red lines are beta.

Normally equity prices have negative correlation with implied vol, i.e., spot up vol down, and vice versa. In some commodities like gold the correlation is positive.

SPX implied vol is driven by SPX option prices. Vol up -> more demand for long options, it could be puts, calls, or both. Cboe also have indices for only the bid or ask side of VIX, the tickers are VWA and VWB.

In the chart above you can clearly see that the beta (red lines) started to creeping up (signaling de-correlation of spot and IVs across expiration dates) days or weeks before the infamous 8/5 drop caused by carry trade unwinding and the 12/18 one, where SPX dumped nearly 3% in just 2 hours in response to a hawkish Fed.

Knowing when to de-risk is crucial so that you don't get wiped out in regime shifts - the chart above and the intraday version of it is one of the many things I added to the things to monitor daily and intraday.

Big money increasing short, medium and long term hedge into 12/18/2024, the Powell Plunge, while retail still in election rally euphoria

What exactly is a "Vol Trade"?

I first heard about the term when I was learning about VRP, volatility risk premium, or "premia", as the quants like to call them. VRP states that option sellers win in the long run because IV>RV in the long run.

The retail do not have access to clearnly express their views on this with OTC variance swap (Cboe has the new VA futures, but it's not liquid at all, sadly), the economically viable way for them to trade VRP is to long or short ATM straddles. Replicating variance swaps is possible, but need very large accounts and liquid chains across strikes - if you have that account size, just ask your JPM or GS trade desk to short variance swap for you.

Vol trades can also refer to the plays to vol tickers. They say that shorting long vol ETPs (that tracks 1-month constant maturity long VIX futures, or LONGVOL) is free money, and I generally agree. But choosing the right instrument used to short them is crucial:

  • Since we all know about vol drag, we won't long short vol ETPs, it's just not optimal
  • Vol is sticky (or "vol is clustered", as they say in the books). The 2020 COVID shock took many, many month to revert to the long term mean. If using options you are on a timer.
  • Shorting VXX/UVXY shares? I tried this, the returns are okay, but not amazing. You want to get in near the top and be sure that there isn't another huge spike following, and have enough cash left to avoid liquidation if in case of another spike. Good for patient people.
  • Long puts on long vol products? Tried this too. Longed UVXY 1 week out OTM puts, Could've gotten 300% return but I got out at 100%. If doing this I have to be aware of how vol of vol affect the pricing, see How Options Confuse Directional Traders from my new fav derivatives blog Moontower.
    • The path my puts went through weren't pretty. I entered the trade on 1/10/2025, and that wasn't the bottom yet. 1/13 was the bottom. The position lost 70% value before vol got crushed a bit and it came back near break even.
  • Verticle spreads - will have to try this one to know how much profit it can provide. You lose convexity but it's sure safer than outright puts.
  • Futures and futures spreads? You better have a large account and know what you're doing. If you shorted VX that traded at 20, and it spiked to 64 (unlikely, but it happend a few times), you lost 44000 per contract. Accounting for the margin, I think you need 60k cash to safely short 1 contract.
    • Short back month or medium term for less PnL swings

I'm still learning what view on vol option trades expresses and how to assess if vol is over or under priced, and the Moontower blog has been some great reads:

Textbook definition of a vol trade where V is a continuously delta-hedged portfolio (The Volatility Smile (Emanuel Derman))

Realized Volatility

I do not know if we're out of the woods after the 1/15/2025 CPI data. Macro factors, like inflation (we're not past that yet - on 2/7 the UoM data brought back the Blood Red Friday we've seen in weeks), tariffs (and the implication on US economy), are some of the dark clouds I'm seeing. The recent huge weekend gaps showed us how fragile the market is.

I'm learning vol modeling to better understand where we're more likely to go the next day.

In the book Volatility Trading, Sinclair, I really like these quotes:

I am a trader. I am not a mathematician, financial engineer, or philosopher. My success is measured in profits. The tools I use and develop need only be useful. They need not be consistent, provable, profound, or even true. My approach to trading is mathematical, but I am no more interested in mathematics than a mechanic is interested in his tools. However, a certain level of knowledge, familiarity, and even respect is needed to get the most out of these tools.

The book talked about different ways to quantify (measure) vol, the Stylized Facts about Returns and Volatility, and vol forecasting.

It said that volatility distribution is significantly different in bull and bear markets, so I wrote some code to use the Yang-Zhang realized vol model that can deal with opening jumps to see for myself.

The data source is SPX's daily OHLC, RV is measured in rolling 20 trading day windows. 1 year has 252 trading days.

# author: me
def calculate_daily_rv(df, window=20, trading_periods=252) -> pd.Series:
    """
    Calculate daily realized volatility with yang-zhang
    """
    # Calculate logarithmic returns
    df['log_hoD'] = np.log(df['High'] / df['Open'])
    df['log_loD'] = np.log(df['Low'] / df['Open'])
    df['log_coD'] = np.log(df['Close'] / df['Open'])
    df['log_ocD'] = np.log(df['Open'] / df['Close'].shift(1))
    df['log_oc_sqD'] = df['log_ocD'] ** 2
    df['log_ccD'] = np.log(df['Close'] / df['Close'].shift(1))
    df['log_cc_sqD'] = df['log_ccD'] ** 2
    
    # Calculate RS
    df['rsD'] = df['log_hoD'] * (df['log_hoD'] - df['log_coD']) + \
                df['log_loD'] * (df['log_loD'] - df['log_coD'])
    
    # Calculate volatility components
    df['close_volD'] = df['log_cc_sqD'].rolling(window=window).sum() / (window - 1)
    df['open_volD'] = df['log_oc_sqD'].rolling(window=window).sum() / (window - 1)
    df['window_rsD'] = df['rsD'].rolling(window=window).sum() / (window - 1)
    
    # Calculate k factor
    k = 0.34 / (1.34 + (window + 1.0)/(window - 1.0))
    
    # Calculate final realized volatility
    rv = np.sqrt((df['open_volD'] + k * df['close_volD'] + 
                  (1 - k) * df['window_rsD']) * trading_periods)
    
    return rv

def plot_volatility_distribution(symbol='^SPX', start_date='1990-01-01', end_date='2024-02-08', window=20, trading_periods=252):
    # Download data
    spx = yf.download(symbol, start=start_date, end=end_date)
    
    # Calculate 30-day realized volatility
    volatility = calculate_daily_rv(spx, window=window, trading_periods=trading_periods)
    
    # Create histogram data
    hist, bins = np.histogram(volatility.dropna(), bins=30, density=True)
    bin_centers = (bins[:-1] + bins[1:]) / 2
    # print(hist)
    
    # Create the plot
    fig = go.Figure()
    
    fig.add_trace(go.Bar(
        x=bin_centers,
        y=hist,
        name='Volatility Distribution',
        marker_color='rgb(55, 83, 109)'
    ))
    
    fig.update_layout(
        title=f'Distribution of 30-Day Volatility for {symbol} from {start_date} to {end_date}',
        xaxis_title=f'Yang-Zhang Realized Volatility | {window=} {trading_periods=}',
        yaxis_title='Proportion',
        template='plotly_white',
        showlegend=False,
        width=800,
        height=500
    )

    # save to ./htmls/ with proper name
    fig.write_html(f'./htmls/yang-zhang-rv-{symbol}_{start_date}_{end_date}_{window}_{trading_periods}.html', include_plotlyjs='cdn')
    
    return fig

# Generate and show the plot
fig = plot_volatility_distribution()
fig.show()

And here's what it looks like:

https://g.teddysc.me/bac31f775a12709b598ad14aeb05556d?m - include every year since 1990

1990 to Now

Charts are scrollable in interactive.

This shows that vols are roughly lognormally distributed over a long enough period of time.

2020 with COVID crash

2022, most recent bear market with large chop in both directions

This chart tells it all - and this is why we respect traders only relying on TA and managed to survive or even thrive in 2022.

2024, historic bull run, but with 8/5 and 12/18

Fat-tailed, or should I say, "vol with Excess Kurtosis"?

Reading Materials for the Eager Learners

  • The Creature from Jekyll Island (Fed history, it talked about how evil the central banks are, and about those how those in power created a system that's trash. Not technical, not a textbook)
  • Any of the interest rate derivatives books - quite hard core for uniniated learner like me at this moment
  • Financial Risk Manager Handbook (VaR, vol models like GARCH, but vol is not the main topic of this book)
  • Volatility Trading, Sinclair
  • Moontower blog by Kris, ex options MM at SIG (sig.com)
  • NYU Stern V-Lab provides basic charting tools and historical realized vol data from different models
  • Benn Eifert's thread on vol / tail sellers that got wiped out in the 2020 crash: https://threadreaderapp.com/thread/1881718208828477814.html

    Some of these excessive losses were caused as banks unwound their long-dated exotic derivatives positions at adverse prices, which you can argue is unfair, but at the same time it's basic portfolio management, its why you don't sell lots of vol and tails and load up on exotics

  • Benn Eifert on vol: https://threadreaderapp.com/thread/1878131885156741268.html
VIX in backwardation in March 2020, and it stayed in backwardation well after the peak into April