fGarch
и rugarch
Напоминание из прошлой лекции:
Итог: если мы умеем прогнозировать волатильность, то мы можем более аккуратно оценивать стоимость опционов, создавать более продвинутые системы риск-менеджмента и можем создавать стратегии для торговли волатильностью.
[1] "VIXCLS"
Пусть мы оцениваем волатильность акций Роснефти. Мы можем оценить волатильность по разным данным: 1) дневная доходность акций за каждый торговый день 2) внутридневная динамика торгов 3) стоимость опционов на акции Роснефти (если они есть). Эти три источника дают три возможных оценки волатильности:
Обычно волатильность сообщается на годовом уровне (% в год). Если вы оценили дневную волатильность, то вы можете оценить годовую волатильность, умножив ее на \(\sqrt{252}\), то есть квадратный корень из количества торговых дней в году (примерно равно 16)
К примеру, если нестационарный временной ряд имеет выраженную сезонность или устойчивый тренд, то дисперсия ряда изменяется вместе с сезонностью или трендом. Такая регулярность приводит к гетероскедастичности ряда. Почему?
Структура финансового рынка и поведение участников приводит к дополнительным причинам, почему увеличение дисперсии приводит к еще большему увеличению дисперсии в реальной жизни. К примеру, если большое количество участников использует стратегию “защиты” портфеля от снижения стоимости, то падение рынка приводит к автоматическим продажам и росту спросу на инструменты “защиты” (опционы) – то есть, к росту волатильности. Пример - октябрь 1987 года.
Пусть есть страционарная серия доходности \(r_t\), тогда
uncondtional 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.5861, df = 2021, p-value = 0.1129
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-9.087398e-05 8.595139e-04
sample estimates:
mean of x
0.0003843199
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 = 99.046, df = 10, p-value < 2.2e-16
ARCH LM-test; Null hypothesis: no ARCH effects
data: y
Chi-squared = 78.243, df = 12, p-value = 8.919e-12
Оба теста указывают на присутствие 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: 0x0000000018ece1a8>
[data = MICEX.rtn]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1
0.00038083 0.00010574 0.10391464
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 3.808e-04 2.385e-04 1.597 0.110311
omega 1.057e-04 4.056e-06 26.068 < 2e-16 ***
alpha1 1.039e-01 2.689e-02 3.865 0.000111 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
6293.094 normalized: 3.112312
Description:
Mon Jan 27 19:09:49 2020 by user: m_salihov
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 9244.496 0
Shapiro-Wilk Test R W 0.9469179 0
Ljung-Box Test R Q(10) 6.961889 0.7290379
Ljung-Box Test R Q(15) 10.07718 0.8148569
Ljung-Box Test R Q(20) 13.19756 0.8687475
Ljung-Box Test R^2 Q(10) 20.55691 0.0244041
Ljung-Box Test R^2 Q(15) 22.82345 0.08796106
Ljung-Box Test R^2 Q(20) 25.45383 0.1846171
LM Arch Test R TR^2 18.61699 0.09820034
Information Criterion Statistics:
AIC BIC SIC HQIC
-6.221656 -6.213330 -6.221661 -6.218601
res <- residuals(arch1,standardize=T) # используем стандартизированные остатки для диагностики модели
Acf(res,lag=20)
# plot(arch1) диагностические графики для модели
plot(arch1, which = 13) # QQ-Plot of Standardized Residuals
Оцененная модель имеет вид:
\[ r_t = 0.00024345 + a_t, \sigma^2 = 0.00011673 + 0.09224500 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: 0x000000001bd17fc8>
[data = MICEX.rtn]
Conditional Distribution:
std
Coefficient(s):
mu omega alpha1 shape
4.6079e-04 9.7941e-05 1.3503e-01 5.8797e+00
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 4.608e-04 2.138e-04 2.155 0.031167 *
omega 9.794e-05 5.550e-06 17.647 < 2e-16 ***
alpha1 1.350e-01 3.644e-02 3.705 0.000211 ***
shape 5.880e+00 7.148e-01 8.226 2.22e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
6403.433 normalized: 3.166881
Description:
Mon Jan 27 19:09:49 2020 by user: m_salihov
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 10009.05 0
Shapiro-Wilk Test R W 0.9455571 0
Ljung-Box Test R Q(10) 6.67251 0.7559579
Ljung-Box Test R Q(15) 9.778589 0.8334312
Ljung-Box Test R Q(20) 12.76429 0.8872668
Ljung-Box Test R^2 Q(10) 17.39947 0.06597898
Ljung-Box Test R^2 Q(15) 19.40363 0.1960224
Ljung-Box Test R^2 Q(20) 21.53908 0.3660359
LM Arch Test R TR^2 16.2183 0.1814409
Information Criterion Statistics:
AIC BIC SIC HQIC
-6.329805 -6.318703 -6.329813 -6.325731
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: 0x0000000017337ee0>
[data = MICEX.rtn]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1 beta1
5.9404e-04 4.6072e-06 5.6942e-02 9.0595e-01
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 5.940e-04 2.264e-04 2.624 0.008702 **
omega 4.607e-06 1.346e-06 3.424 0.000618 ***
alpha1 5.694e-02 1.320e-02 4.314 1.6e-05 ***
beta1 9.060e-01 2.072e-02 43.724 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log Likelihood:
6344.531 normalized: 3.13775
Description:
Tue Jan 28 20:27:35 2020 by user: m_salihov
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 18025.48 0
Shapiro-Wilk Test R W 0.938596 0
Ljung-Box Test R Q(10) 3.038938 0.9804928
Ljung-Box Test R Q(15) 5.947652 0.9806137
Ljung-Box Test R Q(20) 8.487828 0.9881163
Ljung-Box Test R^2 Q(10) 0.9285449 0.9998776
Ljung-Box Test R^2 Q(15) 1.423367 0.999997
Ljung-Box Test R^2 Q(20) 1.756941 1
LM Arch Test R TR^2 1.110188 0.9999747
Information Criterion Statistics:
AIC BIC SIC HQIC
-6.271544 -6.260443 -6.271552 -6.267470
mu omega alpha1 beta1
5.940427e-04 4.607179e-06 5.694173e-02 9.059504e-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.
Series: MICEX.rtn
ARIMA(2,0,2) with non-zero mean
Coefficients:
ar1 ar2 ma1 ma2 mean
0.7792 -0.5664 -0.7773 0.5322 4e-04
s.e. 0.5145 0.5738 0.5211 0.5885 2e-04
sigma^2 estimated as 0.0001187: log likelihood=6271.65
AIC=-12531.3 AICc=-12531.26 BIC=-12497.63
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set -4.443801e-05 0.01088199 0.007951956 -Inf Inf 0.7091144
ACF1
Training set 0.003324274
Предупреждение указывает на то, что оптимизатор не смог найти значения коэффициентов. Поэтому текущие значения коэффициентов не имеют большого смысла.
попробуем использовать пакет 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.000431 0.000233 1.8518 0.064053
ar1 0.189335 0.011645 16.2586 0.000000
ar2 -0.781756 0.006700 -116.6736 0.000000
ar3 -0.378325 0.011873 -31.8647 0.000000
ma1 -0.145958 0.002124 -68.7036 0.000000
ma2 0.760576 0.000178 4262.1596 0.000000
ma3 0.420458 0.000199 2112.7758 0.000000
omega 0.000002 0.000002 0.8715 0.383483
alpha1 0.048260 0.023036 2.0950 0.036173
beta1 0.933232 0.027814 33.5526 0.000000
skew 0.974339 0.027399 35.5617 0.000000
shape 1.327237 0.057339 23.1471 0.000000
Robust Standard Errors:
Estimate Std. Error t value Pr(>|t|)
mu 0.000431 0.000319 1.353063 0.176035
ar1 0.189335 0.103649 1.826699 0.067745
ar2 -0.781756 0.062726 -12.463018 0.000000
ar3 -0.378325 0.101064 -3.743410 0.000182
ma1 -0.145958 0.015931 -9.162173 0.000000
ma2 0.760576 0.001570 484.420406 0.000000
ma3 0.420458 0.001675 251.046693 0.000000
omega 0.000002 0.000027 0.081055 0.935398
alpha1 0.048260 0.218252 0.221122 0.824998
beta1 0.933232 0.277155 3.367183 0.000759
skew 0.974339 0.157307 6.193848 0.000000
shape 1.327237 0.472835 2.806979 0.005001
LogLikelihood : 6436.01
Information Criteria
------------------------------------
Akaike -6.3541
Bayes -6.3208
Shibata -6.3542
Hannan-Quinn -6.3419
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
statistic p-value
Lag[1] 0.4759 0.4903
Lag[2*(p+q)+(p+q)-1][17] 1.8620 1.0000
Lag[4*(p+q)+(p+q)-1][29] 5.2499 1.0000
d.o.f=6
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
statistic p-value
Lag[1] 0.4092 0.5224
Lag[2*(p+q)+(p+q)-1][5] 0.6169 0.9382
Lag[4*(p+q)+(p+q)-1][9] 0.7745 0.9937
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
Statistic Shape Scale P-Value
ARCH Lag[3] 0.1876 0.500 2.000 0.6649
ARCH Lag[5] 0.3232 1.440 1.667 0.9340
ARCH Lag[7] 0.4031 2.315 1.543 0.9863
Nyblom stability test
------------------------------------
Joint Statistic: 76.8199
Individual Statistics:
mu 0.20597
ar1 0.05513
ar2 0.12936
ar3 0.13974
ma1 0.11222
ma2 0.03197
ma3 0.13386
omega 2.28167
alpha1 0.47662
beta1 0.65528
skew 0.04106
shape 0.08178
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.7525 0.4518
Negative Sign Bias 0.1022 0.9186
Positive Sign Bias 0.2840 0.7764
Joint Effect 1.6855 0.6402
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
group statistic p-value(g-1)
1 20 40.12 0.003159
2 30 46.34 0.021710
3 40 55.11 0.045169
4 50 66.13 0.051801
Elapsed time : 3.653
[1] 17.27730 17.27730 17.27730 16.85526 16.52336 17.37468
сравним оценку волатильности доходностей индекс ММВБ двух разных моделей:
Error in xy.coords(x, y, xlabel, ylabel, log): 'x' and 'y' lengths differ
Error in plot.xy(xy.coords(x, y), type = type, ...): plot.new has not been called yet
Оценки модели очень близки друг к другу.
GARCH модели позволяют строить прогнозы исходной серии и прогнозы для волатильности: