Derivatives · Stochastic assumptionsEmpirical finding
Constant-volatility pricing under empirical market behavior
Observed volatility and option prices contradicted the tested constant-volatility dynamics.
The tested constant-volatility model did not match the observed sample. Volatility moved, tails ran fat, and return magnitudes persisted.
Commit 4806df9Evidence ad24c49Data – · 2,892 rowsUniverse 15 instrumentsTests 239 / 239 passed
- 3.4%Minimum 21-day realised vol of SPY
- 93%Maximum 21-day realised vol of SPY
- 27×Max / min realised vol
- 17.6%Full-sample annualised vol (the 'constant' σ)
- ≈14Excess kurtosis of SPY daily returns
- −0.31Skewness of SPY daily returns
The tested Black–Scholes dynamics were inconsistent with the observed sample.
SPY 21-day realized volatility ranged from roughly 3% to 93%. Daily excess kurtosis was about 14. Under a Gaussian yardstick, the worst day sat near a 10σ event. Lag-1 absolute-return autocorrelation was about 0.35. An equity-like, Feller-satisfying Heston specification generated a short-dated implied-volatility skew from roughly 25% to 16% across strikes.
SPY realised volatility: the constant that isn't
% annualised · rolling 21-day · 2015-02 to 2026-07 · notebook 03
Fat tails: SPY daily returns against a matched Gaussian
count · daily return (%) · 120 bins · notebook 03
| daily return (%) | observed | Gaussian, same mean and vol |
|---|---|---|
| -10.853 | 1 | 2.22305e-19 |
| -10.6743 | 0 | 1.06331e-18 |
| -10.4956 | 0 | 4.95619e-18 |
| -10.3169 | 0 | 2.25118e-17 |
| -10.1382 | 0 | 9.9643e-17 |
| -9.95949 | 0 | 4.29793e-16 |
| -9.78079 | 0 | 1.80654e-15 |
| -9.60209 | 1 | 7.39963e-15 |
| -9.42338 | 0 | 2.95358e-14 |
| -9.24468 | 0 | 1.14885e-13 |
| -9.06598 | 0 | 4.35462e-13 |
| -8.88728 | 0 | 1.60848e-12 |
| -8.70857 | 0 | 5.78968e-12 |
| -8.52987 | 0 | 2.03081e-11 |
| -8.35117 | 0 | 6.9416e-11 |
| -8.17247 | 0 | 2.3122e-10 |
| -7.99376 | 0 | 7.50526e-10 |
| -7.81506 | 1 | 2.374e-9 |
| -7.63636 | 0 | 7.31767e-9 |
| -7.45766 | 0 | 2.19806e-8 |
| -7.27895 | 0 | 6.43401e-8 |
| -7.10025 | 0 | 1.83526e-7 |
| -6.92155 | 0 | 5.10142e-7 |
| -6.74285 | 0 | 0.00000138184 |
| -6.56414 | 0 | 0.00000364756 |
| -6.38544 | 0 | 0.00000938255 |
| -6.20674 | 0 | 0.0000235188 |
| -6.02804 | 0 | 0.0000574491 |
| -5.84933 | 2 | 0.00013675 |
| -5.67063 | 0 | 0.000317211 |
| -5.49193 | 0 | 0.000717039 |
| -5.31323 | 0 | 0.00157948 |
| -5.13452 | 1 | 0.00339046 |
| -4.95582 | 2 | 0.00709217 |
| -4.77712 | 0 | 0.0144569 |
| -4.59842 | 0 | 0.0287175 |
| -4.41971 | 4 | 0.0555896 |
| -4.24101 | 3 | 0.104861 |
| -4.06231 | 1 | 0.192758 |
| -3.88361 | 1 | 0.345291 |
| -3.7049 | 2 | 0.602745 |
| -3.5262 | 3 | 1.02531 |
| -3.3475 | 5 | 1.69964 |
| -3.1688 | 3 | 2.74555 |
| -2.99009 | 11 | 4.32194 |
| -2.81139 | 6 | 6.62984 |
| -2.63269 | 8 | 9.91067 |
| -2.45399 | 14 | 14.437 |
| -2.27528 | 9 | 20.4941 |
| -2.09658 | 18 | 28.3501 |
| -1.91788 | 18 | 38.2169 |
| -1.73918 | 34 | 50.2032 |
| -1.56047 | 33 | 64.2663 |
| -1.38177 | 48 | 80.1697 |
| -1.20307 | 55 | 97.4569 |
| -1.02437 | 53 | 115.449 |
| -0.845664 | 97 | 133.273 |
| -0.666961 | 116 | 149.924 |
| -0.488259 | 139 | 164.352 |
| -0.309556 | 230 | 175.571 |
| -0.130854 | 300 | 182.771 |
| 0.0478488 | 344 | 185.411 |
| 0.226551 | 282 | 183.291 |
| 0.405254 | 221 | 176.572 |
| 0.583956 | 191 | 165.759 |
| 0.762659 | 140 | 151.638 |
| 0.941361 | 128 | 135.18 |
| 1.12006 | 96 | 117.434 |
| 1.29877 | 63 | 99.4146 |
| 1.47747 | 67 | 82.0129 |
| 1.65617 | 34 | 65.9309 |
| 1.83487 | 26 | 51.6501 |
| 2.01358 | 18 | 39.4302 |
| 2.19228 | 10 | 29.3334 |
| 2.37098 | 11 | 21.2652 |
| 2.54968 | 12 | 15.0229 |
| 2.72839 | 6 | 10.3422 |
| 2.90709 | 2 | 6.9382 |
| 3.08579 | 4 | 4.53582 |
| 3.26449 | 4 | 2.88962 |
| 3.4432 | 1 | 1.79391 |
| 3.6219 | 0 | 1.08527 |
| 3.8006 | 1 | 0.639804 |
| 3.9793 | 0 | 0.367564 |
| 4.15801 | 1 | 0.205776 |
| 4.33671 | 1 | 0.112262 |
| 4.51541 | 0 | 0.0596819 |
| 4.69411 | 0 | 0.0309193 |
| 4.87282 | 0 | 0.0156096 |
| 5.05152 | 1 | 0.00767945 |
| 5.23022 | 1 | 0.00368166 |
| 5.40892 | 2 | 0.00172001 |
| 5.58763 | 0 | 0.000783061 |
| 5.76633 | 1 | 0.000347404 |
| 5.94503 | 0 | 0.000150193 |
| 6.12373 | 0 | 0.0000632759 |
| 6.30244 | 0 | 0.0000259779 |
| 6.48114 | 0 | 0.0000103931 |
| 6.65984 | 1 | 0.0000040519 |
| 6.83854 | 0 | 0.00000153939 |
| 7.01725 | 0 | 5.69923e-7 |
| 7.19595 | 0 | 2.05616e-7 |
| 7.37465 | 0 | 7.22893e-8 |
| 7.55335 | 0 | 2.47666e-8 |
| 7.73206 | 0 | 8.26863e-9 |
| 7.91076 | 0 | 2.69015e-9 |
| 8.08946 | 0 | 8.52892e-10 |
| 8.26816 | 0 | 2.63504e-10 |
| 8.44687 | 0 | 7.93334e-11 |
| 8.62557 | 1 | 2.32755e-11 |
| 8.80427 | 0 | 6.65455e-12 |
| 8.98297 | 1 | 1.85402e-12 |
| 9.16168 | 0 | 5.03365e-13 |
| 9.34038 | 0 | 1.33177e-13 |
| 9.51908 | 0 | 3.43359e-14 |
| 9.69778 | 0 | 8.62669e-15 |
| 9.87649 | 0 | 2.1121e-15 |
| 10.0552 | 0 | 5.0392e-16 |
| 10.2339 | 0 | 1.17161e-16 |
| 10.4126 | 1 | 2.65448e-17 |
Volatility clustering: |r| remembers, r forgets
autocorrelation · lags 1–60 days · notebook 03
| lag (days) | ACF of |returns| | ACF of returns |
|---|---|---|
| 1 | 0.350793 | -0.119417 |
| 2 | 0.379537 | 0.0636647 |
| 3 | 0.358562 | -0.0300619 |
| 4 | 0.353715 | -0.0660177 |
| 5 | 0.309259 | 0.0392595 |
| 6 | 0.315404 | -0.0874767 |
| 7 | 0.282462 | 0.114321 |
| 8 | 0.298903 | -0.1 |
| 9 | 0.280999 | 0.109734 |
| 10 | 0.264752 | -0.0361763 |
| 11 | 0.246825 | 0.0117271 |
| 12 | 0.210118 | 0.0143202 |
| 13 | 0.222704 | -0.0608464 |
| 14 | 0.1955 | 0.0337063 |
| 15 | 0.192422 | -0.0760701 |
| 16 | 0.19555 | 0.047978 |
| 17 | 0.180726 | -0.0218923 |
| 18 | 0.167062 | 0.0341693 |
| 19 | 0.154539 | -0.0144604 |
| 20 | 0.181578 | -0.00224846 |
| 21 | 0.130145 | 0.0424812 |
| 22 | 0.150708 | -0.0774117 |
| 23 | 0.142139 | 0.0074625 |
| 24 | 0.137078 | -0.0134413 |
| 25 | 0.148417 | -0.0170784 |
| 26 | 0.122249 | -0.0365345 |
| 27 | 0.120674 | 0.0294181 |
| 28 | 0.09906 | 0.00720756 |
| 29 | 0.145134 | -0.0168458 |
| 30 | 0.124568 | -0.00260317 |
| 31 | 0.0744641 | -0.0370789 |
| 32 | 0.105607 | -0.00393642 |
| 33 | 0.116303 | -0.0163825 |
| 34 | 0.078015 | 0.00651955 |
| 35 | 0.0978177 | 0.0026188 |
| 36 | 0.0823633 | 0.0326842 |
| 37 | 0.0542797 | -0.0194793 |
| 38 | 0.0883904 | 0.00100462 |
| 39 | 0.0647543 | 0.00360456 |
| 40 | 0.0849419 | 0.000362844 |
| 41 | 0.0699311 | -0.0328373 |
| 42 | 0.0787118 | 0.0118665 |
| 43 | 0.057799 | -0.0149564 |
| 44 | 0.065188 | -0.0227818 |
| 45 | 0.0462063 | 0.0197909 |
| 46 | 0.0831233 | -0.0412068 |
| 47 | 0.0509227 | 0.0361634 |
| 48 | 0.0662325 | -0.0126705 |
| 49 | 0.0715224 | -0.0173184 |
| 50 | 0.0564624 | 0.00416833 |
| 51 | 0.0638968 | 0.00734095 |
| 52 | 0.0454976 | -0.0033769 |
| 53 | 0.0496798 | -0.00534742 |
| 54 | 0.0304656 | 0.00923129 |
| 55 | 0.0694845 | -0.0325855 |
| 56 | 0.0220327 | 0.0122981 |
| 57 | 0.0543363 | -0.0206366 |
| 58 | 0.0516237 | 0.00567233 |
| 59 | 0.0598812 | 0.000563717 |
| 60 | 0.012926 | -0.0156577 |
The smile Black–Scholes cannot draw: Heston-implied vols by strike
implied vol (%) · S₀ = 100, r = 3% · Feller-satisfying parameters · notebook 03
| strike K | T = 0.083y | T = 0.25y | T = 0.5y | T = 1y | T = 2y |
|---|---|---|---|---|---|
| 70 | 28.2982 | 27.636 | 26.7596 | 25.4571 | 24.0149 |
| 72.5 | 27.6395 | 26.9962 | 26.1753 | 24.9721 | 23.6735 |
| 75 | 26.9628 | 26.3585 | 25.5952 | 24.4945 | 23.3407 |
| 77.5 | 26.2838 | 25.722 | 25.0186 | 24.0239 | 23.016 |
| 80 | 25.6028 | 25.0855 | 24.4447 | 23.5599 | 22.699 |
| 82.5 | 24.9184 | 24.448 | 23.873 | 23.1024 | 22.3896 |
| 85 | 24.2296 | 23.8086 | 23.3031 | 22.6513 | 22.0875 |
| 87.5 | 23.5349 | 23.1665 | 22.7346 | 22.2065 | 21.7923 |
| 90 | 22.8333 | 22.521 | 22.1676 | 21.7682 | 21.5041 |
| 92.5 | 22.124 | 21.8719 | 21.6022 | 21.3366 | 21.2225 |
| 95 | 21.4067 | 21.2192 | 21.0392 | 20.9121 | 20.9474 |
| 97.5 | 20.6823 | 20.564 | 20.4798 | 20.4951 | 20.6789 |
| 100 | 19.9534 | 19.9087 | 19.9258 | 20.0862 | 20.4167 |
| 102.5 | 19.226 | 19.2577 | 19.38 | 19.6863 | 20.1608 |
| 105 | 18.5117 | 18.6187 | 18.8462 | 19.2961 | 19.9111 |
| 107.5 | 17.8298 | 18.0031 | 18.3294 | 18.9167 | 19.6677 |
| 110 | 17.2079 | 17.4264 | 17.8355 | 18.5493 | 19.4306 |
| 112.5 | 16.6746 | 16.9059 | 17.3713 | 18.1952 | 19.1997 |
| 115 | 16.2486 | 16.4569 | 16.9438 | 17.8556 | 18.975 |
| 117.5 | 15.9318 | 16.0884 | 16.559 | 17.532 | 18.7566 |
| 120 | 15.7124 | 15.8007 | 16.2216 | 17.2257 | 18.5445 |
| 122.5 | 15.5732 | 15.5873 | 15.934 | 16.9379 | 18.3388 |
| 125 | 15.4968 | 15.4379 | 15.6958 | 16.6698 | 18.1395 |
| 127.5 | 15.4683 | 15.3412 | 15.5045 | 16.4221 | 17.9466 |
| 130 | 15.4761 | 15.2868 | 15.3558 | 16.1955 | 17.7602 |
Six-month call prices across strikes: flat Black–Scholes against Heston
call price · S₀ = 100, r = 2%, T = 0.5y · BS σ = 19.2% · case study
| Strike | Heston call | Heston implied vol | BS call (flat σ) | IV residual | BS − Heston |
|---|---|---|---|---|---|
| 70 | 30.986 | 0.297994 | 30.7084 | -0.105994 | -0.277559 |
| 75 | 26.2467 | 0.280795 | 25.8045 | -0.0887952 | -0.442204 |
| 80 | 21.6299 | 0.263484 | 21.0075 | -0.0714839 | -0.622452 |
| 85 | 17.1919 | 0.245936 | 16.4481 | -0.0539357 | -0.743881 |
| 90 | 13.0108 | 0.22807 | 12.3036 | -0.0360702 | -0.707134 |
| 95 | 9.19461 | 0.209922 | 8.74905 | -0.0179224 | -0.445562 |
| 100 | 5.89197 | 0.191812 | 5.89723 | 0.000188155 | 0.00525485 |
| 105 | 3.28971 | 0.174686 | 3.76485 | 0.017314 | 0.475138 |
| 110 | 1.54724 | 0.160488 | 2.27856 | 0.0315122 | 0.731317 |
| 115 | 0.624445 | 0.151394 | 1.31016 | 0.0406058 | 0.685711 |
| 120 | 0.233836 | 0.147589 | 0.717827 | 0.044411 | 0.483991 |
| 125 | 0.0869132 | 0.147351 | 0.376032 | 0.0446493 | 0.289119 |
| 130 | 0.0329763 | 0.149017 | 0.189012 | 0.0429826 | 0.156035 |
Validation
Asset pricing · Numerical verification · Numerical validation
Black–Scholes, CRR, PDE, and Monte Carlo prices agreed within declared numerical tolerances.
Cross-method option-pricing validation
The tree and PDE land within roughly 10⁻³ of closed form; Monte Carlo prices are statistically consistent with it; implied volatility returns to about 10⁻⁸. Monte Carlo uncertainty is reported as estimator standard error. Tree and PDE errors remain discretization-dependent.
Absolute pricing error against the closed form · six benchmark contracts
|price − Black–Scholes| · log scale · notebook 01
| contract | |CRR(1000) − BS| | |Crank–Nicolson − BS| | |Monte Carlo − BS| | Monte Carlo std err |
|---|---|---|---|---|
| K = 90 call | 0.000933107 | 0.0000984414 | 0.0314067 | 0.0390336 |
| K = 90 put | 0.000933107 | 0.0000997734 | 0.0163754 | 0.012038 |
| K = 100 call | 0.00199947 | 0.000136685 | 0.0257009 | 0.0330895 |
| K = 100 put | 0.00199947 | 0.000135205 | 0.0106697 | 0.0194382 |
| K = 110 call | 0.0015239 | 0.0000106322 | 0.028268 | 0.0262107 |
| K = 110 put | 0.0015239 | 0.0000122603 | 0.0132367 | 0.0268729 |
CRR binomial convergence to Black–Scholes (ATM call)
|CRR(n) − BS| · n from 10 to 2000 · notebook 01
| tree steps n (log scale) | |CRR(n) − BS| | O(1/n) reference |
|---|---|---|
| 10 | 0.197175 | 0.197175 |
| 11 | 0.160617 | 0.17925 |
| 13 | 0.135766 | 0.151673 |
| 15 | 0.11757 | 0.13145 |
| 17 | 0.103672 | 0.115985 |
| 19 | 0.0927107 | 0.103776 |
| 22 | 0.0903516 | 0.0896248 |
| 25 | 0.0703821 | 0.0788698 |
| 29 | 0.0606437 | 0.0679912 |
| 33 | 0.0532722 | 0.0597499 |
| 38 | 0.0524456 | 0.051888 |
| 44 | 0.0453156 | 0.0448124 |
| 51 | 0.0344349 | 0.0386617 |
| 58 | 0.0344021 | 0.0339956 |
| 66 | 0.0302404 | 0.0298749 |
| 76 | 0.0262682 | 0.025944 |
| 87 | 0.0201697 | 0.0226637 |
| 100 | 0.0199719 | 0.0197175 |
| 115 | 0.0152545 | 0.0171456 |
| 132 | 0.0151349 | 0.0149375 |
| 151 | 0.0116152 | 0.0130579 |
| 173 | 0.0101372 | 0.0113974 |
| 198 | 0.0100932 | 0.00995831 |
| 227 | 0.00772463 | 0.0086861 |
| 260 | 0.00768751 | 0.00758364 |
| 298 | 0.00670764 | 0.00661659 |
| 341 | 0.00514142 | 0.00578224 |
| 391 | 0.00448377 | 0.00504283 |
| 448 | 0.00446241 | 0.00440122 |
| 514 | 0.00388956 | 0.00383608 |
| 588 | 0.00340016 | 0.00335331 |
| 674 | 0.00296639 | 0.00292544 |
| 772 | 0.00258989 | 0.00255407 |
| 885 | 0.00198067 | 0.00222796 |
| 1,013 | 0.00173037 | 0.00194644 |
| 1,161 | 0.00150977 | 0.00169832 |
| 1,330 | 0.00150341 | 0.00148252 |
| 1,524 | 0.00131204 | 0.0012938 |
| 1,745 | 0.00100446 | 0.00112994 |
| 2,000 | 0.000999797 | 0.000985873 |
Four roads to one price · S₀ = 100, r = 5%, σ = 20%, T = 1
| Contract | Method | Price | |error| vs closed form | MC std err | |error| / SE | Tolerance | Verdict |
|---|---|---|---|---|---|---|---|
| K = 90 call | Black-Scholes | 16.6994 | 0 | — | — | reference | pass |
| K = 90 call | Binomial(1000) | 16.7004 | 0.000933107 | — | — | 0.01 abs | pass |
| K = 90 call | Crank-Nicolson | 16.6995 | 0.0000984414 | — | — | 0.01 abs | pass |
| K = 90 call | Monte Carlo | 16.7309 | 0.0314067 | 0.0390336 | 0.804605 | 3.0 × SE | pass |
| K = 90 put | Black-Scholes | 2.3101 | 0 | — | — | reference | pass |
| K = 90 put | Binomial(1000) | 2.31103 | 0.000933107 | — | — | 0.01 abs | pass |
| K = 90 put | Crank-Nicolson | 2.3102 | 0.0000997734 | — | — | 0.01 abs | pass |
| K = 90 put | Monte Carlo | 2.32647 | 0.0163754 | 0.012038 | 1.36031 | 3.0 × SE | pass |
| K = 100 call | Black-Scholes | 10.4506 | 0 | — | — | reference | pass |
| K = 100 call | Binomial(1000) | 10.4486 | 0.00199947 | — | — | 0.01 abs | pass |
| K = 100 call | Crank-Nicolson | 10.4504 | 0.000136685 | — | — | 0.01 abs | pass |
| K = 100 call | Monte Carlo | 10.4763 | 0.0257009 | 0.0330895 | 0.77671 | 3.0 × SE | pass |
| K = 100 put | Black-Scholes | 5.57353 | 0 | — | — | reference | pass |
| K = 100 put | Binomial(1000) | 5.57153 | 0.00199947 | — | — | 0.01 abs | pass |
| K = 100 put | Crank-Nicolson | 5.57339 | 0.000135205 | — | — | 0.01 abs | pass |
| K = 100 put | Monte Carlo | 5.5842 | 0.0106697 | 0.0194382 | 0.548903 | 3.0 × SE | pass |
| K = 110 call | Black-Scholes | 6.04009 | 0 | — | — | reference | pass |
| K = 110 call | Binomial(1000) | 6.04161 | 0.0015239 | — | — | 0.01 abs | pass |
| K = 110 call | Crank-Nicolson | 6.0401 | 0.0000106322 | — | — | 0.01 abs | pass |
| K = 110 call | Monte Carlo | 6.06836 | 0.028268 | 0.0262107 | 1.07849 | 3.0 × SE | pass |
| K = 110 put | Black-Scholes | 10.6753 | 0 | — | — | reference | pass |
| K = 110 put | Binomial(1000) | 10.6768 | 0.0015239 | — | — | 0.01 abs | pass |
| K = 110 put | Crank-Nicolson | 10.6753 | 0.0000122603 | — | — | 0.01 abs | pass |
| K = 110 put | Monte Carlo | 10.6886 | 0.0132367 | 0.0268729 | 0.492569 | 3.0 × SE | pass |
Return moments of SPY daily returns
| Statistic | Value |
|---|---|
| Observations | 2,891 |
| Mean (daily) | 0.000576715 |
| Std (daily) | 0.0111157 |
| Annualised vol | 0.176456 |
| Skewness | -0.308628 |
| Excess kurtosis | 14.0107 |
| Worst day | -0.109424 |
| Worst day date | 2020-03-16 |
| Worst day in σ | -9.84408 |
| Gaussian probability of worst day | 3.6349e-23 |
| Lag-1 ACF of |r| | 0.350793 |
| Lag-1 ACF of r | -0.119417 |
| Min 21-day realised vol | 0.0342058 |
| Max 21-day realised vol | 0.929687 |
Heston parameters used
| Specification | S₀ | r | v₀ | κ | θ | ξ | ρ | 2κθ | ξ² | Feller satisfied |
|---|---|---|---|---|---|---|---|---|---|---|
| Smile by maturity (notebook 03) | 100 | 0.03 | 0.04 | 2 | 0.045 | 0.35 | -0.7 | 0.18 | 0.1225 | yes |
| Six-month price comparison (case study) | 100 | 0.02 | 0.04 | 2 | 0.05 | 0.6 | -0.7 | 0.2 | 0.36 | no |
The case-study specification violates Feller by design; its prices come from the semi-analytic characteristic-function integral, not simulation.
Heston-implied volatility by strike and maturity
| Strike | T = 0.083y | T = 0.25y | T = 0.5y | T = 1y | T = 2y |
|---|---|---|---|---|---|
| 70 | 0.282982 | 0.27636 | 0.267596 | 0.254571 | 0.240149 |
| 72.5 | 0.276395 | 0.269962 | 0.261753 | 0.249721 | 0.236735 |
| 75 | 0.269628 | 0.263585 | 0.255952 | 0.244945 | 0.233407 |
| 77.5 | 0.262838 | 0.25722 | 0.250186 | 0.240239 | 0.23016 |
| 80 | 0.256028 | 0.250855 | 0.244447 | 0.235599 | 0.22699 |
| 82.5 | 0.249184 | 0.24448 | 0.23873 | 0.231024 | 0.223896 |
| 85 | 0.242296 | 0.238086 | 0.233031 | 0.226513 | 0.220875 |
| 87.5 | 0.235349 | 0.231665 | 0.227346 | 0.222065 | 0.217923 |
| 90 | 0.228333 | 0.22521 | 0.221676 | 0.217682 | 0.215041 |
| 92.5 | 0.22124 | 0.218719 | 0.216022 | 0.213366 | 0.212225 |
| 95 | 0.214067 | 0.212192 | 0.210392 | 0.209121 | 0.209474 |
| 97.5 | 0.206823 | 0.20564 | 0.204798 | 0.204951 | 0.206789 |
| 100 | 0.199534 | 0.199087 | 0.199258 | 0.200862 | 0.204167 |
| 102.5 | 0.19226 | 0.192577 | 0.1938 | 0.196863 | 0.201608 |
| 105 | 0.185117 | 0.186187 | 0.188462 | 0.192961 | 0.199111 |
| 107.5 | 0.178298 | 0.180031 | 0.183294 | 0.189167 | 0.196677 |
| 110 | 0.172079 | 0.174264 | 0.178355 | 0.185493 | 0.194306 |
| 112.5 | 0.166746 | 0.169059 | 0.173713 | 0.181952 | 0.191997 |
| 115 | 0.162486 | 0.164569 | 0.169438 | 0.178556 | 0.18975 |
| 117.5 | 0.159318 | 0.160884 | 0.16559 | 0.17532 | 0.187566 |
| 120 | 0.157124 | 0.158007 | 0.162216 | 0.172257 | 0.185445 |
| 122.5 | 0.155732 | 0.155873 | 0.15934 | 0.169379 | 0.183388 |
| 125 | 0.154968 | 0.154379 | 0.156958 | 0.166698 | 0.181395 |
| 127.5 | 0.154683 | 0.153412 | 0.155045 | 0.164221 | 0.179466 |
| 130 | 0.154761 | 0.152868 | 0.153558 | 0.161955 | 0.177602 |
Heston − Black-Scholes price difference (per S₀ = 100), BS calibrated to σ_ATM(3m)
| T (years) | 70 | 85 | 100 | 115 | 130 |
|---|---|---|---|---|---|
| 0.25 | 0.0147642 | 0.212366 | -5.26583e-11 | -0.25433 | -0.0177802 |
| 0.5 | 0.131218 | 0.443774 | 0.0047503 | -0.560496 | -0.204758 |
| 1 | 0.423612 | 0.655446 | 0.0686548 | -0.727161 | -0.720844 |
| 2 | 0.75318 | 0.820983 | 0.269291 | -0.520643 | -0.995346 |
Same gap in implied-vol points
| T (years) | 70 | 85 | 100 | 115 | 130 |
|---|---|---|---|---|---|
| 0.25 | 7.72731 | 3.89998 | 0 | -3.45174 | -4.62187 |
| 0.5 | 6.85097 | 3.3944 | 0.017105 | -2.96491 | -4.5529 |
| 1 | 5.54839 | 2.74262 | 0.177555 | -2.05302 | -3.71318 |
| 2 | 4.10623 | 2.17881 | 0.507991 | -0.93365 | -2.1485 |
Audience and decision
Research significance
Derivatives users, risk teams, and model validators
The result matters wherever one volatility estimate drives option prices, Greeks, hedges, scenario losses, or claims about the likelihood of extreme market moves.
Decision context
Criteria for replacing a flat-volatility baseline
Use Black–Scholes for the job it can do, while making strike, maturity, tail, and volatility-dynamics risk visible. A precise price under a rejected dynamic assumption is not the same as a reliable decision.
The rejection came from several independent fingerprints
The study measured a frozen SPY adjusted-close sample from January 2015 through July 2026. Constant-volatility geometric Brownian motion leaves three fingerprints. Rolling volatility should fluctuate around a stable level. Standardized returns should be approximately Gaussian. Return magnitudes should not stay autocorrelated. The sample contradicted each one.
Direction stayed hard to predict, but magnitude persisted. Lag-1 autocorrelation of absolute returns was about 0.35, and it survived at longer lags. Fat tails ran alongside a nearly thirty-fold realized-volatility range. A single constant parameter describes that observed return process poorly.
The Heston result demonstrates a mechanism. Negative price–volatility correlation and stochastic variance can generate an equity-like strike skew. A single Black–Scholes volatility cannot. The parameters were illustrative, not calibrated to a dated live option chain.
Separate a useful quoting convention from a claim about market dynamics
- Read implied volatility across strike and maturity instead of applying one number everywhere.
- Monitor realized volatility and return-magnitude persistence as state variables rather than constants.
- Stress hedge and valuation outputs to skew, term structure, jumps, and volatility-of-volatility.
- Validate a richer model against a dated option surface before treating its calibration as empirical evidence.
- Attach model-risk language to Greeks and prices. Parameter precision does not remove specification error.
From closed-form valuation to empirical rejection
Constant-volatility model implications
The 1973 model makes one structural bet: that a single number, \(\sigma\), describes the randomness of an asset for the life of an option. Assume geometric Brownian motion with constant volatility, continuous frictionless hedging, and a constant rate. Then every European option on the same underlying and expiry must price off the same \(\sigma\). This is not a minor implication — it is the testable implication. Invert the formula on market prices and the implied volatility should come back flat across strikes:
$$\sigma_{\text{imp}}(K, T) = \text{const} \quad \text{for all } K.$$
The relevant historical claim is narrower than “the smile began in 1987.” Rubinstein’s S&P 500 option study documents a pronounced, persistent post-crash skew in the 1987–1992 sample. It emphasizes that the observed surface is inconsistent with the constant- volatility model.2
Observed departures from constant-volatility assumptions
Take the model's assumptions in order and hold them against an ordinary day of market data. Returns are not Gaussian: daily index returns show excess kurtosis and negative skew. Moves the model rates as once-in-millennia arrive within careers (the arithmetic is in Note VI). Volatility is not constant: it clusters, with quiet weeks following quiet weeks and violent days following violent days. It also moves inversely with price, the leverage effect. Prices jump: earnings, policy surprises, and liquidity spirals produce discontinuities no continuous diffusion generates. Each violation leaves a fingerprint in option prices. The market prices repricing risk whether or not the model does, and it records every fingerprint in one curve:
Out-of-the-money puts trade at implied volatilities several points above at-the-money. Out-of-the-money calls trade below. Traders are paying up for crash protection. The market quotes that premium through the Black-Scholes formula, using implied volatility as the unit. The smile is the market's standing annotation on the model: the Gaussian tail is too thin on the left, and the constant σ is not constant.
Stochastic variance as an endogenous state variable
Heston (1993) promotes variance from parameter to process:1
$$dS_t = \mu S_t\,dt + \sqrt{v_t}\,S_t\,dW_t^S, \qquad dv_t = \kappa(\theta - v_t)\,dt + \xi\sqrt{v_t}\,dW_t^v, \qquad d\langle W^S, W^v \rangle_t = \rho\,dt.$$
Three mechanisms do the work. Mean reversion (\(\kappa\), \(\theta\)): variance is pulled toward a long-run level, so volatility shocks decay. That produces clustering, and it makes long-dated smiles flatter than short-dated ones, as observed. Vol-of-vol (\(\xi\)): variance itself is risky. That fattens both tails of the return distribution and gives the smile its curvature. Correlation (\(\rho < 0\)): the leverage effect, wired in explicitly. Negative return shocks arrive with rising variance, which skews the distribution left and tilts the smile downward toward high strikes. With \(\rho\) near \(-0.7\), the model generates the equity index skew almost as a matter of course. The model also has a closed-form characteristic function, so whole volatility surfaces calibrate quickly. That speed contributed to its broad use in derivatives practice.
Black-Scholes vs. Heston, strike by strike
Below, the flat-σ model meets Heston-generated target prices. The Heston call values are precomputed offline from the Heston characteristic function (Heston 1993, "little trap" formulation, Simpson-rule integration of the P₁/P₂ integrals; parameters in the table note). The Black-Scholes prices are computed live at the selected flat volatility. No single σ reconciles the two columns — that is the entire point.
Scope boundary No dated option chain, bid–ask spread, or observed implied-volatility surface enters this example. The fixed Heston grid is the target and flat Black–Scholes is the candidate.
Objective and residual definition
For the displayed one-parameter comparison, the diagnostic objective is the vega-weighted implied-volatility root-mean-square error
$$J(\sigma)=\sqrt{\frac{\sum_i \nu_i\,[\sigma-\sigma_i^{H}]^2}{\sum_i \nu_i}}, \qquad \nu_i=\operatorname{Vega}_{BS}(K_i,\sigma_i^{H}).$$
A genuine market calibration would replace the generated targets with timestamped option quotes. It should also weight residuals by measurement quality such as bid–ask spread. Exposing the objective is essential. Without it the parameter vector cannot be interpreted or reproduced.
Heston parameters: S₀ = 100, r = 2%, q = 0, T = 0.5y, v₀ = 0.04, κ = 2.0, θ = 0.05, ξ = 0.6, ρ = −0.7. Values computed offline in Python (Simpson rule, 4,000 nodes on [0, 200]) and hardcoded; implied vols recovered by bisection. Inspect the Heston implementation at commit ad24c499958 and the derivatives notebook at the same commit.
Residual omissions under stochastic volatility
Heston is a better description, not a true one. Its diffusive variance cannot move fast enough to explain the steep smiles of short-dated options. A market pricing overnight jump risk needs jumps. Practice therefore moved to Bates (Heston plus Merton jumps) and beyond. Its single variance factor forces the whole term structure of skew to move in lockstep, while real surfaces twist. Its calibrated parameters, re-fit each morning, drift in ways the model says they should not. That drift indicates residual misspecification. The modern frontier (rough volatility, with Hurst exponents near 0.1) suggests volatility's memory is structurally unlike anything a Markovian diffusion can produce. These limitations motivate jump-diffusion, multifactor, and rough-volatility alternatives.
Model-risk interpretation
Black–Scholes remains useful as a quoting convention even though its literal market dynamics are rejected. Implied volatility expresses observed prices relative to the constant-volatility baseline and makes deviations across strike and maturity comparable.
The distinction is operational. The formula can organize prices and sensitivities without establishing that returns are Gaussian, volatility is constant, or hedging is continuous. Those assumptions require separate empirical tests, monitoring, and model-risk controls. Model output stays conditional on the assumptions, calibration data, numerical method, and market regime behind it.
Numbers
| Statement | Value | As stated | Note |
|---|---|---|---|
| Minimum 21-day realised vol of SPY | 3.4% | ≈3% (README: 3.4%) | |
| Maximum 21-day realised vol of SPY | 93% | 93% | |
| Max / min realised vol | 27× | nearly thirty-fold | |
| Full-sample annualised vol (the 'constant' σ) | 17.6% | ||
| Excess kurtosis of SPY daily returns | ≈14 | about 14 | |
| Skewness of SPY daily returns | −0.31 | ||
| Worst daily return | −10.9% | -10.9% (March 2020) | |
| Worst day under a Gaussian yardstick | ≈10σ | ≈10σ | Unrounded 9.84σ; Gaussian single-day probability 3.63e-23. |
| Gaussian probability of the worst day | 3.63e-23 | around 10^-23 | |
| Lag-1 autocorrelation of absolute returns | 0.35 | about 0.35 | |
| Lag-1 autocorrelation of returns | −0.12 | ≈ -0.12 | |
| Heston implied vol at K/S₀ = 0.8, three months | ≈25% | 25% | |
| Heston implied vol at K/S₀ = 1.2, three months | ≈16% | 16% | |
| Feller condition 2κθ | 0.180 | 0.180 | |
| Feller condition ξ² | 0.122 | 0.122 | |
| Heston ATM implied vol at three months (BS calibration point) | 19.91% | 19.91% | |
| ATM implied vol of the case-study Heston surface (flat BS σ) | 19.2% | 19.2% | |
| SPY daily observations | 2,891 | ≈2,900 | |
| First SPY return | 2015-01-05 | January 2015 | |
| Last SPY return | 2026-07-06 | July 2026 |
Notes
Itô's Lemma
4 min · Prerequisites: multivariable calculus and Brownian motion
Ordinary calculus fails for Brownian motion because accumulates quadratic variation: over a partition of , , not zero. The squared increments of a Brownian path are not negligible — they behave, in the limit, like time itself.1 The heuristic multiplication table is
Take an Itô process and a smooth function . A second-order Taylor expansion gives
In ordinary calculus the term would vanish. Here , so a second-order term survives into the first-order differential:
That extra — the Itô correction — is the single most consequential term in mathematical finance. It is why convexity has a price, why hedged option books bleed or earn theta, and why the drift of a log-price is not the drift of the price. Whenever a payoff is curved and the underlying is volatile, the correction term is where the money is.
Footnotes
-
Øksendal, B. (2003), Stochastic Differential Equations: An Introduction with Applications , 6th ed., Springer, pp. 21–84 (Itô integrals, Itô formula, and SDEs). doi:10.1007/978-3-642-14394-6 ↩
Solving Geometric Brownian Motion
3 min · Prerequisite: Note 01, Itô's Lemma
The SDE is solved by applying Itô's lemma to , for which and :
The right-hand side no longer involves ; it integrates directly:
Log-prices are Gaussian; prices are lognormal; prices stay positive. Two readings of the term repay attention. First, — the correction exactly offsets the convexity of the exponential, by design. Second, the median path grows at , strictly less than the mean growth rate. A volatile asset's average outcome is dragged upward by a shrinking minority of enormous paths while the typical path does worse. This "volatility drag" is not a market imperfection; it is arithmetic, and it is the quantitative core of why compounding punishes variance.
Risk-Neutral Pricing: Assumptions and Derivation
4 min · Prerequisites: discounting, replication, and binomial trees
Consider one period and two assets: a bond growing at , and a stock worth that moves to or with . To price a claim paying or , build a portfolio of shares and in bonds that replicates it in both states:
The real-world probability of the up-move never entered. The price is a discounted expectation under an artificial probability — the unique one that makes the discounted stock a martingale.1 This is the whole content of risk-neutral pricing: no arbitrage plus replication implies prices are expectations under a measure constructed for accounting convenience, not belief. In continuous time Girsanov's theorem plays the same role, shifting the drift of so that , and
The derivation requires that the payoff can be replicated under complete markets with continuous frictionless trading. With jumps, stochastic volatility, or transaction costs, replication is imperfect, is no longer unique, and the arbitrage-free price can become an interval. The selected measure then depends on market prices for non-replicable risk.
Footnotes
-
Shreve, S. E. (2004), Stochastic Calculus for Finance II: Continuous-Time Models , 1st ed., Springer, chs. 4–6, pp. 131–339 (stochastic calculus, risk-neutral pricing, and PDE connections), ISBN 978-0-387-40101-0. publisher record ↩
Feynman-Kac and the Black-Scholes PDE
4 min · Prerequisites: Note 01, Note 03, and PDE basics
The Feynman-Kac theorem is the bridge between expectations and differential equations. If
then solves
The proof idea is one line of Itô: apply the lemma to ; since a conditional expectation of a fixed terminal payoff is a martingale, its term must vanish, and that vanishing is the PDE. Now specialize to the risk-neutral stock , :
This is the Black-Scholes equation, and Feynman-Kac explains why it and the risk-neutral expectation of Note 03 are the same object viewed from opposite sides: the expectation is the PDE's stochastic representation; the PDE is the expectation's infinitesimal description. Solving it with the call payoff boundary condition yields the closed form in the pricing laboratory. The same bridge carries the physics intuition: the equation is a heat equation in disguise (substitute and rescale time), so option value diffuses — kinks in payoffs get smoothed exactly the way heat smooths a temperature spike.
Limitations
- The empirical study covers one underlying and one historical window.
- Close-to-close returns omit intraday price and volatility structure.
- The Heston parameters are illustrative rather than calibrated to contemporaneous market quotes.
- Heston still treats parameters as constants and omits jumps and rough-volatility effects.
- Simulated stochastic-volatility paths carry discretization bias that must be budgeted separately from sampling error.
Sources
- 1Heston, S. L. (1993), “A Closed-Form Solution for Options with Stochastic Volatility,” Review of Financial Studies 6(2), 327–343. doi:10.1093/rfs/6.2.327
- 2Rubinstein, M. (1994), “Implied Binomial Trees,” Journal of Finance 49(3), 771–818, especially pp. 771–775 on the post-1987 S&P 500 pattern. doi:10.1111/j.1540-6261.1994.tb00079.x
- 3Black, F., and M. Scholes (1973), “The Pricing of Options and Corporate Liabilities,” Journal of Political Economy 81(3), 637–654. doi:10.1086/260062
Cite this
Wisniewski, K. (2026, August 8). Constant-volatility pricing under empirical market behavior. Quantitative Markets & Institutions Lab. https://www.kylewisniewski.com/lab/volatility
@misc{wisniewski2026volatility,
author = {Wisniewski, Kyle},
title = {Constant-volatility pricing under empirical market behavior},
year = {2026},
month = {aug},
howpublished = {\url{https://www.kylewisniewski.com/lab/volatility}},
note = {Empirical finding · Quantitative Markets & Institutions Lab · commit 4806df9}
}