Использование модели векторной коррекции ошибок для прогнозирования цен на акции FANG

Моделирование коинтегрированных данных временных рядов с использованием VECM

Финансовые данные - самый известный ресурс для данных временных рядов. Записи цен на акции тщательно фиксировались на протяжении более века, обеспечивая богатые наборы данных. Акции так называемых «FANG» компаний, Facebook, Amazon, Netflix и Google / Alphabet, получили много внимания благодаря своей впечатляющей доходности и «крутизне» этих высокотехнологичных компаний. Но действительно ли эти акции связаны друг с другом? Или это пример того, как Уолл-стрит продает набор не связанных друг с другом товаров (см. БРИКС)? Также возможно, что представления о том, что они связаны между собой, инвесторами достаточно, чтобы заставить их акции двигаться вместе. Даже если мы не можем сказать, почему они движутся вместе, если это так, мы можем по крайней мере определить, можете ли вы предсказать одну акцию вместе с другими.

Я получил данные от Yahoo Finance о ценах закрытия акций FANG. IPO Facebook было проведено в 2012 году, так что это было ограничивающим фактором с точки зрения периода выборки. Наш период выборки длится с 18 мая 2012 года по 23 августа 2019 года. Я вырезал все торговые дни в 2019 году в качестве набора данных тестирования, а оставшиеся наблюдения оставил для набора данных обучения. Это означает, что в наборе данных отсутствуют данные о том, как акции этих компаний действовали во время рецессии. Тем не менее, я продолжил свой анализ. Я проверил степень интеграции, причинно-следственную связь по Грейнджеру и интеграцию Йохансена. Основываясь на результатах, я приступил к моделированию векторной коррекции ошибок (VECM), которое представляет собой метод одновременной оценки нескольких временных рядов по крайней мере с одной коинтегрированной зависимостью.

Проверка стационарности

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

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

Графики автокорреляционных функций (ACF) для акций без разницы показывают, что акции определенно не являются стационарными. ACF разностных переменных выглядят потенциально стационарными. Это говорит о том, что каждая акция интегрирована I (1). Расширенные тесты Дики-Фуллера (ADF) могут подтвердить это.

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

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

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

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

Результаты тестов ADF для неразличимых и разностных строго подтверждают гипотезу о том, что акции интегрированы I (1). Перед моделированием эти цены на акции необходимо различить один раз. Многие пакеты временных рядов для интегрированных моделей временных рядов делают это автоматически.

Расширенные тесты Дики-Фуллера для Facebook

Non-Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 0.405   0.760
## [2,]   1 0.441   0.771
## [3,]   2 0.483   0.783
## [4,]   3 0.508   0.790
## [5,]   4 0.542   0.800
## [6,]   5 0.608   0.819
## [7,]   6 0.639   0.828
## [8,]   7 0.692   0.843
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -1.11   0.661
## [2,]   1 -1.16   0.644
## [3,]   2 -1.19   0.634
## [4,]   3 -1.17   0.642
## [5,]   4 -1.14   0.651
## [6,]   5 -1.14   0.651
## [7,]   6 -1.19   0.635
## [8,]   7 -1.19   0.635
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -2.42   0.399
## [2,]   1 -2.25   0.469
## [3,]   2 -2.08   0.541
## [4,]   3 -2.01   0.572
## [5,]   4 -1.88   0.628
## [6,]   5 -1.60   0.745
## [7,]   6 -1.47   0.803
## [8,]   7 -1.28   0.881
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -41.5    0.01
## [2,]   1 -29.8    0.01
## [3,]   2 -24.6    0.01
## [4,]   3 -21.7    0.01
## [5,]   4 -20.1    0.01
## [6,]   5 -18.3    0.01
## [7,]   6 -17.3    0.01
## [8,]   7 -16.4    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -41.5    0.01
## [2,]   1 -29.8    0.01
## [3,]   2 -24.6    0.01
## [4,]   3 -21.7    0.01
## [5,]   4 -20.2    0.01
## [6,]   5 -18.4    0.01
## [7,]   6 -17.4    0.01
## [8,]   7 -16.5    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -41.5    0.01
## [2,]   1 -29.8    0.01
## [3,]   2 -24.6    0.01
## [4,]   3 -21.7    0.01
## [5,]   4 -20.2    0.01
## [6,]   5 -18.4    0.01
## [7,]   6 -17.4    0.01
## [8,]   7 -16.5    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01

Расширенные тесты Дики-Фуллера для Amazon

Non-Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag  ADF p.value
## [1,]   0 1.54   0.969
## [2,]   1 1.60   0.974
## [3,]   2 1.60   0.974
## [4,]   3 1.67   0.977
## [5,]   4 1.76   0.980
## [6,]   5 1.62   0.975
## [7,]   6 1.63   0.976
## [8,]   7 1.75   0.980
## Type 2: with drift no trend 
##      lag      ADF p.value
## [1,]   0 -0.03873   0.953
## [2,]   1  0.00509   0.956
## [3,]   2  0.00206   0.956
## [4,]   3  0.04246   0.959
## [5,]   4  0.08628   0.963
## [6,]   5  0.01241   0.957
## [7,]   6  0.02187   0.957
## [8,]   7  0.07776   0.962
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -1.93   0.605
## [2,]   1 -1.90   0.619
## [3,]   2 -1.89   0.622
## [4,]   3 -1.86   0.637
## [5,]   4 -1.80   0.663
## [6,]   5 -1.87   0.631
## [7,]   6 -1.87   0.634
## [8,]   7 -1.80   0.664
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -41.9    0.01
## [2,]   1 -29.1    0.01
## [3,]   2 -24.3    0.01
## [4,]   3 -21.7    0.01
## [5,]   4 -17.8    0.01
## [6,]   5 -16.4    0.01
## [7,]   6 -15.9    0.01
## [8,]   7 -16.9    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -41.9    0.01
## [2,]   1 -29.2    0.01
## [3,]   2 -24.4    0.01
## [4,]   3 -21.8    0.01
## [5,]   4 -17.9    0.01
## [6,]   5 -16.5    0.01
## [7,]   6 -16.0    0.01
## [8,]   7 -17.1    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -41.9    0.01
## [2,]   1 -29.2    0.01
## [3,]   2 -24.5    0.01
## [4,]   3 -21.8    0.01
## [5,]   4 -18.0    0.01
## [6,]   5 -16.5    0.01
## [7,]   6 -16.1    0.01
## [8,]   7 -17.1    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01

Расширенные тесты Дики-Фуллера для Netflix

Non-Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 0.837   0.885
## [2,]   1 0.833   0.884
## [3,]   2 0.799   0.874
## [4,]   3 0.701   0.846
## [5,]   4 0.670   0.837
## [6,]   5 0.880   0.897
## [7,]   6 0.890   0.900
## [8,]   7 0.946   0.907
## Type 2: with drift no trend 
##      lag    ADF p.value
## [1,]   0 -0.516   0.873
## [2,]   1 -0.517   0.873
## [3,]   2 -0.541   0.864
## [4,]   3 -0.598   0.844
## [5,]   4 -0.618   0.837
## [6,]   5 -0.492   0.882
## [7,]   6 -0.486   0.884
## [8,]   7 -0.455   0.895
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -2.00   0.576
## [2,]   1 -2.01   0.574
## [3,]   2 -2.04   0.562
## [4,]   3 -2.14   0.517
## [5,]   4 -2.18   0.501
## [6,]   5 -1.95   0.597
## [7,]   6 -1.94   0.602
## [8,]   7 -1.89   0.623
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -40.6    0.01
## [2,]   1 -28.2    0.01
## [3,]   2 -21.9    0.01
## [4,]   3 -18.8    0.01
## [5,]   4 -19.2    0.01
## [6,]   5 -17.5    0.01
## [7,]   6 -16.5    0.01
## [8,]   7 -16.7    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -40.6    0.01
## [2,]   1 -28.2    0.01
## [3,]   2 -21.9    0.01
## [4,]   3 -18.8    0.01
## [5,]   4 -19.3    0.01
## [6,]   5 -17.6    0.01
## [7,]   6 -16.6    0.01
## [8,]   7 -16.9    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -40.6    0.01
## [2,]   1 -28.2    0.01
## [3,]   2 -21.9    0.01
## [4,]   3 -18.8    0.01
## [5,]   4 -19.3    0.01
## [6,]   5 -17.6    0.01
## [7,]   6 -16.6    0.01
## [8,]   7 -16.9    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01

Расширенные тесты Дики-Фуллера для Google

Non-Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag  ADF p.value
## [1,]   0 1.21   0.940
## [2,]   1 1.15   0.933
## [3,]   2 1.23   0.943
## [4,]   3 1.16   0.935
## [5,]   4 1.20   0.939
## [6,]   5 1.28   0.950
## [7,]   6 1.36   0.956
## [8,]   7 1.34   0.954
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -1.07   0.677
## [2,]   1 -1.07   0.679
## [3,]   2 -1.06   0.680
## [4,]   3 -1.07   0.678
## [5,]   4 -1.07   0.676
## [6,]   5 -1.07   0.677
## [7,]   6 -1.04   0.687
## [8,]   7 -1.06   0.680
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -3.52  0.0404
## [2,]   1 -3.64  0.0275
## [3,]   2 -3.49  0.0430
## [4,]   3 -3.63  0.0292
## [5,]   4 -3.56  0.0364
## [6,]   5 -3.36  0.0598
## [7,]   6 -3.22  0.0851
## [8,]   7 -3.26  0.0768
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
Differenced
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -39.6    0.01
## [2,]   1 -29.5    0.01
## [3,]   2 -23.1    0.01
## [4,]   3 -20.4    0.01
## [5,]   4 -19.1    0.01
## [6,]   5 -18.0    0.01
## [7,]   6 -16.3    0.01
## [8,]   7 -16.8    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -39.6    0.01
## [2,]   1 -29.6    0.01
## [3,]   2 -23.2    0.01
## [4,]   3 -20.5    0.01
## [5,]   4 -19.2    0.01
## [6,]   5 -18.1    0.01
## [7,]   6 -16.4    0.01
## [8,]   7 -16.9    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -39.6    0.01
## [2,]   1 -29.6    0.01
## [3,]   2 -23.2    0.01
## [4,]   3 -20.5    0.01
## [5,]   4 -19.2    0.01
## [6,]   5 -18.1    0.01
## [7,]   6 -16.4    0.01
## [8,]   7 -16.9    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01

Причинность по Грейнджеру

Установление причинно-следственной связи в данных наблюдений, как известно, сложно. Причинность по Грейнджеру - это нижняя планка. Он просто говорит, что если предыдущие значения X могут предсказать будущие значения y, то X Granger вызывает y. Это выполняется путем оценки регрессии запаздывающих значений X по y и выполнения F-теста. Если p-значение достаточно мало, вы отклоняете нулевую гипотезу о том, что все коэффициенты запаздывающих значений X равны 0. Говоря простым языком, маленькие p-значения говорят, что запаздывающие X имеют предсказательную силу для будущего y с соответствующим уровень уверенности.

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

## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 2.9968 1.226e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 2.4849 1.635e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F   Pr(>F)    
## 1   1574                        
## 2   1604 -30 2.5479 9.15e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F   Pr(>F)    
## 1   1574                        
## 2   1604 -30 2.5026 1.39e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df     F    Pr(>F)    
## 1   1574                        
## 2   1604 -30 3.838 2.082e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 2.0986 0.0004837 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F   Pr(>F)    
## 1   1574                        
## 2   1604 -30 2.0299 0.000852 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 3.3817 2.497e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 3.0723 5.784e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F   Pr(>F)   
## 1   1574                       
## 2   1604 -30 1.7205 0.009195 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df     F   Pr(>F)   
## 1   1574                      
## 2   1604 -30 1.728 0.008712 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Granger causality test
## 
## Model 1: j ~ Lags(j, 1:30) + Lags(i, 1:30)
## Model 2: j ~ Lags(j, 1:30)
##   Res.Df  Df      F    Pr(>F)    
## 1   1574                         
## 2   1604 -30 3.3607 3.101e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Тестирование на коинтеграцию

Коинтеграция - это слово, которое я использовал несколько раз. Это просто означает, что существуют долгосрочные отношения как минимум между двумя нашими акциями. Тест на коинтеграцию известен как тест Йохансена по имени специалиста по статистике / эконометрии, который разработал его. Его можно сформулировать двумя способами: тест трассировки и тест максимального собственного значения, которые имеют разные гипотезы. Детали довольно технические, поэтому его версия tl; dr заключается в том, что если ранг, r, матрицы долгосрочных отношений равен 0 или равен количеству тестируемых временных рядов, нет никакой коинтеграции и другой метод моделирования. подходит. Если r больше 0 и меньше количества временных рядов, то имеется r коинтеграционных отношений.

Из результатов ниже мы можем быть уверены, что существует более 0 коинтегративных отношений, но мы не можем быть уверены на любом разумном уровне статистической значимости, что существует более 1 коинтеграционных отношений. Таким образом, при моделировании мы предположим, что существует одна коинтегрированная взаимосвязь между акциями FANG.

###################### 
# Johansen-Procedure # 
######################
Test type: trace statistic , with linear trend in cointegration
Eigenvalues (lambda):
[1] 2.054935e-02 1.133947e-02 6.555429e-03 4.658323e-03 -2.362375e-18
Values of teststatistic and critical values of test:
test 10pct 5pct 1pct
r <= 3 | 7.63 10.49 12.25 16.26
r <= 2 | 18.39 22.76 25.32 30.45
r <= 1 | 37.03 39.06 42.44 48.45
r = 0 | 70.98 59.14 62.99 70.05
Eigenvectors, normalised to first column:
(These are the cointegration relations)
Close.fb.l30 Close.amzn.l30 Close.nflx.l30 Close.googl.l30 trend.l30
Close.fb.l30 1.000000000 1.0000000 1.0000000 1.000000000 1.0000000
Close.amzn.l30 -0.004276658 1.0364900 0.2719707 0.102530094 -0.1327168
Close.nflx.l30 0.159547714 -1.8623141 -1.2702538 -0.746632744 0.5949550
Close.googl.l30 -0.143075556 -1.9821424 0.4921765 -0.150661845 0.2315739
trend.l30 -0.054567826 0.2916345 -0.3575875 0.005284555 -0.3248181
Weights W:
(This is the loading matrix)
Close.fb.l30 Close.amzn.l30 Close.nflx.l30 Close.googl.l30 trend.l30
Close.fb.d -0.00219271 -0.0006776299 -0.003233474 0.00356431 1.732653e-17
Close.amzn.d 0.18630132 -0.0084137379 -0.008556667 0.01693689 -8.853648e-16
Close.nflx.d 0.02105269 -0.0006557141 0.001122418 0.01106052 -1.271123e-16
Close.googl.d 0.10670446 0.0031632593 -0.012012380 0.01474776 -9.437844e-16

Выбор количества лагов для модели

Чтобы выбрать количество лагов для включения в окончательную модель, я взял небольшой набор данных для обучения; период с 9 мая 2018 г. и до конца года. Это была дата, когда осталось 163 наблюдения в наборе данных мини-тестирования, что равнялось количеству наблюдений в наборе данных теста. Затем я оценил модель с задержками от 1 до 30 по данным мини-обучения, а затем оценил набор данных мини-тестирования с помощью этой модели. Я вычислил среднюю абсолютную процентную ошибку (MAPE) для каждой акции и просуммировал их. Затем я выбрал количество лагов, которые минимизируют суммарное значение MAPE для каждой акции. Количество лагов, минимизирующих суммарное значение MAPE в этом наборе данных настройки, равно 5.

Насколько точна модель?

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

В результате базовый показатель MAPE составляет 1,36% для Facebook, 1,20% для Amazon, 1,70% для Netflix и 1,15% для Google. Это неплохо для метода прогнозирования, не основанного на сложных статистических моделях. Может ли VECM превзойти это?

## [1] "Close.fb"
## [1] 1.360928
## [1] "Close.amzn"
## [1] 1.203783
## [1] "Close.nflx"
## [1] 1.697295
## [1] "Close.googl"
## [1] 1.150686

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

да. VECM дает MAPE 0,30% для Facebook, 0,28% для Amazon, 0,40% для Netflix и 0,29% для Google, что неплохо. Эти MAPE составляют примерно четверть базового уровня ошибок.

## [1] "Close.fb"
## [1] 0.2972355
## [1] "Close.amzn"
## [1] 0.277129
## [1] "Close.nflx"
## [1] 0.3978918
## [1] "Close.googl"
## [1] 0.2943474

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

Заключительные мысли

Так что эта модель работает хорошо. В чем смысл? Модель предсказывает цену акций на момент закрытия. Таким образом, если торговая цена упадет значительно ниже прогнозируемой цены акции на момент закрытия, где значительно ниже является функция доверительного интервала и вашей терпимости к риску, имеет смысл купить акции и продать их непосредственно перед закрытием; при условии, что не было уважительной причины для длительного падения цены акций. Если цена превысила прогнозируемое закрытие, было бы разумно продать его (Я не даю финансовых советов. Просто указываю, как я бы использовал модель, если бы я был к этому склонен.). Эти действия имеют смысл, только если вы дневной трейдер, но понимание этой модели ограничено, потому что она прогнозирует только на один день вперед.

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

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

Мой код и данные доступны по адресу https://github.com/jkclem/FANG-stock-prediction.