拓端tecdat|R語言結(jié)合新冠疫情COVID-19對股票價格預(yù)測:ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時間序列
原文鏈接:http://tecdat.cn/?p=24057
原文出處:拓端數(shù)據(jù)部落公眾號
1.概要
本文的目標是使用各種預(yù)測模型預(yù)測Google的未來股價,然后分析各種模型。Google股票數(shù)據(jù)集是使用R中的Quantmod軟件包從Yahoo Finance獲得的。
2.簡介
預(yù)測算法是一種試圖根據(jù)過去和現(xiàn)在的數(shù)據(jù)預(yù)測未來值的過程。提取并準備此歷史數(shù)據(jù)點,來嘗試預(yù)測數(shù)據(jù)集所選變量的未來值。在市場歷史期間,一直有一種持續(xù)的興趣試圖分析其趨勢,行為和隨機反應(yīng)。不斷關(guān)注在實際發(fā)生之前先了解發(fā)生了什么,這促使我們繼續(xù)進行這項研究。我們還將嘗試并了解?COVID-19對股票價格的影響。
3.所需包
library(quantmod) R的定量金融建模和交易框架
library(forecast) 預(yù)測時間序列和時間序列模型
library(tseries) 時間序列分析和計算金融。
library(timeseries) 'S4'類和金融時間序列的各種工具。
library(readxl) readxl包使你能夠輕松地將數(shù)據(jù)從Excel中取出并輸入R中。
library(kableExtra) 顯示表格
library(data.table) 大數(shù)據(jù)的快速聚合
library(DT) 以更好的方式顯示數(shù)據(jù)
library(tsfknn) 進行KNN回歸預(yù)測?
4.數(shù)據(jù)準備
4.1導(dǎo)入數(shù)據(jù)
我們使用Quantmod軟件包獲取了Google股票價格2015年1月1日到2020年4月24日的數(shù)據(jù),用于我們的分析。為了分析COVID-19對Google股票價格的影響,我們從quantmod數(shù)據(jù)包中獲取了兩組數(shù)據(jù)。
首先將其命名為data_before_covid,其中包含截至2020年2月28日的數(shù)據(jù)。
第二個名為data_after_covid,其中包含截至2020年4月24日的數(shù)據(jù)。
所有分析和模型都將在兩個數(shù)據(jù)集上進行,以分析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數(shù)據(jù)的圖形表示
par(mfrow = c(1,2))
plot.ts(fore_c)

4.3數(shù)據(jù)集預(yù)覽
最終數(shù)據(jù)集可以在下面的交互式表格中找到。
table(before_covid)
?

4.4變量匯總
變量描述Open當(dāng)日股票開盤價High當(dāng)日股票最高價Low當(dāng)日股價最低Close當(dāng)日股票收盤價Volumn總交易量Adjusted調(diào)整后的股票價格,包括風(fēng)險或策略
5. ARIMA模型
我們首先分析兩個數(shù)據(jù)集的ACF和PACF圖。
par(mfrow = c(2,2))
acft(bfoe_covid)
pacf(bfre_covid)

然后,我們進行?ADF(Dickey-Fuller)?檢驗和?KPSS(Kwiatkowski-Phillips-Schmidt-Shin)?檢驗,檢驗兩個數(shù)據(jù)集收盤價的時間序列數(shù)據(jù)的平穩(wěn)性。
print(adf.test)

print(adfes(sata_after_covid))

通過以上ADF檢驗,我們可以得出以下結(jié)論:
對于COVID-19之前的數(shù)據(jù)集,ADF檢驗給出的p值為?0.2093,該值大于0.05,因此說明時間序列數(shù)據(jù)?不是平穩(wěn)的。
對于COVID-19之后的數(shù)據(jù)集,ADF檢驗給出的p值為0.01974,該值?小于0.05,這說明時間序列數(shù)據(jù)是?平穩(wěn)的。
print(kpss.s(t_before_covid))

print(kpss.est(Dafter_covid))

通過以上KPSS檢驗,我們可以得出以下結(jié)論:
對于COVID-19之前的數(shù)據(jù)集,KPSS檢驗得出的p值為?0.01,該值小于0.05,因此說明時間序列數(shù)據(jù)?不是平穩(wěn)的。
對于COVID-19之后的數(shù)據(jù)集,KPSS檢驗給出的p值為?0.01,該值小于0.05,這說明時間序列數(shù)據(jù)?不是平穩(wěn)的。
因此,我們可以從以上兩個檢驗得出結(jié)論,時間序列數(shù)據(jù)?不是平穩(wěn)的。
然后,我們使用?auto?函數(shù)來確定每個數(shù)據(jù)集的時間序列模型。
auto.ar(befor_covid, lamd = "auto")

auto.arma(after_covid)

從auto函數(shù)中,我們得出兩個數(shù)據(jù)集的以下模型:
在COVID-19之前:ARIMA(2,1,0)
在COVID-19之后:ARIMA(1,1,1)
獲得模型后,我們將對每個擬合模型執(zhí)行殘差診斷。
par(mfrow = c(2,3))
plot(before_covidresiduals)
plot(mfter_covidresiduals)

從殘差圖中,我們可以確認殘差的平均值為0,并且方差也為常數(shù)。對于滯后> 0,ACF為0,而PACF也為0。
因此,我們可以說殘差表現(xiàn)得像白噪聲,并得出結(jié)論:ARIMA(2,1,0)和ARIMA(1,1,1)模型很好地擬合了數(shù)據(jù)?;蛘撸覀円部梢允褂肂ox-Ljung檢驗在0.05的顯著性水平上進行檢驗殘差是符合白噪聲。
Box.test(moderesiduals)

Box.tst(moeit_fter_covidreia, type = "Ljung-Box")

在此,兩個模型的p值均大于0.05。因此,在顯著性水平為0.05的情況下,我們無法拒絕原假設(shè),而得出的結(jié)論是殘差遵循白噪聲。這意味著該模型很好地擬合了數(shù)據(jù)。
一旦為每個數(shù)據(jù)集確定了模型,就可以預(yù)測未來幾天的股票價格。

6. KNN回歸時間序列預(yù)測模型
KNN模型可用于分類和回歸問題。最受歡迎的應(yīng)用是將其用于分類問題?,F(xiàn)在,使用r軟件包,可以在任何回歸任務(wù)應(yīng)用KNN。這項研究的目的是說明不同的預(yù)測工具,對其進行比較并分析預(yù)測的行為。在我們的KNN研究之后,我們提出可以將其用于分類和回歸問題。為了預(yù)測新數(shù)據(jù)點的值,模型使用“特征相似度”,根據(jù)新點與訓(xùn)練集上點的相似程度為值分配新點。
第一項任務(wù)是確定我們的KNN模型中的k值。選擇k值的一般經(jīng)驗法則是取樣本中數(shù)據(jù)點數(shù)的平方根。因此,對于COVID-19之前的數(shù)據(jù)集,我們?nèi) = 32;對于COVID-19之后的數(shù)據(jù)集,我們?nèi) = 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 )

然后,我們針對預(yù)測時間序列評估KNN模型。
before_cvid <- ll_ig(pdn_befr_vid)
afer_vd<- rog_ogn(redkn_afer_vd)

7.前饋神經(jīng)網(wǎng)絡(luò)建模
我們將嘗試實現(xiàn)的下一個模型是帶有神經(jīng)網(wǎng)絡(luò)的預(yù)測模型。在此模型中,我們使用單個隱藏層形式,其中只有一層輸入節(jié)點將加權(quán)輸入發(fā)送到接收節(jié)點的下一層。預(yù)測函數(shù)將單個隱藏層神經(jīng)網(wǎng)絡(luò)模型擬合到時間序列。函數(shù)模型方法是將時間序列的滯后值用作輸入數(shù)據(jù),以達到非線性自回歸模型。
第一步是確定神經(jīng)網(wǎng)絡(luò)的隱藏層數(shù)。盡管沒有用于計算隱藏層數(shù)的特定方法,但時間序列預(yù)測遵循的最常見方法是通過計算使用以下公式:

其中Ns:訓(xùn)練樣本數(shù)Ni:輸入神經(jīng)元數(shù)No:輸出神經(jīng)元數(shù)a:1.5 ^ -10
#隱藏層的創(chuàng)建
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進行預(yù)測。
forecast(befe_cvid, h 61, I =UE)
forecast(aftr_coid, h = 5, I = RE)

plot(nn_fcst_afte_cvid)

然后,我們使用以下參數(shù)分析神經(jīng)網(wǎng)絡(luò)模型的性能:
accuracy

accuracy

8.所有模型的比較
現(xiàn)在,我們使用參數(shù)諸如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 )
COVID-19之前的數(shù)據(jù)模型匯總模型RMSEMAEMAPEARIMA13.08.81.0KNN44.033.73.1神經(jīng)網(wǎng)絡(luò)13.08.71.0
kable(sumary_tbl_aft_ci
fulith = F, fixdtead = T )
COVID-19之后的數(shù)據(jù)模型匯總模型RMSEMAEMAPEARIMA16.610.41.0KNN45.935.73.3神經(jīng)網(wǎng)絡(luò)14.79.81.0
因此,從以上模型性能參數(shù)的總結(jié)中,我們可以看到神經(jīng)網(wǎng)絡(luò)模型在兩個數(shù)據(jù)集上的性能均優(yōu)于ARIMA和KNN模型。因此,我們將使用神經(jīng)網(wǎng)絡(luò)模型來預(yù)測未來兩個月的股價。
9.最終模型:COVID-19之前
現(xiàn)在,我們使用直到2月的數(shù)據(jù)來預(yù)測3月和4月的值,然后將預(yù)測價格與實際價格進行比較,以檢查是否由于COVID-19可以歸因于任何重大影響。
foestdungcvid<- datafame("De
"Actua Values" =
datatable(foestdungcvid, ilte= 'to')
從表中我們可以看到,3月和4月期間,Google股票的實際價值通常比預(yù)測值要高一些。因此,可以說,盡管發(fā)生了這種全球性大流行,但Google股票的表現(xiàn)仍然相當(dāng)不錯。
10.最終模型:COVID-19之后
現(xiàn)在,我們使用直到4月的數(shù)據(jù)預(yù)測5月和6月的值,以了解Google的未來股價。
foreataov <- data.frae(dn_reataeimean )
table(foreataov )
從表中可以得出結(jié)論,在5月和6月的接下來的幾個月中,Google股票的價格將繼續(xù)上漲并表現(xiàn)良好。
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預(yù)測
2.python中利用長短期記憶模型lstm進行時間序列預(yù)測分析
3.使用r語言進行時間序列(arima,指數(shù)平滑)分析
4.r語言多元copula-garch-模型時間序列預(yù)測
5.r語言copulas和金融時間序列案例
6.使用r語言隨機波動模型sv處理時間序列中的隨機波動
7.r語言時間序列tar閾值自回歸模型
8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類
9.python3用arima模型進行時間序列預(yù)測