Short Research Note - Volatility in Indian Equity Markets
An Analysis of the NIFTY 50 VIX
An Analysis of the NIFTY 50 VIX
Summary of Findings:
India VIX is statistically stationary and mean-reverting. ADF calculations reject a unit root and AR(1) models estimate high persistence yet eventual reversion to an approximate historical mean level of 18.52.
The speed of mean reversion of India VIX is slow yet economically meaningful. Through discrete AR(1) calculations, there is an approximate half-life of ~60 trading days for implied volatility shocks to revert.
The current low-volatility environment is historically unusual; though minimal evidence to suggest that long-run mean reversion is structurally broken.
Current conditions imply asymmetric upside risk to increase exposure to equity arbitrage funds.
Motivation and Direction
Over the past few days, I have been introduced to Indian equity arbitrage mutual funds (EAMFs), a subset of the wide variety of investment vehicles offered by institutions such as SBI, ICICI, and HSBC. These funds seek to exploit pricing inefficiencies between the cash equity market and index derivatives, largely through delta-neutral strategies. Their return profile is typically low-risk, low-reward, with limited directional exposure to equities, and arbitrage mutual funds benefit from favourable taxation policies in India; namely, 20% taxation on EAMFs vs 39% on fixed deposits and dividends, with 20% dropping to 12.5% if the holding period exceeds 12 months.
A key characteristic of equity arbitrage strategies is that they outperform during periods of elevated volatility. Higher volatility is generally associated with wider bid-ask spreads and more frequent, sustained futures-spot price dislocations. Conversely, when volatility is persistently low, arbitrage opportunities become more scarce, and naturally, stifles returns. Recently commentary suggests that Indian equity markets are currently amongst the calmest observed in at least the past 15 years. This raises a natural question: Is the present period of subdued volatility a transient deviation from a typically mean-reverting process, or does it reflect deeper structural changes in Indian equity markets that suppress volatility on a more persistent basis?
Within this short research note, I seek to study the dynamics of implied volatility in equity markets using the India VIX, which quantifies market expectations of near-term volatility for the NIFTY 50 index, the free-float weighted index of the 50 largest listed companies on the NSE.
The analysis proceeds in several steps.
First, I test whether the log VIX values exhibit statistical stationarity and mean reversion using an Augmented Dickey-Fuller test and autoregressive models. I estimate an AR(1) specification to characterise potential persistence in volatility dynamics, and to assess whether deviations from long-run levels decay over time.
Next, I model time-varying uncertainty in the VIX using a GARCH(1,1) process applied to AR residuals, capturing volatility clustering and conditional heteroskedasticity. The resulting conditional volatility series is used to identify periods of low, medium, and high volatility based on empirical quantiles, allowing for a regime-based interpretation of volatility dynamics without imposing arbitrary discrete state transitions.
Finally, I explore the presence of (or lack of) mean-switching behaviour in the VIX level using a two-regime Markov regression model, providing a robustness check on whether volatility dynamics are better characterised by fluctuations in conditional variance rather than shifts in the conditional mean.
Our analysis concludes by interpreting the results in the context of equity arbitrage mutual funds, assessing whether the current unusually low volatility environment represents a temporary trough within a mean-reverting process, or a more persistent regime of suppressed volatility with damaging implications for arbitrage opportunities.
Findings from Volatility Analysis
We shall concisely summarise the empirical takeaways of our research.
The India VIX is statistically stationary and mean-reverting.
ADF Statistic: -3.744
p-value: 0.0035
CV: 1%: -3.432
CV: 5%: -2.862
CV: 10%: -2.567
The Augmented Dickey-Fuller tests strongly reject the presence of a unit root in the log India VIX values, with the ADF statistic of -3.744 well below the 1% critical value of -3.432. Further, simple AR(1) specifications estimate a persistence parameter close to, but statistically below 1; consistent with slow, but economically meaningful, mean reversion. Additionally, through a discrete-time AR(1) calculation, we estimate the implied half-life of a volatility shock to be approximately 60 trading days. All of this suggests that periods of unusually low or high volatility are unlikely to persist indefinitely. As a potential follow-on of this analysis, an explicit continuous-time mapping may be performed, potentially through using an Ornstein-Uhlenbeck framework.
Mean reversion is observed primarily through volatility, not the conditional mean.
We find that volatility regimes are better interpreted as high- and low-uncertainty states, rather than shifts in average volatility levels. This is evidenced by our use of mean-switching Markov regression models, which when applied to the conditional mean of the India VIX, tend to be weakly identified. Contrastingly, GARCH(1,1) models applied to the AR residuals capture more pronounced volatility clustering and persistence in conditional variance, i.e. GARCH-based volatility regimes are more robust.
Conditional volatility is highly right-skewed and non-Gaussian.
Estimated GARCH conditional volatility is highly persistent and significantly right-skewed, with occasional large spikes dominating the scale. Resultantly, linear colour-map/heat-map visualisations collapse most observations into a narrow band, and obscure economically meaningful variation. Hence, discretising conditional volatility into empirical low-, medium-, and high-volatility regimes (percentiles) yields a far more interpretable representation, and aligns seamlessly with visually identifiable stress episodes.
Low-VIX periods are persistent, though historically unusual in duration.
Analysing subsamples of the broader data set highlights that low-volatility regimes are associated with lower conditional variance and slower transitions between percentiles. However, the current extended period of calm lies near the lower tail of historical volatility levels, even after accounting for clustering. In other words, while intervals of low volatility are not abnormal per se, the length and depth of the present calm are unusual relative to historical data, though do little to suggest that mean-reversion is broken.
Implications for Equity Arbitrage Mutual Funds?
As mentioned previously, equity arbitrage strategies benefit from higher realised and implied volatility in markets, as these phenomena increase the frequency of mispricings. Now, if the India VIX continues to adhere to the stable mean-reverting process it has observed over the past 17 years, current low levels strongly suggest asymmetric upside risk to volatility, significantly improving the opportunity for arbitrage strategies to outperform their benchmarks. However, with the Indian economy becoming a more established, mature emerging market, structural suppressors of volatility might arise -through the form of improved market microstructure or predictable regulatory changes. These may reduce the long-run mean relative to historical averages, which is currently observed at 18.52.
Q: Why are occasionally high VIX levels labelled under "low volatility" regimes (and vice versa)?
A: Recognise that regime classifications are based on the conditional volatility of the VIX process. Intuitively, note that VIX levels are depict how high volatility is priced, while the GARCH conditional volatility values describe how unstable the VIX itself is. Thus, for instance, if VIX levels are elevated, though consistently elevated/moving smoothly, GARCH will output low conditional variance, hence classifying the period as a low volatility regime. On the other hand, if VIX levels are low, yet sprightly, GARCH will classify the interval as a high volatility regime - this is typically observed during regime transitions.
See Code Below
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima.model import ARIMA
from arch import arch_model
# Downloading ticker information and cleaning up.
ticker = ['^INDIAVIX']
data= yf.download(ticker, start='2008-01-01',end='2025-12-01', auto_adjust=False)
vix = data["Close"].dropna()
vix.name = "India_VIX"
vix = vix.dropna()
vix = vix.asfreq("B").interpolate(method = "time")
log_vix = np.log(vix)
log_vix.name = "log_India_VIX"
# We conduct a stationarity test now.
result = adfuller(log_vix)
adf_stat = result[0]
pval = result[1]
crit_vals = result[4]
print(f"ADF Statistic: {adf_stat:.3f}")
print(f"p-value: {pval:.4f}")
for k, v in crit_vals.items():
print(f"{k}: {v:.3f}")
# AR(1) on log_vix returns.
vixmodel = ARIMA(log_vix, order=(1,0,0),trend="c")
res = vixmodel.fit()
print(res.summary())
phi = res.params["ar.L1"]
mu = res.params["const"]/(1-phi)
sigma = np.sqrt(res.params["sigma2"])
residuals = res.resid
residuals = residuals - residuals.mean()
# GARCH(1,1) model on the residuals.
garch = arch_model(residuals, mean = "Zero",vol = "GARCH", p = 1, q=1, dist = "normal", rescale=False)
garch_res = garch.fit(disp="off")
print(garch_res.summary())
plt.figure(figsize=(14,6))
plt.plot(garch_res.conditional_volatility, color = "purple", label = "NIFTY50 Conditional Volatility")
plt.title("NIFTY50 VIX – Conditional Volatility (GARCH)")
plt.tight_layout()
plt.legend()
plt.savefig("GARCHCondVol.png",dpi=600,bbox_inches="tight")
plt.show()
# Testing Markov Regression to analyse Mean-Switching Behaviour
from statsmodels.tsa.regime_switching.markov_regression import MarkovRegression
msm = MarkovRegression(log_vix, k_regimes=2, order=1)
msm_res = msm.fit()
print(msm_res.summary())
# GARCH Conditional Volatility analysis, plot, through 2024-25
cond_vol = pd.Series(garch_res.conditional_volatility, index=log_vix.index, name="cond_vol")
low = cond_vol.quantile(0.33)
high = cond_vol.quantile(0.67)
regime = pd.cut(cond_vol, bins=[-np.inf, low, high, np.inf], labels=["Low Volatility", "Mid Volatility", "High Volatility"])
vix_plot = vix.loc["2024-01-01":"2025-12-01"]
cond_vol_plot = cond_vol.loc[vix_plot.index]
regime_plot = regime.loc[vix_plot.index]
plt.figure(figsize=(14,6))
plt.plot(vix_plot, color="black", alpha=0.6, lw=1.5, zorder=1, label="NIFTY50 VIX")
for r, c in zip(["Low Volatility", "Mid Volatility", "High Volatility"], ["green","orange","red"]):
mask = regime_plot == r
plt.scatter(vix_plot.index[mask], vix_plot[mask], s=12, color=c, alpha=0.7, zorder=2, label=r)
plt.title("NIFTY50 VIX – GARCH-based Volatility Regimes (2024–2025)")
plt.legend()
plt.tight_layout()
plt.savefig("GarchVolRegimes.png", dpi=600,bbox_inches="tight")
plt.show()