# Is Implied- and Historical Volatility based on solely Business days?

I'm trying to compare historical and implied volatility for different stocks. Still, since I can't tell what these numbers are based on (for historical volatility) and referring to (for Implied), I'm unable to compare the two effectively.

Thus I'm asking A: What is historical volatility based on. Is it only the closing prices for the last recorded i.e 30 business days or does the value refer to the last 30 days overall, including potential holidays and weekends? And how do you know the answer to this question?

B: Is 30-day Implied volatility solely calculated using options premium pressure for the last 30 days overall or does that too include potential holidays/weekends etc, meaning that it at times might be calculated with less or more observations, depending on the time of the month or year?

Furthermore does Implied volatility (30) represent a prediction for the next 30 business days or regular 30 days, again referring to days including or excluding holidays or/and weekends? And for B too, how did you find out the answer to this question and would you please (if you can) link a source in your answer?

Thank you sooo much to you who took your time to ease my mind! :-)

• If the market is open for trade, it counts, if not then it doesn't. But the fact is that it is based on the last 30 tradeable days. Commented Nov 1, 2023 at 3:44

A) For historical vol (HV), also called realized vol (RV), usually the so called close-to-close estimator is used, but more sophisticated methods to estimate HV exist as well (see for example R). HV can be any number of trading days you choose and the close-to-close estimator is computed as the annualised standard deviation of log returns (further down is a python code computing this in one line). The name close-to-close comes from the use of closing prices for the computation. The syntax is as follows:

round(np.std([np.log(df.Price[i]/df.Price[i+1]) for i in range(0,9)], ddof = 1) * 100) * np.sqrt(260)*100, 3)

In plain words, you take the log of the ratio of closing prices of consecutive trading days (for the number of days you chose, 10 here) and compute the sample standard deviation (that is why ddof = 1 is used), which in turn is annualized by the sqrt(260), which is the number of (assumed) trading days in a year.

An excel replication of Bloomberg's HVT can be found here.

B) 30 day implied vol uses current option prices that expire in 30 calendar days (or some blend / interpolation to get to that number). Below is a screenshot from Bloomberg's OVME. You can see that 1M refers to a full month and 30 day IV will refer to 30 calendar days.

Therefore, if you want to compare HV with IV, you need to take into account that 30 day HV refers to the last 30 trading days whereas IV will be the next 30 calendar days. So you either shift RV back, or IV forward in your time series. However, comparison of HV and IV is generally misleading as will be explained below.

TL;DR What follows will be a generic explanation, largely copy pasted from existing stuff I wrote for other answers.

It's interesting that you want to compare things although you don't even know what they are. Generally, you should not use HV to price options and consequently it is not very useful to compare HV to IV. Especially not for something volatile and prone for large jumps and if the strike is not ATM.

The example below will demonstrate this nicely. Assume you look at AMC options, say AMC 8/18/23 C6.5. Below is a screenshot from the exchange, Bloomberg's OMON screen (a screen displaying option quotes, and some computed metrics like IV). As you can see, plugging IV (as computed by Bloomberg) into Black Scholes Merton (BSM in the code), assuming 365 days a year, yields the correct price (it pays no dividends, and when I did this exercise, there were 9 extra hours left to expiry, which is why one needs to add these hours to be precise - that is \$m = 9/24\$ in the screenshot).

Now, if you look at HVT on Bloomberg, you can find historical vol, computed in the generic close-to-close. I replicate this value. If you plug this into BSM, the option seems to be worthless. You can also see that IV as displayed on OMON (generic 3m ATM IV) is way above current HV, for all cases displayed on the screen.

As you can see, HV is generally below 50, whereas IV is close to 200 in this specific example. Yet, the options will not be grossly overpriced.

How is this possible?

Some people interpret IV as a forward looking measure of standard deviation, just like the commonly used definition of historical / realized vol which is computed as the sample standard deviation of log return as shown here. However, one should be cautious when comparing IV to historical vol (HV) - also called realized volatility (RV) - because it is not necessarily useful for at least two reasons:

1 ) Empirically, IV tends to overestimate RV, commonly referred to as Volatility Risk Premium

2 ) IV is the only free parameter in the Black-Scholes-Merton (BSM) model. Higher IV can be a result of compensation for tail risk.

A simple explanation is that market participants tend to overestimate the likelihood of a significant market crash, which results in an increased demand for options as protection against an equity portfolio. This can be exploited, as for example demonstrated in Sullivan, R., Israelov, R., Ang, I., & Tummala, H. Understanding the Volatility Risk Premium. The authors show that the returns of an investor who sells the same 5% out-of-the money put option every month, delta hedges it and holds it to expiration generated 1.5% annualized returns with a Sharpe ratio of 0.68. Compared to the S&P Sharpe Ratio of 0.32 over the same observation period (1996-2016), this is an attractive strategy.

There is no general IV for an option. Quoting from Just What You Need To Know About Variance Swaps - JP Morgan Equity Derivatives

For each strike and maturity there is a different implied volatility which can be interpreted as the market’s expectation of future volatility between today and the maturity date in the scenario implied by the strike. For instance, out-of-the money puts are natural hedges against a market dislocation (such as caused by the 9/11 attacks on the World Trade Center) which entail a spike in volatility; the implied volatility of out-of-the money puts is thus higher than in-the-money puts.

What is IVOL?
IVOL is turning an option price into a comparable number (it’s also annualized). The theory to construct IVOL is based on the world of Black Scholes (its assumptions). Black Scholes implies normally distributed stock returns, whereas real (stock) returns are negatively skewed and have fatter tails because:

• stocks (or other underlyings) tend to move down faster than they move up, so the left side has a fatter tail than the right side - known as skewness

• extreme price movements in both directions (called outliers) are more common than the normal distribution suggests, so both tails are fatter than a normal distribution would suggest; known as kurtosis

The intuition is the same for all sorts of markets. However, FX is very helpful in getting an understanding of it. Ignoring all details, FX is quoted in IVOL, the quotes come as ATM DNS (delta neutral straddle), RR (Risk Reversals) and BF (Butterflies). In a nutshell,

• ATM determines the level (you can think of it as the Black Scholes IVOL for a specific tenor),
• RR the skew (how its tilted, towards OTM puts for RUB and GBP in the examples below) and
• BF the kurtosis (how pronounced the general wings are).

Hence, the vol surface exists mainly because there are fat tails, skewness, heteroscedasticity, jumps (crashes), and so forth. None of these real-world phenomena are featured in the Black Scholes formula. The market just developed ways to account for many of the shortcomings of Black Scholes. Using the vol quotes from above, one can compute strikes (for simplicity I assumed delta premium excluded to avoid using root solvers), back out option prices, and compute risk neutral implied probabilities for the underlying. I use the method shown by Malz in the Fed Staff Report No. 677 on June 2014 A Simple and Reliable Way to Compute Option-Based Risk-Neutral Distributions. I modified it a bit because the strikes derived from delta quotes do not lie on a uniform grid (they do not have constant spacing), in which case a more general formula for weighting is needed. All computed prices are monotonically decreasing, showing that the results are free from vertical spread arbitrage opportunities.

That way, it is easy to show how the quotes indeed affect the implied return distribution of the underlying.

A few observations:

• increasing ATM vol moves the vol surface up, and spreads out the RN probability distribution
• increasing BF quotes moves the tails out significantly
• a negative RR quote increases the left tail, a positive the right tail

Back to AMC, that is essentially the reason HV and IV are so different, and IV is shaped like this:

How would you go about building a vol surface? It depends how illiquid it really is. If you do have some liquid options, compute their IV and build a vol surface with commonly used techniques like SVI. How actual vol surfaces are computed is illustrated here.

Below is a quick SVI implementation in Python example:

spot = 1.34
forward = 1.35
t = 30 / 365.0
vols = np.array([ 12, 10, 9.5, 9, 10.5, 8, 10.24, 9.6, 11.2, 9.4, 11.9, 9.7, 20, 23,  27]) / 100
strikes = np.array([1.21, 1.3, 1.4, 1.3, 1.3, 1.32, 1.38, 1.3,
1.4, 1.3, 1.45, 1.25, 1.5 , 1.6,  1.8])
total_implied_variance = t * vols ** 2

def svi(k, param):
a = param[0];
b = param[1];
m = param[2];
rho = param[3];
sigma = param[4];

totalvariance = a + b * (rho * (k - m) + np.sqrt((k - m)** 2 + sigma**2));

def targetfunction(x):
value=0
for i in range(11):
model_total_implied_variance = svi(np.log(strikes[i] / forward), x);
value =value+(total_implied_variance[i]  - model_total_implied_variance) ** 2;
return value**0.5

bound = [(1e-5, max(total_implied_variance)),(1e-3, 0.99),(min(strikes), max(strikes)),(-0.99, 0.99),(1e-3, 0.99)]
result = optimize.minimize(targetfunction, bound, tol=1e-8, method="BFGS")
x=result.x

K = np.linspace(-0.4, 0.4, 60)

newVols = [np.sqrt(svi(logmoneyness, x)/t) for logmoneyness in K]
plt.plot(np.log(strikes / forward), vols, marker='o', linestyle='none', label='market')
plt.plot(K, newVols, label='SVI')
plt.title("vol curve")

plt.grid()
plt.legend()
plt.show()

You can use these IVs for any strike to get an idea what it should be worth roughly.

If you think you still want to compare HV to IV, only use ATM IV and adjust for the timing mismatch.