Reviewing a GARCH(1,1) Return and Price Simulation
Summary
The document presents code intended to simulate a GARCH(1,1) process. It updates conditional variance using a constant plus a coefficient on the previous squared return and another on the previous variance, then multiplies the resulting volatility by a standard normal shock to generate returns. It plots the volatility sequence, returns, and a price-like series formed by cumulatively summing returns from an initial level. The excerpt contains the proposed procedure and parameter values but no answer or evaluation, so it does not establish whether the simulation is correct. In particular, it leaves open whether the variance recursion and initialization are appropriate for the intended convention, and whether simple cumulative addition of returns is suitable for the asset-price representation. Readers should distinguish simulated returns from log returns or price changes and assess stationarity and parameter constraints before interpreting results. No performance evidence or comparison with a reference implementation is supplied.
Key ideas
- The proposed recursion makes conditional variance depend on the prior squared return and prior variance.
- Returns are generated by multiplying conditional volatility by standard normal shocks.
- The example constructs a price-like path by cumulatively adding returns to an initial value.
- The excerpt asks for conceptual review but includes no answer confirming correctness.
- Initialization, parameter restrictions, return definition, and price construction affect interpretation.
Tags
Full text
# Is this a GARCH Monte-Carlo simulation?
# Is this a GARCH Monte-Carlo simulation?
I tried this as a simulation for a GARCH(1,1) model. Is it correct? (I'm not speaking about the code itself, which works, but the underlying idea).
Here is plot (of `sigma`, `r` the returns, and the simulated asset price `x`) and Python code:
```
import numpy as np
import matplotlib.pylab as plt
n = 1000 * 100
eps = np.random.normal(0, 1, n)
sigma0, a, b, c = 0.0002, 0.0000002, 0.5, 0.4
sigma = np.ones(n) * sigma0
r = np.zeros(n)
for i in range(1,n):
sigma[i] = np.sqrt(a + b * r[i-1] ** 2 + c * sigma[i-1] ** 2)
r[i] = sigma[i] * eps[i]
x = np.cumsum(r) + 1.2 # summing the returns; starts at 1.20, see EUR/USD
f, ax = plt.subplots(3)
ax[0].plot(sigma)
ax[1].plot(r)
ax[2].plot(x)
plt.show()
```Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.