Найти в Дзене
Квант

ARMIA и GARCH модели для предсказания цен акций

GARCH - это статистическая модель, используемая для анализа временных рядов, в которых дисперсия ошибки считается серийно автокоррелированной. GARCH-модели предполагают, что дисперсия ошибки следует авторегрессионному скользящему среднему процессу. GARCH-модели часто применяются для моделирования финансовых временных рядов, которые характеризуются изменчивостью волатильности и кластеризацией волатильности, то есть периодами колебаний, чередующимися с периодами относительного спокойствия. GARCH-модели полезны для оценки риска и ожидаемой доходности активов, которые демонстрируют кластеризованные периоды волатильности доходности. Авторегрессионный скользящий средний процесс Авторегрессионный скользящий средний процесс - это статистическая модель временных рядов, в которой дисперсия ошибки зависит от среднего значения своих предыдущих значений. Такая модель может быть записана в виде: , где Для оценки параметров модели скользящего среднего можно использовать метод максимального правдоподо
Оглавление

GARCH - это статистическая модель, используемая для анализа временных рядов, в которых дисперсия ошибки считается серийно автокоррелированной. GARCH-модели предполагают, что дисперсия ошибки следует авторегрессионному скользящему среднему процессу. GARCH-модели часто применяются для моделирования финансовых временных рядов, которые характеризуются изменчивостью волатильности и кластеризацией волатильности, то есть периодами колебаний, чередующимися с периодами относительного спокойствия. GARCH-модели полезны для оценки риска и ожидаемой доходности активов, которые демонстрируют кластеризованные периоды волатильности доходности.

Авторегрессионный скользящий средний процесс

Авторегрессионный скользящий средний процесс - это статистическая модель временных рядов, в которой дисперсия ошибки зависит от среднего значения своих предыдущих значений. Такая модель может быть записана в виде:

Авторегрессионный скользящий средний процесс
Авторегрессионный скользящий средний процесс

, где

  • yt - значение временного ряда в момент t.
  • c - постоянная
  • εt - белый шум
  • θ1,…,θq - параметры модели

Для оценки параметров модели скользящего среднего можно использовать метод максимального правдоподобия в предположении нормальности распределения ошибок. Для этого необходимо знать ковариационную матрицу ошибок, которая получается из автоковариационной функции модели. Затем используются численные методы максимизации логарифмической функции правдоподобия. Однако применение обычного метода наименьших квадратов затруднено, так как сумма квадратов остатков не выражается аналитически через значения ряда.

GARCH можно применить на практике для моделирования и прогнозирования волатильности финансовых временных рядов, которые демонстрируют кластеризацию волатильности. Для этого необходимо сначала определить подходящую модель среднего (например, ARIMA) для временного ряда доходностей, а затем оценить параметры GARCH-модели для остатков модели среднего. Для выбора оптимальной спецификации GARCH-модели можно использовать различные критерии, такие как Акаике или Шварца. Для оценки параметров GARCH-модели можно использовать метод максимального правдоподобия в предположении нормальности или другого распределения ошибок. Для прогнозирования волатильности можно использовать рекурсивную формулу, основанную на условной дисперсии и условном среднем.

Информационные критерии

Критерии Акаике и Шварца - это информационные критерии, которые используются для выбора наилучшей модели из нескольких альтернативных. Они учитывают не только качество приближения модели к данным, но и количество параметров модели, штрафуя за излишнюю сложность.

На практике оба критерия могут давать разные результаты при сравнении моделей. В этом случае можно использовать другие критерии, такие как критерий Ханнана-Куина или кросс-валидацию.

Критерий Акаике

Критерий Акаике рассчитывается по формуле:

AIC=−2*ln(⁡L)+k

, где

  • L - максимизированное значение функции правдоподобия модели,
  • k - число параметров модели.

Критерий Акаике же считается более эффективным и асимптотически оптимальным, то есть он выбирает модель, которая минимизирует среднеквадратичную ошибку прогноза.

Критерий Шварца

Критерий Шварца рассчитывается по формуле:

BIC=−2*ln(⁡L)+k*ln(⁡n)

, где

  • k - число параметров модели
  • n - число наблюдений.

Критерий Шварца налагает больший штраф за использование дополнительных параметров, чем критерий Акаике Поэтому критерий Шварца считается более консервативным и состоятельным, то есть он выбирает модель, которая ближе к истинной при увеличении размера выборки.

Критерий Ханнана-Куина

Критерий Ханнана-Куина - это еще один информационный критерий, который используется для выбора модели из нескольких альтернативных. Он похож на критерии Акаике и Шварца, но имеет другой вид функции штрафа за число параметров модели1. Критерий Ханнана-Куина рассчитывается по формуле:

HQC=−2*ln(⁡L)+2*k*ln⁡(ln(⁡n))

, где

  • L - максимизированное значение функции правдоподобия модели
  • n - число наблюдений
  • k - число параметров модели.

Критерий Ханнана-Куина находится между критерием Акаике и критерием Шварца по степени штрафа за сложность модели. Однако он теряет эффективность из-за наличия ln⁡(ln(⁡n)), что делает его менее оптимальным для прогнозирования.

ARIMA

ARIMA - это аббревиатура от Auto-Regressive Integrated Moving Average, то есть авторегрессионная интегрированная скользящая средняя модель. Это модель, которая использует временные ряды и статистический анализ для того, чтобы лучше понять данные или прогнозировать будущие тренды. ARIMA-модель строится на основе трех компонентов:

  • AR - авторегрессия: это означает, что текущее значение ряда зависит от его предыдущих значений с некоторыми коэффициентами
  • I - интегрирование или дифференцирование: это означает, что данные преобразуются таким образом, чтобы устранить нестационарность или общий тренд в данных
  • MA - скользящая средняя: это означает, что текущее значение ряда зависит от ошибок или шума в предыдущих значениях с некоторыми коэффициентами.

ARIMA-модель обычно обозначается как ARIMA(p,d,q), где

  • p - порядок авторегрессии
  • d - порядок дифференцирования
  • q - порядок скользящей средней.

Эти параметры определяют, какая комбинация из трех компонентов лучше подходит для описания и прогнозирования данных. ARIMA-модель может быть использована для анализа различных типов временных рядов, таких как экономические, финансовые, социальные и т.д., при условии, что данные не имеют сезонности, выбросов или неоднородной вариации.

Выбор оптимальных значений p,d,q для ARIMA-модели - это важный шаг в анализе временных рядов, так как от них зависит качество и адекватность модели. Существует несколько способов выбора этих параметров, например:

  • Анализ графиков автокорреляционной и частичной автокорреляционной функций (ACF и PACF) для ряда или его разностей. По этим графикам можно определить, какие лаги значимо влияют на текущее значение ряда и какой тип модели (AR или MA) лучше подходит1. Например, если ACF убывает экспоненциально, а PACF обрывается после некоторого лага p , то это указывает на AR(p)-модель. Если же ACF обрывается после некоторого лага q, а PACF убывает экспоненциально, то это указывает на MA(q)-модель. Если обе функции убывают экспоненциально, то это указывает на ARMA(p,q)-модель.
  • Использование автоматического выбора параметров с помощью информационных критериев, таких как Акаике (AIC), Шварца (BIC) или Ханнана-Куина (HQC). Эти критерии учитывают не только качество приближения модели к данным, но и количество параметров модели, штрафуя за излишнюю сложность. Чем меньше значение критерия, тем лучше модель. В R есть функция auto.arima из пакета forecast, которая позволяет автоматически выбирать параметры ARIMA-модели с помощью одного из этих критериев. Например, auto.arima(x, ic = “aic”) выберет модель с минимальным значением AIC.
  • Использование других методов оценки и сравнения моделей, таких как тестирование на стационарность (например, тест Дики-Фуллера), тестирование на нормальность и гомоскедастичность остатков модели (например, тест Харке-Бера или тест Уайта), анализ диагностических графиков (например, график остатков или график QQ-плот), анализ прогнозной силы модели (например, с помощью среднеквадратичной ошибки или коэффициента детерминации).

В общем случае нет однозначного правила для выбора оптимальных значений p,d,q для ARIMA-модели, и часто требуется пробовать разные комбинации и сравнивать результаты по разным критериям. Также стоит учитывать специфику данных и цель анализа при выборе модели.

Пример кода ARIMA

Импорт библиотек

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error

Получение данных по акциям Tesla за последние 7 дней

stock = yf.Ticker("TSLA")
data = stock.history(period="7d", interval="1m")
data = data.dropna()
data = data[["Close"]]

Разделение данных на обучающую и тестовую выборки

train_size = int(len(data) * 0.8)
train = data[:train_size]
test = data[train_size:]

Преобразование данных в логарифмическую шкалу

train_log = np.log1p(train)
test_log = np.log1p(test)

Подбор оптимальных параметров p, d, q для модели ARIMA

best_score = float("inf")
best_params = None for p in range(5):
for d in range(2):
for q in range(5):
try:
model = ARIMA(train_log, order=(p,d,q))
model_fit = model.fit()
predictions = model_fit.predict(start=train_size, end=len(data)-1)
rmse = np.sqrt(mean_squared_error(test_log, predictions))
if rmse < best_score:
best_score = rmse
best_params = (p,d,q)
except:
continue

Обучение модели ARIMA с оптимальными параметрами

model = ARIMA(train_log, order=best_params)
model_fit = model.fit()

Прогнозирование цены акций на тестовой выборке

predictions = model_fit.predict(start=train_size, end=len(data)-1)

Возврат к исходной шкале из логарифмической

predictions = np.expm1(predictions)

Визуализация результатов

plt.figure(figsize=(12,8))
plt.plot(train["Close"], label="Тренировочное")
plt.plot(test["Close"], label="Тест")
plt.plot(predictions, label="Предсказание")
plt.title("ARIMA модель")
plt.xlabel("Время")
plt.ylabel("Цена закрытия")
plt.legend()
plt.show()
ARIMA модель предсказывает цену в 167.7 - 167.9 за акцию Тесла.
ARIMA модель предсказывает цену в 167.7 - 167.9 за акцию Тесла.

GARCH

GARCH - это модель, которая позволяет прогнозировать волатильность финансовых временных рядов, таких как цены акций. Волатильность - это мера изменчивости или риска цены акции. Прогнозирование волатильности может быть полезно для инвесторов, которые хотят оценить риск своих портфелей или определить оптимальную стратегию торговли.

Для применения GARCH для прогнозирования цен акций необходимо выполнить следующие шаги:

1. Собрать исторические данные о ценах акций за интересующий период (например, с помощью сервиса выгрузки котировок ФИНАМ или выгрузить из торгового терминала).

2. Преобразовать цены акций в доходности акций, то есть процентное изменение цены за единицу времени (например, с помощью формулы:

Изменение цены за единицу времени
Изменение цены за единицу времени

, где

  • rt - доходность в момент t
  • Pt - цена в момент t.

3. Определить подходящую модель среднего для ряда доходностей (например, ARIMA) и оценить ее параметры с помощью метода максимального правдоподобия или другого подходящего метода.

4. Оценить остатки модели среднего и проверить наличие эффекта кластеризации волатильности, то есть того, что высокая волатильность в один период склонна сопровождаться высокой волатильностью в другой период (например, с помощью теста Льюнга-Бокса на автокорреляцию квадратов остатков).

5. Если эффект кластеризации волатильности присутствует, выбрать подходящую спецификацию GARCH-модели для остатков модели среднего (например, GARCH(1,1)) и оценить ее параметры с помощью метода максимального правдоподобия или другого подходящего метода.

6. Проверить адекватность GARCH-модели с помощью различных критериев, таких как информационные критерии (AIC, BIC и т.д.), тесты на нормальность и гетероскедастичность остатков GARCH-модели и диагностические графики (например, график условной дисперсии)

7. Использовать GARCH-модель для прогнозирования условной дисперсии или стандартного отклонения доходностей акций на интересующий горизонт (например, с помощью рекурсивной формулы для GARCH(1,1):

Дисперсия для GARCH(1,1)
Дисперсия для GARCH(1,1)

8. Использовать условную дисперсию или стандартное отклонение для расчета доверительных интервалов или предельных значений для прогнозируемых доходностей акций.

Простой пример кода Garch

Импортируем необходимые библиотеки

import pandas as pd
import numpy as np
import statsmodels.api as sm
from arch import arch_model

Загружаем данные о ценах акций

df = pd.read_csv("input.csv")

Преобразуем цены акций в доходности акций

df["Return"] = np.log(df["Close"] / df["Close"].shift(1))

Удаляем первую строку с пропущенным значением

df = df.dropna()

Определяем модель среднего как AR(1)

mean_model = sm.tsa.ARMA(df["Return"], order=(1,0))


Оцениваем параметры модели среднего

mean_results = mean_model.fit()


Выводим результаты оценки модели среднего

print(mean_results.summary())


Определяем GARCH(1,1)-модель для остатков модели среднего

garch_model = arch_model(mean_results.resid, p=1, q=1)


Оцениваем параметры GARCH-модели

garch_results = garch_model.fit()


Выводим результаты оценки GARCH-модели

print(garch_results.summary())


Прогнозируем условную дисперсию на 10 дней вперёд

forecasts = garch_results.forecast(horizon=10)


Выводим прогнозы условной дисперсии

print(forecasts.variance[-1:])

Пример кода GARCH с поиском параметров

Импорт библиотек

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from arch import arch_model

Получение данных по акциям Apple за последние 7 дней

stock = yf.Ticker("AAPL")
data = stock.history(period="7d", interval="1m")
data = data.dropna()
data = data[["Close"]]

Расчёт ежедневных доходностей (в процентах)

returns = data.pct_change().dropna()

Построение ARIMA модели для среднего процесса.
Подбор оптимальных параметров p, d, q с помощью информационного критерия Акаике (AIC)

best_aic = np.inf
best_order = None
best_model = None

Перебор всех возможных комбинаций p, d, q в диапазоне от 0 до 4

for i in range(5):
for d in range(5):
for j in range(5):
try:
# Создание и обучение модели ARIMA с заданными параметрами
model = ARIMA(returns, order=(i,d,j))
model_fit = model.fit()
# Получение значения AIC для модели
aic = model_fit.aic
# Сохранение лучшей модели, порядка и AIC
if aic < best_aic:
best_aic = aic
best_order = (i,d,j)
best_model = model_fit
except:
continue

print("Best ARIMA model:", best_order, "AIC:", best_aic)

Построение GARCH модели для условной дисперсии.
Подбор оптимальных параметров p и q с помощью информационного критерия Акаике (AIC)

best_aic = np.inf
best_order = None
best_model = None

Перебор всех возможных комбинаций p и q в диапазоне от 0 до 4

for i in range(5):
for j in range(5):
try:
# Создание и обучение модели GARCH с заданными параметрами и остатками ARIMA модели в качестве входных данных
model = arch_model(best_model.resid, mean="Zero", vol="GARCH", p=i, q=j)
model_fit = model.fit(disp="off")
# Получение значения AIC для модели
aic = model_fit.aic
# Сохранение лучшей модели, порядка и AIC
if aic < best_aic:
best_aic = aic
best_order = (i,j)
best_model = model_fit
except:
continue

print("Best GARCH model:", best_order, "AIC:", best_aic)

Прогнозирование дисперсии на один шаг вперёд с помощью GARCH модели

forecasts = best_model.forecast(horizon=1)
variance = forecasts.variance.iloc[-1][0]
std_dev = np.sqrt(variance)

Вывод прогноза дисперсии и стандартного отклонения на графике

plt.figure(figsize=(12,8))
plt.plot(returns, label="Returns")
plt.plot(returns.index[-1], std_dev, marker="o", color="red", label="Forecast Std Dev")
plt.title("GARCH модель")
plt.xlabel("Время")
plt.ylabel("Доход")
plt.legend()
plt.show()