fGarch и rugarchНапоминание из прошлой лекции:
Итог: если мы умеем прогнозировать волатильность, то мы можем более аккуратно оценивать стоимость опционов, создавать более продвинутые системы риск-менеджмента и можем создавать стратегии для торговли волатильностью.
[1] "VIXCLS"
Пусть мы оцениваем волатильность акций Роснефти. Мы можем оценить волатильность по разным данным: 1) дневная доходность акций за каждый торговый день 2) внутридневная динамика торгов 3) стоимость опционов на акции Роснефти (если они есть). Эти три источника дают три возможных оценки волатильности:
Обычно волатильность сообщается на годовом уровне (% в год). Если вы оценили дневную волатильность, то вы можете оценить годовую волатильность, умножив ее на \(\sqrt{252}\), то есть квадратный корень из количества торговых дней в году (примерно равно 16)
К примеру, если нестационарный временной ряд имеет выраженную сезонность или устойчивый тренд, то дисперсия ряда изменяется вместе с сезонностью или трендом. Такая регулярность приводит к гетероскедастичности ряда. Почему?
Структура финансового рынка и поведение участников приводит к дополнительным причинам, почему увеличение дисперсии приводит к еще большему увеличению дисперсии в реальной жизни. К примеру, если большое количество участников использует стратегию “защиты” портфеля от снижения стоимости, то падение рынка приводит к автоматическим продажам и росту спросу на инструменты “защиты” (опционы) – то есть, к росту волатильности. Пример - октябрь 1987 года.
Пусть есть стационарная серия доходности \(r_t\), тогда
unconditional mean) – \(E(r_t)\) – ожидаемое значение доходности, оно не зависит от времени.conditional mean) – это ожидаемое значение доходности в момент времени \(t\), учитывая всю более раннюю информацию \(E(r_t|\Omega_{t-1})\). Условное среднее зависит от времени. Модели ARIMA оценивают условное среднее, так как учитывают предыдущую информацию.Ту же самую логику можно использовать для волатильности:
unconditional variance) – \(\sigma^2 = Var(r_t)\) – рассчитывается по стандартной формуле и не зависит от времени.conditioanl variance) – \(\sigma_t^2 = Var_t(r_t|\Omega_{t-1})\) – оценки дисперсии в момент времени \(t\) с учетом всей предыдущей информации.
One Sample t-test
data: MICEX.rtn
t = 1.3281, df = 2769, p-value = 0.1843
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.0001508796 0.0007842848
sample estimates:
mean of x
0.0003167026
Cудя по t-тесту, мы принимаем гипотезу о том, что среднее доходности равно 0.
Это и есть базовый принцип ARCH.
Пусть временной ряд \({\epsilon_t}\) имеет следующий вид:
\[ \epsilon_t = \sigma_t w_t \] где \(w_t\) – белый шум с нулевым средним и единичной дисперсией (белый шум может иметь нормальное распределение, но это не обязательно, распределение может быть и иным).
Часть \(\sigma_t\) – условная дисперсия (conditional variance), она имеет вид:
\[\sigma_t^2 = a_0 + a_1 \epsilon_{t-1}^2 \] \(a_0\) и \(a_1\) – это параметры модели, которые необходимо оценить.
Условная дисперсия ряда по определению равно \(\sigma_t^2 = Var(\epsilon_t | e_{t-1}, \ldots)\) ;
В этом случае ряд \({\epsilon_t}\) является процессом ARCH(1). Можно записать модель в следующем виде:
\[\epsilon_t = w_t \sqrt{a_0 + a_1 \epsilon_{t-1}^2} \] \(a_0 >0\) и \(a_1 > 0\) для того, чтобы часть под корнем была больше 0.
\(a_0 + a_1<1\) для того, чтобы ряд оставался стационарным с конечной дисперсией.
Немного математики:
\[ Var(\epsilon_t) = E[\epsilon_t^2] - (E[\epsilon_t])^2 = E[\epsilon_t^2] =E[w_t^2]E[a_0 + a_1 \epsilon_{t-1}^2]= \] \[=E[a_0 + a_1 \epsilon_{t-1}^2] = a_0 + a_1 Var(\epsilon_{t-1}) = a_0 + a_1 \epsilon_{t-1}^2 \]
учитывая, что среднее \(w_t\) равно 0, дисперсия – 1, а \(E[\epsilon_t] = 0\)
Достоинства:
Недостатки:
Модель ARCH порядка \(p\) имеет следующий вид:
\[\sigma_t^2 = w_t \sqrt{a_0 + \sum_{i=1}^{p} a_i \epsilon_{t-i}^2} \]
Пусть уравнение для среднего выглядит следующим образом: \(a_t = r + \mu_t\). Мы можем использовать квадраты остатков (\(a_t^2\)), чтобы проверить серию на условную гетерокседастичность (ARCH-эффект). Есть два варианта тестирования ARCH-эффекта:
\[ a_t^2 = \alpha _0 + \alpha_1 a_{t-1}^2 +\ldots + \alpha_{t-m}^2 + \epsilon_t, t = m +1, ..., T \]
Loading required package: FinTS
Attaching package: 'FinTS'
The following object is masked from 'package:forecast':
Acf
Box-Ljung test
data: y^2
X-squared = 527.63, df = 10, p-value < 2.2e-16
ARCH LM-test; Null hypothesis: no ARCH effects
data: y
Chi-squared = 253.16, df = 12, p-value < 2.2e-16
Оба теста указывают на присутствие ARCH-эффекта в серии

Можем оценить ARMA(1,1) модель для среднего доходностей и посмотреть на квадраты остатков этой модели:

Как видно, требуется достаточно много лагов (порядок модели), чтобы использовать ARCH.
AR(1) модель для среднего и ARCH(1) для дисперсии можно симулировать следующим образом:
n = 10200 #
e = rnorm(n)
a = e # ARCH
y = e # AR + ARCH
sig2 = e^2 # условная дисперсия
# параметры для ARCH
omega = 1
alpha = 0.55
#параметры для AR
phi = 0.8
mu = 0.1
omega/(1-alpha) # безусловное ст. отклонение[1] 2.222222
[1] 1.490712
set.seed("1234")
for (t in 2:n)
{
a[t] = sqrt(sig2[t])*e[t]
y[t] = mu + phi*(y[t-1]-mu) + a[t] # моделирование AR
sig2[t+1] = omega + alpha * a[t]^2 # моделирование ARCH
}
par(mfrow=c(2,4))
plot(e[10001:n],type="l",xlab="t",ylab=expression(epsilon),main="(a) белый шум")
plot(sqrt(sig2[10001:n]),type="l",xlab="t",ylab=expression(sigma[t]),
main="(b) условная дисперсия")
plot(a[10001:n],type="l",xlab="t",ylab="a",main="(c) ARCH")
plot(y[10001:n],type="l",xlab="t",ylab="y",main="(d) AR+ARCH")
acf(a[10001:n],main="(e) ARCH")
acf(a[10001:n]^2,main="(f) ARCH squared")
acf(y[10001:n],main="(g) AR+ARCH")
acf(y[10001:n]^2,main="(h) AR+ARCH squared")
Оценим ARCH(1)-модель для доходностей ММВБ при допущении о том, что среднее доходностей является константой. Используем помощью функцию garchFit из пакета fGarch.
Title:
GARCH Modelling
Call:
garchFit(formula = ~1 + garch(1, 0), data = MICEX.rtn, trace = F)
Mean and Variance Equation:
data ~ 1 + garch(1, 0)
<environment: 0x00000000260d9770>
[data = MICEX.rtn]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1
0.00044228 0.00012838 0.18042783
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 4.423e-04 2.291e-04 1.931 0.0535 .
omega 1.284e-04 4.252e-06 30.190 < 2e-16 ***
alpha1 1.804e-01 2.605e-02 6.927 4.3e-12 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
8269.523 normalized: 2.985387
Description:
Tue Jan 19 22:59:36 2021 by user: marce
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 7960.916 0
Shapiro-Wilk Test R W 0.9398179 0
Ljung-Box Test R Q(10) 7.46831 0.6806164
Ljung-Box Test R Q(15) 15.09148 0.444848
Ljung-Box Test R Q(20) 29.58857 0.07680031
Ljung-Box Test R^2 Q(10) 124.068 0
Ljung-Box Test R^2 Q(15) 155.9343 0
Ljung-Box Test R^2 Q(20) 168.5281 0
LM Arch Test R TR^2 101.4284 3.330669e-16
Information Criterion Statistics:
AIC BIC SIC HQIC
-5.968609 -5.962190 -5.968611 -5.966291
res <- residuals(arch1,standardize=T) # используем стандартизированные остатки для диагностики модели
Acf(res,lag=20)

# plot(arch1) диагностические графики для модели
plot(arch1, which = 13) # QQ-Plot of Standardized Residuals 
Оцененная модель имеет вид:
\[ r_t = 0.00044228 + a_t, \sigma^2 = 0.00012838 + 0.18042783 a_{t-1}^2 \] Все коэффициенты являются значимыми. ACF и PACF указывают на отсутствие автокорреляции в остатках
Та же самая модель с t-распределением Стьюдента для моделирования шоков серии.
arch1_student <- garchFit(~1+garch(1,0),data=MICEX.rtn,trace=F, cond.dist="std")
summary(arch1_student)
Title:
GARCH Modelling
Call:
garchFit(formula = ~1 + garch(1, 0), data = MICEX.rtn, cond.dist = "std",
trace = F)
Mean and Variance Equation:
data ~ 1 + garch(1, 0)
<environment: 0x000000001e31e5c8>
[data = MICEX.rtn]
Conditional Distribution:
std
Coefficient(s):
mu omega alpha1 shape
0.00060358 0.00012331 0.19347015 4.66362128
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 6.036e-04 1.976e-04 3.054 0.00226 **
omega 1.233e-04 6.949e-06 17.745 < 2e-16 ***
alpha1 1.935e-01 3.612e-02 5.356 8.5e-08 ***
shape 4.664e+00 4.047e-01 11.524 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
8461.216 normalized: 3.054591
Description:
Tue Jan 19 22:59:38 2021 by user: marce
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 8134.921 0
Shapiro-Wilk Test R W 0.9396215 0
Ljung-Box Test R Q(10) 7.359412 0.6911341
Ljung-Box Test R Q(15) 14.71742 0.471957
Ljung-Box Test R Q(20) 28.97493 0.0882542
Ljung-Box Test R^2 Q(10) 113.932 0
Ljung-Box Test R^2 Q(15) 144.5092 0
Ljung-Box Test R^2 Q(20) 155.9373 0
LM Arch Test R TR^2 95.98045 3.441691e-15
Information Criterion Statistics:
AIC BIC SIC HQIC
-6.106293 -6.097735 -6.106297 -6.103202
res <- residuals(arch1_student,standardize=T) # используем стандартизированные остатки
Acf(res,lag=20)


Использование распределения с более “тяжелыми хвостами” несколько уменьшило значение ARCH-коэффициента. График квантиль-квантиль также подтверждает, что использование распределения Стьюдента для шоков, приводит к более “нормальным” остаткам модели
Временной ряд \({\epsilon_t}\) имеет следующий вид:
\[ \epsilon_t = \sigma_t w_t \]
где \(w_t\) – белый шум с нулевым средним и единичной дисперсией, а часть \(\sigma_t^2\) имеет вид:
\[\sigma_t^2 = a_0 +\sum_{i=1}^{q} a_i \epsilon_{t-i}^2+ \sum_{j=1}^{p} \beta_i \sigma_{t-j}^2 \]
где \(\alpha_i\) и \(\beta_j\) – это параметры модели. Процесс \(\epsilon_t\) является GARCH(p,q)
GARCH(1,1) будет иметь следующий вид:
\[\epsilon_t = \sigma_t w_t \] \[ \sigma_t^2 = a_0 + a_1 \epsilon_{t-1}^2 + \beta_1 \sigma_{t-1}^2 \]
set.seed(2)
# параметры модели
a0 <- 0.2
a1 <- 0.5
b1 <- 0.3
w <- rnorm(10000) ## белый шум
eps <- rep(0, 10000) ## исходный ряд, пока заполненный нулями
sigsq <- rep(0, 10000) ## компонента GARCH
for (i in 2:10000) {
sigsq[i] <- a0 + a1 * (eps[i-1]^2) + b1 * sigsq[i-1]
eps[i] <- w[i]*sqrt(sigsq[i])
}
plot(eps, type = 'l')

вроде бы ничего необычного. Но если мы построим корелограмму квадратов рядов, то увидим выраженное убывание на последующих лагах (характеристика AR-процесса)


Мы можем также использовать функцию garch из пакета tseries
Call:
garch(x = eps, trace = FALSE)
Model:
GARCH(1,1)
Residuals:
Min 1Q Median 3Q Max
-4.11672 -0.66558 0.01997 0.68409 3.53687
Coefficient(s):
Estimate Std. Error t value Pr(>|t|)
a0 0.197947 0.009858 20.08 <2e-16 ***
a1 0.465840 0.019720 23.62 <2e-16 ***
b1 0.323213 0.018907 17.09 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diagnostic Tests:
Jarque Bera Test
data: Residuals
X-squared = 0.40598, df = 2, p-value = 0.8163
Box-Ljung test
data: Squared.Residuals
X-squared = 0.49885, df = 1, p-value = 0.48
2.5 % 97.5 %
a0 0.1786255 0.2172683
a1 0.4271900 0.5044903
b1 0.2861566 0.3602687
Оценим GARCH(1,1) при допущении о том, что среднее доходностей является константой:
library(fGarch)
garch11 <- fGarch::garchFit(~1+garch(1,1),data = MICEX.rtn,trace=F) # часть ~1 говорит о том, что надо оценивать константу
summary(garch11)
Title:
GARCH Modelling
Call:
fGarch::garchFit(formula = ~1 + garch(1, 1), data = MICEX.rtn,
trace = F)
Mean and Variance Equation:
data ~ 1 + garch(1, 1)
<environment: 0x000000001ec066e8>
[data = MICEX.rtn]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1 beta1
6.8373e-04 4.8906e-06 8.3033e-02 8.8698e-01
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 6.837e-04 2.026e-04 3.375 0.000737 ***
omega 4.891e-06 9.562e-07 5.114 3.15e-07 ***
alpha1 8.303e-02 1.084e-02 7.658 1.89e-14 ***
beta1 8.870e-01 1.352e-02 65.605 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
8449.8 normalized: 3.050469
Description:
Tue Jan 19 22:59:42 2021 by user: marce
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 12780.31 0
Shapiro-Wilk Test R W 0.9514622 0
Ljung-Box Test R Q(10) 7.362503 0.6908363
Ljung-Box Test R Q(15) 9.895236 0.8262776
Ljung-Box Test R Q(20) 16.44121 0.6889026
Ljung-Box Test R^2 Q(10) 1.199285 0.9996066
Ljung-Box Test R^2 Q(15) 1.640106 0.9999922
Ljung-Box Test R^2 Q(20) 2.550332 0.999999
LM Arch Test R TR^2 1.166496 0.9999667
Information Criterion Statistics:
AIC BIC SIC HQIC
-6.098050 -6.089492 -6.098054 -6.094959
mu omega alpha1 beta1
6.837316e-04 4.890593e-06 8.303282e-02 8.869753e-01
v11 = garch11@sigma.t*sqrt(252)*100
plot(index(MICEX.rtn), v11,type='l', xlab= 'год',ylab='% год', main = 'Оценка волатильности индекса ММВБ на основе GARCH(1,1) модели') 
Мы можем также использовать критерии AIC/BIC для выбора лучшей GARCH модели
Мы используем только одну серию для моделирования – серию фактических доходностей. Модель GARCH раскладывает эту серию на три части:
Мы можем использовать разные подходы для оценки среднего доходностей (часть 1):
Спецификация модели GARCH позволяется определить каким образом, рассчитываются части 2 и 3.
Мы пришли к выводу, что ARMA(1,1) является оптимальной моделью для серии.
Предупреждение указывает на то, что оптимизатор не смог найти значения коэффициентов. Поэтому текущие значения коэффициентов не имеют большого смысла.
попробуем использовать пакет rugarch. В этом пакете сначала необходимо создать объект, определяющиий тип оцениваемой модели, с помощью функции ugarchspec. Функция ugarchfit уже оценивает непосредственно модель. Для сложных моделей оценка может занимать определенное время.
library(rugarch)
spec = ugarchspec(
variance.model=list(garchOrder=c(1,1)),
mean.model=list(armaOrder=c(3,3), include.mean=T),
distribution.model="sged")
fit = tryCatch(
ugarchfit
(
spec,
MICEX.rtn,
solver = 'hybrid'
),
error=function(e) e,
warning=function(w) w
)
(fit)
*---------------------------------*
* GARCH Model Fit *
*---------------------------------*
Conditional Variance Dynamics
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model : ARFIMA(3,0,3)
Distribution : sged
Optimal Parameters
------------------------------------
Estimate Std. Error t value Pr(>|t|)
mu 0.000424 0.000102 4.1792 0.000029
ar1 0.238641 0.016278 14.6601 0.000000
ar2 0.365775 0.015568 23.4950 0.000000
ar3 0.336452 0.014442 23.2963 0.000000
ma1 -0.214936 0.013586 -15.8198 0.000000
ma2 -0.416820 0.000146 -2863.6284 0.000000
ma3 -0.338400 0.005354 -63.2086 0.000000
omega 0.000004 0.000002 1.9971 0.045812
alpha1 0.073719 0.010746 6.8602 0.000000
beta1 0.901728 0.012305 73.2804 0.000000
skew 0.931830 0.025378 36.7183 0.000000
shape 1.361341 0.045058 30.2131 0.000000
Robust Standard Errors:
Estimate Std. Error t value Pr(>|t|)
mu 0.000424 0.000115 3.6825 0.000231
ar1 0.238641 0.008679 27.4962 0.000000
ar2 0.365775 0.013660 26.7778 0.000000
ar3 0.336452 0.012390 27.1549 0.000000
ma1 -0.214936 0.006906 -31.1221 0.000000
ma2 -0.416820 0.000100 -4175.8666 0.000000
ma3 -0.338400 0.002625 -128.9265 0.000000
omega 0.000004 0.000007 0.4918 0.622859
alpha1 0.073719 0.013140 5.6103 0.000000
beta1 0.901728 0.029967 30.0909 0.000000
skew 0.931830 0.033238 28.0347 0.000000
shape 1.361341 0.088693 15.3489 0.000000
LogLikelihood : 8561.171
Information Criteria
------------------------------------
Akaike -6.1727
Bayes -6.1470
Shibata -6.1727
Hannan-Quinn -6.1634
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
statistic p-value
Lag[1] 1.348 0.2456
Lag[2*(p+q)+(p+q)-1][17] 6.637 1.0000
Lag[4*(p+q)+(p+q)-1][29] 11.257 0.9126
d.o.f=6
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
statistic p-value
Lag[1] 0.06575 0.7976
Lag[2*(p+q)+(p+q)-1][5] 0.52868 0.9532
Lag[4*(p+q)+(p+q)-1][9] 0.76934 0.9939
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
Statistic Shape Scale P-Value
ARCH Lag[3] 0.07316 0.500 2.000 0.7868
ARCH Lag[5] 0.32584 1.440 1.667 0.9333
ARCH Lag[7] 0.40023 2.315 1.543 0.9865
Nyblom stability test
------------------------------------
Joint Statistic: 9.4863
Individual Statistics:
mu 0.39537
ar1 0.11031
ar2 0.13475
ar3 0.16051
ma1 0.13858
ma2 0.16118
ma3 0.19770
omega 0.36519
alpha1 0.51354
beta1 0.75780
skew 0.18411
shape 0.07543
Asymptotic Critical Values (10% 5% 1%)
Joint Statistic: 2.69 2.96 3.51
Individual Statistic: 0.35 0.47 0.75
Sign Bias Test
------------------------------------
t-value prob sig
Sign Bias 0.7513 0.4526
Negative Sign Bias 0.2199 0.8260
Positive Sign Bias 1.1397 0.2545
Joint Effect 5.8979 0.1167
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
group statistic p-value(g-1)
1 20 42.04 0.001749
2 30 48.85 0.011971
3 40 62.38 0.010117
4 50 69.78 0.027120
Elapsed time : 3.50649


[1] 19.88745 19.88745 19.88745 20.03223 19.28927 20.22600


сравним оценку волатильности доходностей индекс ММВБ двух разных моделей:
plot(index(MICEX.rtn),v11,type="l",col="red", xlab= 'год', ylab = '% ujl')
lines(index(MICEX.rtn),v33,col="green")
Оценки модели очень близки друг к другу.
GARCH модели позволяют строить прогнозы исходной серии и прогнозы для волатильности:

