原文鏈接:http://tecdat.cn/?p=24057
原文出處:拓端數據部落公眾號
1.概要
本文的目標是使用各種預測模型預測Google的未來股價,然后分析各種模型。Google股票數據集是使用R中的Quantmod軟件包從Yahoo Finance獲得的。
2.簡介
預測算法是一種試圖根據過去和現在的數據預測未來值的過程。提取並准備此歷史數據點,來嘗試預測數據集所選變量的未來值。在市場歷史期間,一直有一種持續的興趣試圖分析其趨勢,行為和隨機反應。不斷關注在實際發生之前先了解發生了什么,這促使我們繼續進行這項研究。我們還將嘗試並了解 COVID-19對股票價格的影響。
3.所需包
-
library(quantmod) R的定量金融建模和交易框架
-
library(forecast) 預測時間序列和時間序列模型
-
library(tseries) 時間序列分析和計算金融。
-
library(timeseries) 'S4'類和金融時間序列的各種工具。
-
library(readxl) readxl包使你能夠輕松地將數據從Excel中取出並輸入R中。
-
library(kableExtra) 顯示表格
-
library(data.table) 大數據的快速聚合
-
library(DT) 以更好的方式顯示數據
-
library(tsfknn) 進行KNN回歸預測
4.數據准備
4.1導入數據
我們使用Quantmod軟件包獲取了Google股票價格2015年1月1日到2020年4月24日的數據,用於我們的分析。為了分析COVID-19對Google股票價格的影響,我們從quantmod數據包中獲取了兩組數據。
- 首先將其命名為data_before_covid,其中包含截至2020年2月28日的數據。
- 第二個名為data_after_covid,其中包含截至2020年4月24日的數據。
所有分析和模型都將在兩個數據集上進行,以分析COVID-19的影響(如果有)。
-
getSymbols("GOG" fro= "2015-01-01", to = "2019-02-28")
-
before_covid <-dafae(GOOG)
-
-
getSymbols("GOG" , frm = "2015-01-01")
-
after_covid <- as.tae(GOOG)
-
4.2數據的圖形表示
-
par(mfrow = c(1,2))
-
plot.ts(fore_c)
-
4.3數據集預覽
最終數據集可以在下面的交互式表格中找到。
table(before_covid)
4.4變量匯總
變量 | 描述 |
---|---|
Open | 當日股票開盤價 |
High | 當日股票最高價 |
Low | 當日股價最低 |
Close | 當日股票收盤價 |
Volumn | 總交易量 |
Adjusted | 調整后的股票價格,包括風險或策略 |
5. ARIMA模型
我們首先分析兩個數據集的ACF和PACF圖。
-
par(mfrow = c(2,2))
-
acft(bfoe_covid)
-
pacf(bfre_covid)
-
然后,我們進行 ADF(Dickey-Fuller) 檢驗和 KPSS(Kwiatkowski-Phillips-Schmidt-Shin) 檢驗,檢驗兩個數據集收盤價的時間序列數據的平穩性。
print(adf.test)
print(adfes(sata_after_covid))
通過以上ADF檢驗,我們可以得出以下結論:
-
對於COVID-19之前的數據集,ADF檢驗給出的p值為 0.2093,該值大於0.05,因此說明時間序列數據 不是平穩的。
-
對於COVID-19之后的數據集,ADF檢驗給出的p值為0.01974,該值 小於0.05,這說明時間序列數據是 平穩的。
print(kpss.s(t_before_covid))
print(kpss.est(Dafter_covid))
通過以上KPSS檢驗,我們可以得出以下結論:
-
對於COVID-19之前的數據集,KPSS檢驗得出的p值為 0.01,該值小於0.05,因此說明時間序列數據 不是平穩的。
-
對於COVID-19之后的數據集,KPSS檢驗給出的p值為 0.01,該值小於0.05,這說明時間序列數據 不是平穩的。
因此,我們可以從以上兩個檢驗得出結論,時間序列數據 不是平穩的。
然后,我們使用 auto 函數來確定每個數據集的時間序列模型。
auto.ar(befor_covid, lamd = "auto")
auto.arma(after_covid)
從auto函數中,我們得出兩個數據集的以下模型:
- 在COVID-19之前:ARIMA(2,1,0)
- 在COVID-19之后:ARIMA(1,1,1)
獲得模型后,我們將對每個擬合模型執行殘差診斷。
-
par(mfrow = c(2,3))
-
-
plot(before_covidresiduals)
-
-
-
plot(mfter_covidresiduals)
-
從殘差圖中,我們可以確認殘差的平均值為0,並且方差也為常數。對於滯后> 0,ACF為0,而PACF也為0。
因此,我們可以說殘差表現得像白噪聲,並得出結論:ARIMA(2,1,0)和ARIMA(1,1,1)模型很好地擬合了數據。或者,我們也可以使用Box-Ljung檢驗在0.05的顯着性水平上進行檢驗殘差是符合白噪聲。
Box.test(moderesiduals)
Box.tst(moeit_fter_covidreia, type = "Ljung-Box")
在此,兩個模型的p值均大於0.05。因此,在顯着性水平為0.05的情況下,我們無法拒絕原假設,而得出的結論是殘差遵循白噪聲。這意味着該模型很好地擬合了數據。
一旦為每個數據集確定了模型,就可以預測未來幾天的股票價格。
6. KNN回歸時間序列預測模型
KNN模型可用於分類和回歸問題。最受歡迎的應用是將其用於分類問題。現在,使用r軟件包,可以在任何回歸任務應用KNN。這項研究的目的是說明不同的預測工具,對其進行比較並分析預測的行為。在我們的KNN研究之后,我們提出可以將其用於分類和回歸問題。為了預測新數據點的值,模型使用“特征相似度”,根據新點與訓練集上點的相似程度為值分配新點。
第一項任務是確定我們的KNN模型中的k值。選擇k值的一般經驗法則是取樣本中數據點數的平方根。因此,對於COVID-19之前的數據集,我們取k = 32;對於COVID-19之后的數據集,我們取k = 36。
-
par(mfrow = c(2,1))
-
knn_before_covid <- kn(bfrvdGO.Clse, k = 32)
-
knn_after_covid <- kn(ber_oiGOG.lose ,k = 36)
-
-
plot(knn_before_covid )
-
plot(knn_after_covid )
然后,我們針對預測時間序列評估KNN模型。
-
before_cvid <- ll_ig(pdn_befr_vid)
-
afer_vd<- rog_ogn(redkn_afer_vd)
7.前饋神經網絡建模
我們將嘗試實現的下一個模型是帶有神經網絡的預測模型。在此模型中,我們使用單個隱藏層形式,其中只有一層輸入節點將加權輸入發送到接收節點的下一層。預測函數將單個隱藏層神經網絡模型擬合到時間序列。函數模型方法是將時間序列的滯后值用作輸入數據,以達到非線性自回歸模型。
第一步是確定神經網絡的隱藏層數。盡管沒有用於計算隱藏層數的特定方法,但時間序列預測遵循的最常見方法是通過計算使用以下公式:
其中Ns:訓練樣本數Ni:輸入神經元數No:輸出神經元數a:1.5 ^ -10
-
#隱藏層的創建
-
hn_before_covid <- length(before.Close)/(alpha*(lengthGOOG.Close + 61)
-
hn_after_covid <- length(after_covidClose)/(alpha*(lengthafter_ovdClose+65))
-
-
#擬合nn
-
-
nn(before_covid$GOOG.Close, size = hn_beoe_cid,
-
-
# 使用nnetar進行預測。
-
forecast(befe_cvid, h 61, I =UE)
-
forecast(aftr_coid, h = 5, I = RE)
-
plot(nn_fcst_afte_cvid)
然后,我們使用以下參數分析神經網絡模型的性能:
accuracy
accuracy
8.所有模型的比較
現在,我們使用參數諸如RMSE(均方根誤差),MAE(均值絕對誤差)和MAPE(均值絕對百分比誤差)對所有三個模型進行分析 。
-
sumary_le_efore_oid <- data.frame(RMSE = nuerc(), MAE = uer(),
-
MAPE = numric(), snsAsacrs = FALSE)
-
-
summ_tabe_fter_ovd <- data.fame(RMSE = umeri(), MAE = nmei(),
-
MAPE = numeic())
-
-
-
kable(smary_abe_eor_oid )
模型 | RMSE | MAE | MAPE |
---|---|---|---|
ARIMA | 13.0 | 8.8 | 1.0 |
KNN | 44.0 | 33.7 | 3.1 |
神經網絡 | 13.0 | 8.7 | 1.0 |
-
kable(sumary_tbl_aft_ci
-
fulith = F, fixdtead = T )
模型 | RMSE | MAE | MAPE |
---|---|---|---|
ARIMA | 16.6 | 10.4 | 1.0 |
KNN | 45.9 | 35.7 | 3.3 |
神經網絡 | 14.7 | 9.8 | 1.0 |
因此,從以上模型性能參數的總結中,我們可以看到神經網絡模型在兩個數據集上的性能均優於ARIMA和KNN模型。因此,我們將使用神經網絡模型來預測未來兩個月的股價。
9.最終模型:COVID-19之前
現在,我們使用直到2月的數據來預測3月和4月的值,然后將預測價格與實際價格進行比較,以檢查是否由於COVID-19可以歸因於任何重大影響。
-
foestdungcvid<- datafame("De
-
"Actua Values" =
-
-
datatable(foestdungcvid, ilte= 'to')
從表中我們可以看到,3月和4月期間,Google股票的實際價值通常比預測值要高一些。因此,可以說,盡管發生了這種全球性大流行,但Google股票的表現仍然相當不錯。
10.最終模型:COVID-19之后
現在,我們使用直到4月的數據預測5月和6月的值,以了解Google的未來股價。
-
foreataov <- data.frae(dn_reataeimean )
-
-
table(foreataov )
從表中可以得出結論,在5月和6月的接下來的幾個月中,Google股票的價格將繼續上漲並表現良好。
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短期記憶模型lstm進行時間序列預測分析