Прогнозирование изменения цены акций с помощью временных рядов

машинное обучение алгоритм

Введение во временные ряды

Математически стохастический процесс определяется как семейство временных случайных величин, а именно {x(t), t∈T}, где T представляет диапазон изменений в момент времени t. При T={0,±1,±2,…} такой случайный процесс x(t) является случайной функцией дискретного времени t, называемой временным рядом. Компонентами временного ряда являются: долгосрочные тренды, сезонные изменения, циклические изменения и нерегулярные изменения:

  • Долгосрочный тренд (Т)Это общая тенденция изменения, сформированная некоторыми фундаментальными факторами в течение длительного периода времени.
  • Сезонные изменения (S)Это регулярная циклическая смена, происходящая со сменой сезонов в течение года. Это результат различных факторов, таких как климатические условия, условия производства, праздники или обычаи людей.
  • Циклическая вариация (С)Это временной ряд, который демонстрирует периодические изменения нефиксированной длины. Цикл циклических колебаний может длиться какое-то время, но в отличие от тренда это не непрерывное движение в одном направлении, а чередующаяся волна равных колебаний.
  • Нерегулярное движение (I)Это случайное колебание во временном ряду после удаления тенденций, сезонных изменений и периодических колебаний. Нерегулярные колебания обычно смешиваются во временном ряду, вызывая волнообразные или колебательные изменения временного ряда. Ряд, содержащий только случайные колебания, также называется стационарным рядом.

Стационарность ряда

Вот примерно то, что написано в Baidu:Стационарный временной ряд Грубо говоря, временной ряд называется стационарным, если в нем нет систематического изменения среднего (нет тренда), нет систематического изменения дисперсии и строго исключены периодические изменения..

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

  • Ян Пинпинг: Если для всех моментов времени t любое натуральное число k и любое k положительных целых чисел(t_1,t_2,...,t_k), (r_{t1},r_{t2},...,r_{tk})Совместное распространение и(r_{t1+t},r_{t2+t},...,r_{tk+t})Совместное распределение такое же, мы называем временной ряд{r_t}Он строг и стабилен. Это,(r_{t1},r_{t2},...,r_{tk})Сильным условием является то, что совместное распределение , остается неизменным при поступательном преобразовании времени.
  • широкий и устойчивый: если временной ряд\{r_t\}Выполняются следующие два условия:E(r_t)=\mu,\muявляется константойCov(r_t,r_{t-l}) = \gamma _l,\gamma _lзависит только от l временного ряда\{r_t\}слабо стационарен. среднее значение ряда,r_tиr_{t−l}Ковариация не меняется со временем, а l — любое целое число.

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

разница, это временной ряд\{r_t\}значение в момент времени tr_tсо значением в момент времени t−1r_{t−1}разницаd_t, то получим новую последовательность\{d_t\}, является разностью первого порядка для новой последовательности\{d_t\}Проделайте ту же операцию еще раз, это разница второго порядка. Обычно нестационарные временные ряды могут быть преобразованы в слабостационарные или приблизительно слабостационарные временные ряды после d разностей.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
 
import tushare as ts
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH',start_date='20180101') #茅台股价
 
df = df[['trade_date','close']]
df['trade_date'] = pd.to_datetime(df['trade_date'])
data = df.set_index('trade_date')
 
data['change_pct'] =''
for i in range(0,len(data['close'])-1):
    data.iloc[i, 1] = 100*(data['close'][i+1] - data['close'][i])/data['close'][i] # 计算每日收益率(涨跌幅)
data['change_pct'] = data['change_pct'][0:-1] 
data['close_diff_1'] = data['close'].diff(1)
data = data[0:-1] # 由于changepct值最后一行缺失,因此去除最后一行
data['change_pct'] = data['change_pct'].astype('float64') #使changepct数据类型和其他三列保持一致
 
data.plot(subplots=True,figsize=(12,12))

Коэффициенты корреляции и автокорреляционные функции

Коэффициент корреляции

Для двух векторов мы хотим определить, связаны они или нет. Очень естественной идеей является использование угла между вектором и вектором в качестве определения расстояния.Чем меньше угол, тем меньше расстояние, и чем больше угол, тем больше расстояние. Мы часто используем формулу косинуса для вычисления углов:

 \[\cos<\vec{a},\vec{b}>=\frac{\vec{a}\cdot \vec{b}}{\lvert \vec{a} \rvert \lvert \vec{b} \rvert}\]

за\vec{a}\cdot \vec{b}Мы называем это внутренним продуктом, например:

 \[(x_1,y_1)\cdot (x_2,y_2)={x_1}{x_2}+{y_1}{y_2}\]

Формула определения коэффициента корреляции, коэффициента корреляции между X и Y:

 \[\rho_{xy} = \frac{Cov(X,Y)}{\sqrt{Var(X)Var(Y)}}\]

Формула расчета сметы по выборке:

 \[\rho_{xy} = \frac{\sum_{t=1}^{T}(x_t- \bar x)(y_t-\bar y)}{\sqrt{ \sum_{t=1}^{T}(x_t- \bar x)^{2}\sum_{t=1}^{T}(y_t- \bar y)^{2}}} = \frac{\overrightarrow{(X- \bar x)} \cdot \overrightarrow{(Y- \bar y)}}{\lvert \overrightarrow{(X- \bar x)} \rvert \lvert \overrightarrow{(Y- \bar y)} \rvert}\]

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

Если два вектора параллельны, коэффициент корреляции равен 1 или -1, 1, когда они направлены в одном направлении, и -1, когда они направлены в противоположные стороны. Если два вектора перпендикулярны, косинус прилежащего угла равен 0, что указывает на то, что они не связаны. Чем меньше угол между двумя векторами, тем ближе абсолютное значение коэффициента корреляции к 1 и тем выше корреляция. Просто здесь при расчете вектор деусредняется, то есть операция централизации. вместо прямого использования вектораX, Yрассчитать.

Автокорреляционная функция (ACF)

Коэффициент корреляции измеряет линейную корреляцию двух векторов, в то время как в стационарных временных рядах\{r_t\}, мы иногда задаемся вопросом,r_tсо своей прошлой стоимостьюr_{t-i}линейная корреляция. В настоящее время мы расширяем понятие коэффициента корреляции до коэффициента автокорреляции.

r_tиr_{t-l}Коэффициент корреляции называетсяr_tИнтервалlКоэффициент автокорреляции , обычно записывается как\rho_l:

 \[\rho_l = \frac{Cov(r_t,r_{t-l})} {\sqrt{Var(r_t)Var(r_{t-l})}} = \frac{Cov(r_t,r_{t-l})} {Var(r_t)} \]

Здесь используются свойства слабостационарных рядов:

 \[Var(r_t) = Var(r_{t-l})\]

образец стационарного временного ряда\{r_t\},1\le t\le T, то интервал равенlОценка выборочного коэффициента автокорреляции для:

 \[\hat \rho_l = \frac{\sum_{t=l+1}^{T}(r_t- \bar r)(r_{t-l}-\bar r)}{ \sum_{t=1}^{T}(r_t- \bar r)^{2}}, 0 \leqslant l \leqslant T-1\]

затем функция\hat \rho_1,\hat \rho_2 ,\hat \rho_3...называетсяr_tизПример функции автокорреляции (ACF)

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

Гибридная инспекция

Нулевая гипотеза:

 \[H0: \rho_1 = ... = \rho_m=0\]

Альтернативная гипотеза:

 \[H1: \exists i \in \{1,...,m\}, \rho_i \ne 0\]

Статистика смешанного теста:

 \[Q(m) = T(T+2) \sum_{l=1}^{m} \frac{\hat{\rho_l}^{2}}{T-l}\]

Q(m)Степени свободы прогрессивного послушанияmиз\chi^2распределенный

Правила принятия решения:

 \[Q(m) > \chi_\alpha^{2} ,拒绝H_0\]

который,Q(m)больше, чем степень свободыmхи-квадрат распределения100(1-\alpha)квантили, мы отвергаемH_0.

Большинство программ дастQ(m)p-значение, тогда, когда p-значение меньше или равно уровню значимости\alphaПри отклонении H0.

Пример:

import statsmodels.api as sm
close_data = data['close'] # 上证指数每日收盘价
m = 10 # 检验10个自相关系数
 
acf,q,p = sm.tsa.acf(close_data, nlags=m, qstat = True)
 
# np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()。
# np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
out = np.c_[range(1,11), acf[1:], q, p]
 
output = pd.DataFrame(out, columns=['lag', 'ACF', 'Q', 'P-value'])
output = output.set_index('lag')
print(output)

lag        ACF            Q        P-value
1.0   0.963283   212.504727   3.903196e-48
2.0   0.928599   410.863584   6.054892e-90
3.0   0.893812   595.463129  9.703299e-129
4.0   0.858595   766.569712  1.337073e-164
5.0   0.820359   923.482644  2.201222e-197
6.0   0.778788  1065.538402  5.955998e-227
7.0   0.744518  1195.960070  5.278705e-254
8.0   0.712521  1315.960270  8.343090e-279
9.0   0.686764  1427.955165  7.044640e-302
10.0  0.658661  1531.448754   0.000000e+00

Примем уровень значимости за 0,05, видно, что все p-значения меньше 0,05, тогда отвергаем нулевую гипотезуH_0. Поэтому мы считаем, что последовательность коррелирует с последовательностью. Давайте посмотрим на ряд дневной доходности за тот же период:

change_data = data['change_pct']
m = 10 # 检验10个自相关系数
 
acf,q,p = sm.tsa.acf(change_data,nlags=m,qstat=True)  ## 计算自相关系数 及p-value
out = np.c_[range(1,11), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
print(output)

lag         AC         Q   P-value
1.0   0.010467  0.025092  0.874137
2.0  -0.018733  0.105814  0.948468
3.0  -0.015576  0.161875  0.983496
4.0  -0.023547  0.290575  0.990414
5.0   0.034672  0.570871  0.989298
6.0  -0.133740  4.760213  0.574915
7.0  -0.047866  5.299284  0.623491
8.0  -0.085952  7.045520  0.531729
9.0   0.064843  8.043923  0.529726
10.0 -0.032424  8.294713  0.600074

Видно, что все значения p превышают уровень значимости 0,05. Мы выбираем предположитьH_0, то есть ряд возвратов не имеет значимой корреляции.

Ряды белого шума и линейные временные ряды

последовательность белого шума

Случайные переменныеX(t)(t=1,2,3...), если он состоит из последовательности некоррелированных случайных величин, то есть для всех S, не равных T,Случайные переменныеX_tиX_sКовариация равна нулю, это называетсячисто случайный процесс.

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

Линейный временной ряд

последовательно{r_t}, если это можно записать так:

 \[r_t = \mu + \sum_{i=0}^{\infty}\psi_ia_{t-i}\]

\muзаr_tсреднее значение ,psi_0=1,\{a_t\}представляет собой последовательность белого шума, то мы называем {r_t} — линейная последовательность. вa_tпозвонил вtмоментинновацииилиШок.

Многие временные ряды являются линейными, то есть линейными временными рядами, и, соответственно, существует много моделей линейных временных рядов, таких как те, которые будут представлены далее.АР, Массачусетс, АРМА, являются линейными моделями, но не все финансовые временные ряды являются линейными. Для слабостационарных последовательностей легко получитьr_tСреднее значение и дисперсия:

 \[E(r_t) = \mu , Var(r_t) = \sigma_a^2 \sum_{i=0}^{\infty} \psi_i^{2}\]

\sigma_a^2заa_tДисперсия. так какVar(r_t)должно быть меньше положительной бесконечности, поэтому\{\psi_i^2\}должно бытьсходящаяся последовательность, тем самым удовлетворяяi \to \infty  час,\psi_i^2 \to 0. То есть сiувеличение, возмущение на расстоянииa_{t-i}правильноr_tэффект постепенно исчезнет.

Авторегрессионные (AR) модели

В предыдущем разделе мы рассчитали АКФ некоторых концов данных, Глядя на таблицу, мы видим, что коэффициент автокорреляции значим, когда интервал равен 1. Это показывает, что вt-1данные времениr_{t-1}, в прогнозированииtвремяr_tможет быть полезно!

Исходя из этого, мы можем построить следующую модель:

 \[r_t = \phi_0 + \phi_1r_{t-1} + a_t\]

в{a_t}Дапоследовательность белого шума, эта модель имеет ту же форму, что и простая модель линейной регрессии, которую также называют моделью авторегрессии первого порядка (AR) или моделью AR(1) для краткости.

Модель AR(1) легко обобщить на модель AR(p):

 \[r_t = \phi_0 + \phi_1r_{t-1} + \cdots + \phi_pr_{t-p}+ a_t \qquad (2.0)\]

Характеристический корень и тест на стационарность модели AR(p)

Сначала предположим, что последовательностьСлабо стабильный, Там есть;

 \[E(r_t) = \mu \qquad Var(r_t) = \gamma_0 \qquad Cov(r_t,r_{t-j})=\gamma_j\]

в\mu,\gamma_0является константой. так как{a_t} — это последовательность белого шума, поэтому мы имеем:

 \[E(a_t) = 0, Var(a_t) = \sigma_a^2\]

Итак, есть:

 \[E(r_t) = \phi_0 + \phi_1E(r_{t-1}) + \phi_2E(r_{t-2}) + \cdots + \phi_pE(r_{t-p})\]

По характеру стационарности имеемE(r_t)=E(r_{t-1})=...=\mu,тем самым:

 \[\mu = \phi_0 + \phi_1\mu + \phi_2\mu+ \cdots +\phi_p\mu\\\]

 \[E(r_t)=\mu=\frac{\phi_0}{1-\phi_1 - \phi_2 - \cdots -\phi_p} \qquad\]

Предполагая, что знаменатель в формуле не равен 0, назовем следующее уравнение характеристическим уравнением:

 \[1 - \phi_1x - \phi_2x^2 - \cdots -\phi_px^p = 0\]

уравнениеОбратная величина всех решений называется собственным корнем модели., я упалМодуль собственных значений меньше 1, то последовательность AR(p) стационарна.

Затем мы используем этот метод для проверки стационарности ряда дневной доходности:

change_data = data['change_pct'] # 载入收益率序列
change_data = np.array(change_data, dtype=np.float)
model = sm.tsa.AR(change_data)
results_AR = model.fit()
plt.figure(figsize=(12,6))
plt.plot(change_data, 'b', label = 'changepct')
plt.plot(results_AR.fittedvalues, 'r', label = 'AR model')
plt.legend()

Мы можем видеть, сколько заказов у ​​модели:

print(len(results_AR.roots)) # 模型阶数

Видно, что автоматически сгенерированная модель AR имеет порядок 15. В следующем разделе мы рисуем собственные значения модели для проверки на стационарность:

r1 = 1
theta = np.linspace(0, 2*np.pi, 360)
x1 = r1 * np.cos(theta)
y1 = r1 * np.sin(theta)
plt.figure(figsize=(6,6))
plt.plot(x1, y1, 'k')  # 画单位圆
roots = 1 / results_AR.roots  # 计算results_AR.roots后取倒数
for i in range(len(roots)):
    plt.plot(roots[i].real, roots[i].imag, '.r', markersize=8)  #画特征根
plt.show()

Видно, что все характеристические корни лежат в единичной окружности, тогда ряд стационарен.

Определить порядок модели AR

Для порядка модели линейной регрессии обычно считается, что по мере увеличения порядка точность модели будет улучшаться. Но слишком высокий порядок сделает модель слишком сложной. Ниже описаны два метода определения порядка модели AR: функция частичной корреляции (pACF) и функция информационного критерия (AIC, BIC, HQIC).

Частичная корреляционная функция (pACF)

Сначала вводится модель AR с возрастающим порядком:

 \[r_t = \phi_{0,1} + \phi_{1,1}r_{t-1} + \epsilon_{1t}\]

 \[r_t = \phi_{0,2} + \phi_{1,2}r_{t-1} + \phi_{2,2}r_{t-2} + \epsilon_{2t}\]

 \[r_t = \phi_{0,3} + \phi_{1,3}r_{t-1} + \phi_{2,3}r_{t-2} + \phi_{3,3}r_{t-3} + \epsilon_{3t}\]

 \[r_t = \phi_{0,4} + \phi_{1,4}r_{t-1} + \phi_{2,4}r_{t-2} + \phi_{3,4}r_{t-3} + \phi_{4,4}r_{t-4} + \epsilon_{4t}\]

 \[\dots \dots \dots \dots\]

Первый член в правой части уравнения является постоянным членом, а последний член является членом ошибки,\hat{\phi}_{i,i}является выборочной частичной автокорреляционной функцией с интервалом i из {rt}.\hat{\phi}_{i,i}представляет вклад в {rt} заказа, добавленного на основе строки i-1. Для модели AR, когда она превышает определенное значение p, частичная автокорреляционная функция должна постепенно приближаться к 0, что не только соответствует нашему интуитивному пониманию, но и имеет соответствующие теоретические доказательства, которые можно найти.

Для введения частичной корреляционной функции мы не будем здесь ее подробно раскрывать, а сосредоточимся на одном свойстве: выборочная частичная корреляционная функция последовательности AR(p) усечена на p-шаге. Так называемое усечение означает, что быстрая сходимость должна быть быстрой почти до нуля или в пределах доверительного интервала.

Ниже приведена диаграмма частичной автокорреляционной функции роста и падения цены акций Moutai в 2018 году. При значимом уровне 5% доверительный интервал принимается как

 \[\frac{2}{\sqrt{n}} = \frac{2}{\sqrt{243}}\]

Посмотрите на диаграмму Pacf:

fig = plt.figure(figsize=(12,6))
ax1 = fig.add_subplot(111)
fig = sm.graphics.tsa.plot_pacf(change_data, lags=40, ax=ax1)

К сожалению, определить очевидный порядок p по приведенному выше рисунку непросто. Однако видно, что с увеличением времени функция частичной корреляции постепенно приближается к 0. Этот результат дает нам две идеи: во-первых, функция частичной корреляции приближается к 0, указывая на то, что модель AR используется для имитации последовательности до Разумно; Во-вторых, трудно определить порядок p или порядок p очень велик на приведенном выше рисунке, что указывает на то, что модель может иметь MA (скользящее среднее, которое будет введено позже). Это дает нам хотя бы некоторое представление о восприятии.

Информационный критерий Функция

В настоящее время обычно используемые функции информационных критериев включают информационное содержание Акаике (AIC), байесовское информационное содержание (BIC) и информационное содержание Ханнана-Куинна (HQIC). Все они основаны на функции правдоподобия L и количестве параметров k, где n представляет размер выборки. Так как в Python есть соответствующие функции, формула только для понимания:

 \[AIC = -2 \ln L + 2 k\]

 \[BIC = -2 \ln L + \ln n \cdot k\]

 \[HQIC = -2 \ln L + \ln(\ln n) \cdot k\]

Наша цель — выбрать такой порядок k, чтобы значение информативности было минимальным. Имея так много моделей на выбор, мы обычно используем правило AIC. Мы знаем, что увеличение количества свободных параметров улучшает качество подгонки, и AIC поощряет точность подгонки данных, но пытается избежать переобучения. Таким образом, предпочтительной должна быть модель с наименьшим значением AIC.

Давайте проверим p, определенное по трем критериям, и по-прежнему будем использовать дневную норму доходности. Чтобы уменьшить количество вычислений, мы вычисляем только первые 7 интервалов, чтобы увидеть эффект.

aicList = []
bicList = []
hqicList = []
for i in range(1,8):  #从1阶开始算
    order = (i,0)  # 使用ARMA模型,其中MA阶数为0,只考虑了AR阶数。
    chgdataModel = sm.tsa.ARMA(change_data,order).fit()
    aicList.append(chgdataModel.aic)
    bicList.append(chgdataModel.bic)
    hqicList.append(chgdataModel.hqic)
 
plt.figure(figsize=(10,6))
plt.plot(aicList,'ro--',label='aic value')
plt.plot(bicList,'bo--',label='bic value')
plt.plot(hqicList,'ko--',label='hqic value')
plt.legend(loc=0)

При расчете информационной критериальной функции мы обнаружили, что с увеличением порядка скорость работы становилась все медленнее и медленнее, поэтому были взяты только первые 7 заказов.Видно, что порядок, заданный АИК, равен 0, а порядок дается BIC и HQIC. Число равно 0. Конечно, как упоминалось ранее, предсказывать последовательность только с помощью модели AR неточно, и только вычисления результатов первых 7 порядков недостаточно для определения оптимального порядка.

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

Тестирование AR-моделей

Если модель адекватна, ее остаточный ряд должен быть белым шумом, который можно использовать для проверки того, насколько близки остатки к белому шуму, в соответствии со смешанным тестом, который мы представили в главе 1. Сначала найдите остаточную последовательность:

delta = results_AR.fittedvalues - change_data[15:] # 取得误差项
plt.figure(figsize=(10,6))
# plt.plot(change_data[17:],label='original value')
# plt.plot(results_AR.fittedvalues,label='fitted value')
plt.plot(delta,'r',label=' residual error')
plt.legend(loc=0)

Затем мы проверяем, близка ли она к последовательности белого шума:

acf,q,p = sm.tsa.acf(delta,nlags=10,qstat=True)  # 计算自相关系数 及p-value
out = np.c_[range(1,11), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "ACF", "Q", "P-value"])
output = output.set_index('lag')
print(output)

lag        ACF         Q   P-value
1.0   0.001303  0.000363  0.984792
2.0  -0.003122  0.002459  0.998771
3.0   0.013582  0.042318  0.997714
4.0  -0.014884  0.090414  0.999008
5.0   0.014418  0.135770  0.999656
6.0   0.007551  0.148269  0.999936
7.0  -0.003774  0.151407  0.999990
8.0  -0.014438  0.197556  0.999996
9.0   0.022536  0.310547  0.999996
10.0 -0.014879  0.360051  0.999999

Наблюдая за p-значением, можно увидеть, что последовательность можно считать не имеющей корреляции, а аппроксимацию можно считать, что остаточная последовательность близка к белому шуму.

качество посадки

Скорректированный критерий согласия:

 \[AdjR^2 = 1 - \frac{\hat{\sigma}^2_{\epsilon}}{\hat{\sigma}^2_{r_t}}\]

Числитель справа представляет дисперсию остатков, а знаменатель представляет{r_t}Дисперсия. Значение adjR² находится в диапазоне от 0 до 1, и чем больше значение, тем лучше эффект подгонки. Вычислив значение adjR² этой последовательности, мы обнаружили, что эффект не очень хороший, что также соответствует нашим ожиданиям.

Ниже мы рассчитываем качество соответствия предыдущей модели AR для дневной нормы прибыли:

adjR = 1 - delta.var()/change_data[15:].var()
print(adjR)

Выходное значение: 0.05178424488182409.Видно, что подгонка модели нехорошая.Конечно это не важно.Может эта последовательность не подходит для подгонки с моделью AR.

Прогнозирование моделей дополненной реальности

Мы сначала должны разделить исходную выборку на обучающую выборку и тестовую выборку, а затем посмотреть на эффект предсказания или взять в качестве примера предыдущие данные:

train = change_data[:-10]
test = change_data[-10:]
output = sm.tsa.AR(train).fit()  
output.predict()
 
predicts = output.predict(216, 225, dynamic=True) #共226个数据
compare = pd.DataFrame()
compare['original'] = change_data[-10:]
compare['predict'] = predicts
print(compare)

   original   predict
0  1.608146  0.853237
1  0.388352 -0.585180
2 -1.726237  0.435650
3  1.406797  0.482424
4 -0.406002  0.967699
5 -3.883607 -0.727744
6 -1.830801  0.412699
7 -0.174712 -0.076781
8 -2.877610  0.223773
9 -1.677702 -0.055838

compare.plot()

Предсказания модели очень плохие. Можем ли мы добиться лучших результатов с другими моделями? Мы продолжим это в следующем разделе.

Модель скользящей средней (MA)

Здесь мы непосредственно приводим вид модели MA(q):

 \[r_t = c_0 + a_t - \theta_1a_{t-1} - \cdots - \theta_qa_{t-q}\]

c_0является постоянным термином. здесьa_t, это модель дополненной реальностиtмоментвозмущениеИлиновый интерес, можно обнаружить, что модель используетСлучайные возмущения или ошибки прогноза за последние q периодов для линейного выражения текущего значения прогноза.

Свойства моделей MA

Стационарность

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

 \[E(r_t) = c_0\]

 \[Var(r_t) = (1+ \theta_1^2 + \theta_2^2 + \cdots +\theta_q^2)\sigma_a^2\]

автокорреляционная функция

Для модели MA q-порядкаАвтокорреляционная функция АКФвсегдаq-ступенчатое усечениеиз. Следовательно, последовательность MA (q) только линейно связана с ее первыми значениями задержки q, поэтому это модель с «ограниченной памятью». Это можно использовать для определения порядка модели, что будет описано позже.

обратимость

когда удовлетворенобратимое состояниеПри модель MA(q) можно переписать как модель AR(p). Вывод здесь не производится, а даются условия обратимости для МА 1-го и 2-го порядка.

1-го уровня:|\theta_1|< 1

Уровень 2:|\theta_2| < 1, \theta_1 + \theta_2 < 1

Определение порядка МА

Мы уже знаем, что порядок модели AR можно приблизительно определить путем вычисления частичной автокорреляционной функции (pACF). Для модели MA автокорреляционная функция (ACF) должна использоваться для определения порядка.

fig2 = plt.figure(figsize=(12,6))
ax2 = fig2.add_subplot(111)
fig2 = sm.graphics.tsa.plot_acf(change_data,lags=40,ax=ax2)

Можно обнаружить, что это все еще не очевидно.Здесь 6-й порядок используется в качестве столбца для построения изображения модели MA и исходного дневного роста и падения:

results_MA = sm.tsa.ARMA(change_data, (0,6)).fit() # 取ARMA模型中AR的阶数为0,MA的阶数为6
plt.figure(figsize=(12,6))
plt.plot(change_data, 'b', label = 'changepct')
plt.plot(results_MA.fittedvalues, 'r', label = 'MA model')
plt.legend()

Прогноз модели MA

Поскольку отдельного модуля МА в см.цах нет, используем модуль АРМА, пока порядок р АР установлен равным 0. Порядок(p,q) во входных параметрах функции см.ца.АРМА представляет порядок АР и МА. По мере увеличения порядка модели объем вычислений резко возрастает, поэтому здесь в качестве примера установлена ​​модель 6-го порядка. Мы используем последние 10 данных в качестве выборок для сравнения прогнозируемых значений.

train = change_data[:-10]
test = change_data[-10:]
chgdataModel_MA = sm.tsa.ARMA(train, (0,6)).fit() # 取ARMA模型中AR的阶数为0,MA的阶数为6

Давайте сначала посмотрим на эффект подгонки:

delta = chgdataModel_MA.fittedvalues - train
score = 1 - delta.var()/train.var()
print(score)

Можно видеть, что оценка 0,028525493755446107 намного меньше 1, и эффект подгонки не очень хороший. Затем мы используем установленную модель для прогнозирования последних 10 данных:

predicts_MA = chgdataModel_MA.predict(216, 225, dynamic=True)
compare_MA = pd.DataFrame()
compare_MA['original'] = test
compare_MA['predict_MA'] = predicts_MA
print(compare_MA)

Видно, что эффект от установленной модели очень плохой, и даже если она смотрит только на взлеты и падения, правильной скорости недостаточно. Модель не подходит для исходных данных. Это не имеет значения, было бы странно, если бы так просто предсказать ежедневный рост и падение цен на акции.Содержание MA представлено лишь кратко.Далее в основном представлена ​​модель ARMA.

Модели авторегрессивной скользящей средней (ARMA)

В некоторых приложениях нам нужны модели AR или MA высокого порядка для адекватного описания динамической структуры данных, поэтому проблема становится громоздкой. Чтобы преодолеть эту трудность, предлагается модель авторегрессивной скользящей средней (ARMA). Основная идея состоит в том, чтобы объединить модели AR и MA, чтобы количество используемых параметров было небольшим. Модель имеет вид:

 \[r_t = \phi_0 + \sum_{i=1}^p\phi_ir_{t-i} + a_t + \sum_{i=1}^q\theta_ia_{t-i}\]

в,{a_t} — последовательность белого шума,pиqвсе неотрицательные целые числа.Обе модели AR и MA являются особыми формами ARMA(p,q)..

использоватьОператор обратного сдвигаB(оператор обратного смещенияB,Сейчаспоследний момент), приведенная выше модель может быть записана как:

 \[(1-\phi_1B - \cdots -\phi_pB^p)r_t = \phi_0 + (1-\theta_1B-\cdots - \theta_qB^q)a_t\]

В это время мы просимr_tожидания, получить:

 \[E(r_t) = \frac{\phi_0}{1-\phi_1-\cdots - \phi_p}\]

То же, что и наша модель дополненной реальности в прошлом выпуске. Итак, имеем то же характеристическое уравнение:

 \[1 - \phi_1x - \phi_2x^2 - \cdots -\phi_px^p = 0\]

уравнениеОбратная величина всех решений называется собственным корнем модели., я упалМодуль собственных значений меньше 1, то модель ARMA неподвижна. Один момент имеет решающее значение: прикладной объект модели ARMA должен быть стационарной последовательностью! Следующие шаги основаны на предположении, что исходная последовательность является стационарной.

Идентификация заказов модели ARMA

Порядок судей PACF, ACF

Мы оцениваем значения p и q, наблюдая усечение PACF и ACF соответственно. (Ограниченная задержка порядка 40)

fig = plt.figure(figsize=(12,12))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(change_data,lags=30,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(change_data,lags=30,ax=ax2)

Видно, что порядок модели должен быть (6,24). Однако вычислительная сложность такого моделирования высокого порядка огромна. Почему бы не ограничить лаг-порядок меньшим? Если для лагов установлено значение 25, 20 или меньше, порядок будет (0,0), что, очевидно, не является тем результатом, который нам нужен.

Подводя итог, из-за большого объема вычислений моделирование (6,24) здесь не используется. Другой метод используется для определения порядка.

Порядок информационных критериев

Были некоторые введения в информационные руководящие принципы. Ниже мы применяем три вышеупомянутых правила соответственно, чтобы определить порядок нашей модели, и данные по-прежнему представляют собой последовательность ежедневных подъемов и падений. Чтобы контролировать объем вычислений, мы ограничиваем максимальный порядок AR не более чем 6, а максимальный порядок MA — не более 4. Но недостатком этого является то, что это может быть локальный оптимум.

import warnings
warnings.filterwarnings("ignore")
sm.tsa.arma_order_select_ic(change_data,max_ar=6,max_ma=4,ic='aic')['aic_min_order']  # AIC
#(5, 4)
 
sm.tsa.arma_order_select_ic(change_data,max_ar=6,max_ma=4,ic='bic')['bic_min_order']  # BIC
#(0, 0)
 
sm.tsa.arma_order_select_ic(change_data,max_ar=6,max_ma=4,ic='hqic')['hqic_min_order'] # HQIC
#(0, 0)

Можно видеть, что модельный порядок, решаемый AIC, равен (5,4). Мы возьмем критерий AIC в качестве критерия здесь ~ Что касается того, какой критерий лучше, вы можете смоделировать и сравнить отдельно ~

Прогнозирование и тестирование моделей ARMA

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

Возможные причины:

  • При определении порядка информационного критерия для уменьшения объема вычислений мы задаем максимальный порядок моделей AR и MA, а полученный таким образом порядок является лишь локальным оптимальным решением.
  • Модели ARMA недостаточно, чтобы предсказать тренд цен на акции (это нормально, иначе каждый может заработать много денег)

Модель дифференциальной авторегрессионной скользящей средней (ARIMA)

Последовательности, которые мы изучали до сих пор, были сосредоточены на стационарных последовательностях. То есть объект, изучаемый моделью ARMA, представляет собой стационарную последовательность. Если ряд нестационарный, рассмотрите возможность использования модели ARIMA. АРИМА имеет только на одно «я» больше, чем АРМА, а это означает, что у него на одну коннотацию больше, чем у АРМА: то есть различие. Нестационарный временной ряд может быть преобразован в стационарный временной ряд после d разностей. Для конкретного значения d наша оценка проверяется на стационарность ряда после того, как разница составляет 1 раз, Если она нестационарна, разница продолжается. После d раз тест представляет собой стационарную последовательность.

Поскольку общий процесс аналогичен процессу ARMA, он не будет здесь подробно описываться.

Вознаграждение автора WeChat Pay标点符 wechat qrcodeалипай标点符 alipay qrcode