Scope: This is an educational single-stock, one-day risk example, not a production VaR model or an investment recommendation.
In the earlier EVT example, I modeled unusually large losses by fitting a distribution above a threshold. There is another route when we want to keep the familiar normal-VaR machinery but acknowledge that observed returns are skewed and more heavy-tailed than a Gaussian. The Cornish-Fisher notebook in my VaR examples takes that route and then tries several exception backtests.
The attraction is speed: adjust a normal quantile using estimated skewness and excess kurtosis rather than fitting an entire alternative distribution. But the correction is an approximation, especially fragile in the tails. The useful question is not simply whether it produces a bigger VaR, but whether its assumptions and forecasts withstand scrutiny (Amédée-Manesme et al., 2019).
Start with AXP returns
The notebook loads the American Express (AXP) price CSV, sorts prices by date, and computes simple daily returns in percentage points:
\[r_t = 100\left(\frac{P_t}{P_{t-1}}-1\right).\]It first inspects the full available history, then uses the last 252 price rows for its headline Cornish-Fisher estimate. The separate backtesting section returns to the longer history and rolls a 252-observation window. That change of sample is easy to miss when reading the plots; it matters when interpreting a cross-model comparison. A first return is undefined after pct_change(), and should be excluded from moment and window counts.
Measure asymmetry and tails
The long-history descriptive output in the notebook shows skewness about $-0.386$ and excess kurtosis about $7.12$. The last-252-row slice instead has skewness about $-0.338$ and excess kurtosis about $1.59$. Those are materially different descriptions of the same asset over different windows, which is a warning against treating moment estimates as permanent properties of a return process.
Write $S$ for sample skewness and $K$ for sample excess kurtosis (ordinary kurtosis minus three). Negative $S$ means the return distribution leans toward downside observations; positive $K$ suggests more weight in its extremes than a normal reference. Neither statistic alone proves which distribution generated the data, and fourth-moment estimates are particularly sensitive to outliers.
Adjust the normal quantile
At lower-tail probability $\alpha$, let $z_\alpha=\Phi^{-1}(\alpha)$ be the standard normal quantile. The expansion used in the notebook modifies it to
\[z_{\mathrm{CF},\alpha} = z_\alpha + \frac{S}{6}(z_\alpha^2-1) + \frac{K}{24}(z_\alpha^3-3z_\alpha) - \frac{S^2}{36}(2z_\alpha^3-5z_\alpha).\]Notice the last term: squaring skewness does not make its effect disappear. For a negative-tail quantile, the combination of terms can substantially move a 99% or 99.5% threshold. Cornish-Fisher is a truncated expansion, not a universally valid new distribution; at extreme probabilities or with unstable moment estimates it can behave poorly (Amédée-Manesme et al., 2019).
Calculate modified VaR
The notebook’s modified_var calculation also rescales sample volatility; it does not simply substitute $z_{\mathrm{CF}}$ for $z$ in normal VaR:
Here $\mu_r$ and $\sigma_r$ are the sample mean and standard deviation of returns in percentage points. The minus sign turns a negative return quantile into a positive loss threshold. A 99% one-day VaR of $2.96\%$ means that, under the fitted model, the loss is expected to exceed about 2.96% on 1% of days; it says nothing about how large those exceptional losses will be.
Parameter caveat: The notebook feeds observed $S$ and $K$ directly into the expansion. Work on corrected Cornish-Fisher methods distinguishes the expansion’s parameters from the moments of the resulting distribution; the notebook discusses this issue but its headline VaR values use the direct plug-in approach (Amédée-Manesme et al., 2019). The figures below are that implementation’s outputs, not corrected-parameter estimates.
Compare three risk estimates
The notebook joins its Cornish-Fisher values to the saved EVT and normal VaR comparison. A few one-day values (positive percentage loss) make the scale tangible:
| Tail probability $\alpha$ | Confidence | Cornish-Fisher | Normal | EVT |
|---|---|---|---|---|
| 0.5% | 99.5% | 3.533% | 2.672% | 3.610% |
| 1% | 99% | 2.958% | 2.403% | 2.977% |
The larger Cornish-Fisher estimate relative to normal VaR here follows from this window’s observed moments; it is not a law of the method. These columns are not a controlled horse race: the EVT notebook uses roughly the last calendar year, whereas this notebook takes 252 price rows for its Cornish-Fisher estimate, and the EVT calculation has its own free-location fitting caveat. Before ranking models, estimate all of them on the same valid dates with the same return and loss conventions.
Check forecast exceptions
The second half of the notebook’s backtest computes rolling forecasts at tail probabilities 5%, 3%, 2%, and 1%. An exception is a return below the predicted lower return quantile, equivalently a loss above positive VaR:
\[I_{t+1}=\mathbf{1}\{ -r_{t+1} > \operatorname{VaR}_{t,1-\alpha} \}, \qquad \widehat{p}=\frac{x}{T},\]where $x$ exceptions occur in $T$ evaluated forecasts. A calibrated model should have an exception rate near $\alpha$. The proportion-of-failures (POF) test compares $\widehat p$ with $\alpha$; under its usual asymptotic null, the likelihood-ratio statistic has one degree of freedom (Kupiec, 1995):
\[LR_{\mathrm{POF}} = -2\log\left[ \frac{\alpha^x(1-\alpha)^{T-x}} {\widehat p^x(1-\widehat p)^{T-x}} \right] \;\overset{H_0}{\sim}\; \chi^2_1.\]The notebook also plots time-until-first-failure (TUFF) and a mixed statistic intended to probe the spacing between exceptions. These complement the simple exception count: a VaR model might achieve the right total number of breaches but cluster them in stress periods. The notebook concludes that its tests look more favorable at smaller tail probabilities, particularly around 1%; that is an observation from this experiment, not proof of calibration.
Backtesting caveat: The notebook’s rolling estimate is placed on a row that is also used in that row’s 252-return fit. For a genuine one-step-ahead test, compute the risk estimate using information available through $t$, shift the forecast to $t+1$, and only then compare it with $r_{t+1}$. The code also uses rolling sums of breach flags, some with a negative shift for plotting. Without carefully aligning forecasts, observations, and evaluation windows, test conclusions may reflect look-ahead bias. Few 1% breaches in a 252-day window also mean low power; failure to reject is not model validation.
Cornish-Fisher is useful as a transparent sensitivity check beside normal VaR, not a replacement for tail diagnostics, stress testing, or expected shortfall. Its signal depends on a short window’s third and fourth moments, the correction can misbehave far into the tail, and a backtest must respect time ordering. Those checks are where a quick quantile approximation becomes a risk measure we can begin to trust.
References
- Amédée-Manesme, C.-O., Barthélémy, F., & Maillard, D. (2019). Computation of the corrected Cornish–Fisher expansion using the response surface methodology: application to VaR and CVaR. Annals of Operations Research, 281(1–2), 423–453. https://doi.org/10.1007/s10479-018-2792-4
- Kupiec, P. H. (1995). Techniques for Verifying the Accuracy of Risk Measurement Models. The Journal of Derivatives, 3(2), 73–84. https://doi.org/10.3905/jod.1995.407942