Martin Forde, Maths Dept.

Articles

Code

  • Python code to fit GARCH(1,1) model with (skewed) t-distributed residuals to daily returns data - compute MLEs for model parameters, p-values for 8 goodness-of-fit tests and qq-plot (works well for major FX rates/US tech stocks/Indices/Crypto, + simulates synthetic path(s) with MLE params and MLEs for the synthetic path and plots stationary distribution for V and R, and MLEs using in-built Python functions). SPX Intraday prices typically better fit with GARCH model with power law kernel for e.g. 1-1.5hrs with 5 second intervals to ensure most price changes are non-zero
  • Python code to fit GARCH(1,1) model using additional intraday data to reduce sample variance of MLEs, for SPX 3rdJan2022-16thJul2024 and EURUSD 3rdJan2022-23rdJune2023
  • MATLAB to compute SPX and VIX smiles and confidence intervals for their associated OTM (out-of-the-money) option prices for a Quadratic Rough Heston Model (calibrations updated 21/06/24); Python version used for calibrations not included here as it requires various sublibraries and runs fast on GPU using tensorflow, MATLAB version here gives the same answers but is slow), additional files required: RbarSeries.m, gamma_inc.m
  • Python code to maximize p-values for the RFSV model using realized variance data for SPX, EURUSD and AAPL, p-vals very low (easily modified for other log Gaussian models, e.g. Bacry-Muzy-Li or Abi-Jaber+Li). MATLAB version for model where fBM is replaced with a stationary fractional OU process) using normality tests: fOUmodelpvals.m, fOUMLEfunction.m (note estimating instantaneous variance with realized variance even using 1min bins is problematic since 6.5hr trading day corresponds to M=390 bins, but even if just estimating volatility of standard Brownian motion, from the CLT the standard error is 1.65*sqrt(2/M)=11.8% (factor of sqrt(2) appears because Var(Z^2)=2 if Z is N(0,1)) SPXRealizedVariance1minIntervals03Jan22to15Jul24.m normalitytest.m (in MATLAB as it appears difficult to compute incomplete Gamma function with negative 2nd argument in Python)
  • Python code which shows GARCH(1,1) goodness-of-fit tests "passing" (i.e. failing to reject) for returns series generated by a single synthetic qRHeston stock price path with 50 intraday time steps (using qRHeston code above), so in this sense the GARCH(1,1) model is a fake qRHeston model here

Publications

Older preprints

Teaching

  • FM14 Advanced Volatility Models and Path-dependent options
  • FM04 Stochastic Analysis
  • FM50 Bloomberg mini-course
  • FM02 Risk Neutral Valuation
  • CM338 Mathematical Finance II: Continuous Time
  • FM01 Applied Probability and Stochastics
  • Former PhD student: Benjamin Smith