“預測非常困難,特別是關於未來”。丹麥物理學家尼爾斯·波爾(Neils Bohr)很多人都會看到這句名言。預測是這篇博文的主題。在這篇文章中,我們將介紹流行的ARIMA預測模型,以預測庫存的回報,並演示使用R編程的ARIMA建模的逐步過程。
時間序列中的預測模型是什么?
預測涉及使用其歷史數據點預測變量的值,或者還可以涉及在給定另一個變量的值的變化的情況下預測一個變量的變化。預測方法主要分為定性預測和定量預測。時間序列預測屬於定量預測的范疇,其中統計原理和概念應用於變量的給定歷史數據以預測同一變量的未來值。使用的一些時間序列預測技術包括:
- 自回歸模型(AR)
- 移動平均模型(MA)
- 季節回歸模型
- 分布式滯后模型
什么是自回歸綜合移動平均線(ARIMA)?
ARIMA代表Autoregressive Integrated Moving Average。ARIMA也被稱為Box-Jenkins方法。Box和Jenkins聲稱,通過對系列Y t進行差分,可以使非平穩數據靜止。Y t的一般模型寫成,
ARIMA模型結合了三種基本方法:
- 自回歸(AR) - 在自回歸的一個給定的時間序列數據在他們自己的滯后值,這是由在模型中的“P”值表示回歸的值。
- 差分(I-for Integrated) - 這涉及對時間序列數據進行差分以消除趨勢並將非平穩時間序列轉換為靜態時間序列。這由模型中的“d”值表示。如果d = 1,則查看兩個時間序列條目之間的差異,如果d = 2,則查看在d = 1處獲得的差異的差異,等等。
- 移動平均線(MA) - 模型的移動平均性質由“q”值表示,“q”值是誤差項的滯后值的數量。
該模型稱為自回歸整合移動平均值或Y t的 ARIMA(p,d,q)。我們將按照下面列舉的步驟來構建我們的模型。
第1步:測試和確保平穩性
要使用Box-Jenkins方法對時間序列進行建模,該系列必須是靜止的。靜止時間序列表示沒有趨勢的時間序列,其中一個具有恆定的均值和隨時間的方差,這使得預測值變得容易。
測試平穩性 -我們使用Augmented Dickey-Fuller單位根測試測試平穩性。對於靜止的時間序列,由ADF測試得到的p值必須小於0.05或5%。如果p值大於0.05或5%,則可以得出結論:時間序列具有單位根,這意味着它是一個非平穩過程。
差分 -為了將非平穩過程轉換為靜止過程,我們應用差分方法。區分時間序列意味着找出時間序列數據的連續值之間的差異。差異值形成新的時間序列數據集,可以對其進行測試以發現新的相關性或其他有趣的統計特性。
我們可以連續多次應用差分方法,產生“第一差異”,“二階差異”等。
在我們進行下一步之前,我們應用適當的差分順序(d)使時間序列靜止。
第2步:識別p和q
在此步驟中,我們通過使用自相關函數(ACF)和部分自相關函數(PACF)來確定自回歸(AR)和移動平均(MA)過程的適當順序。有關ACF和PACF功能的說明,請參閱我們的博客“從時間序列開始”。
識別AR模型的p階
對於AR模型,ACF將以指數方式衰減,PACF將用於識別AR模型的順序(p)。如果我們在PACF上的滯后1處有一個顯着峰值,那么我們有一個1階AR模型,即AR(1)。如果我們在PACF上有滯后1,2和3的顯着峰值,那么我們有一個3階AR模型,即AR(3)。
識別MA模型的q階
對於MA模型,PACF將以指數方式衰減,ACF圖將用於識別MA過程的順序。如果我們在ACF上的滯后1處有一個顯着的峰值,那么我們有一個1階的MA模型,即MA(1)。如果我們在ACF上的滯后1,2和3處有顯着的峰值,那么我們有一個3階的MA模型,即MA(3)。
第3步:估算和預測
一旦我們確定了參數(p,d,q),我們就可以估算ARIMA模型在訓練數據集上的准確性,然后使用擬合模型使用預測函數預測測試數據集的值。最后,我們交叉檢查我們的預測值是否與實際值一致。
使用R編程構建ARIMA模型
現在,讓我們按照解釋的步驟在R中構建ARIMA模型。有許多軟件包可用於時間序列分析和預測。我們加載相關的R包進行時間序列分析,並從雅虎財務中提取股票數據。
#從雅虎財經中提取數據
getSymbols('TECHM.NS',from ='2012-01-01',to =''2015-01-01')
#選擇相關的收盤價系列
stock_prices = TECHM.NS [,4]
在下一步中,我們計算股票的對數收益,因為我們希望ARIMA模型預測日志收益而不是股票價格。我們還使用繪圖函數繪制了日志返回系列。
#計算股票的日志退貨
stock = diff(log(stock_prices),lag = 1)
plot(stock,type ='l',main ='log return plot')
接下來,我們對返回系列數據調用ADF測試以檢查平穩性。來自ADF測試的p值為0.01告訴我們該系列是靜止的。如果系列是非靜止的,我們首先會對回歸系列進行區分,使其保持靜止。
在下一步中,我們修復了一個斷點,該斷點將用於將返回數據集拆分為代碼中的兩部分。
#將數據集拆分為兩部分 - 培訓和測試
acf.stock = acf(stock [c(1:breakpoint),],main ='ACF Plot',lag.max = 100)
我們可以觀察這些圖並得出自回歸(AR)訂單和移動平均(MA)訂單。
我們知道,對於AR模型,ACF將呈指數衰減,PACF圖將用於識別AR模型的階數(p)。對於MA模型,PACF將以指數方式衰減,ACF圖將用於識別MA模型的順序(q)。從這些圖中我們選擇AR order = 2和MA order = 2.因此,我們的ARIMA參數將是(2,0,2)。
我們的目標是從斷點開始預測整個回報序列。我們將在R中使用For循環語句,在此循環中,我們將預測測試數據集中每個數據點的返回值。
在下面給出的代碼中,我們首先初始化一個系列,它將存儲實際的回報,另一個系列來存儲預測的回報。在For循環中,我們首先根據動態斷點形成訓練數據集和測試數據集。
我們在訓練數據集上調用arima函數,其指定的順序為(2,0,2)。我們使用這個擬合模型通過使用forecast.Arima函數來預測下一個數據點。該功能設置為99%置信水平。可以使用置信度參數來增強模型。我們將使用模型中的預測點估計。預測函數中的“h”參數表示我們要預測的值的數量,在這種情況下,第二天返回。
我們可以使用摘要功能確認ARIMA模型的結果在可接受的范圍內。在最后一部分中,我們將每個預測收益和實際收益分別附加到預測收益序列和實際收益序列。
#初始化實際日志返回的xts對象
Actual_series = xts(0,as.Date(“2014-11-25”,“%Y-%m-%d”))
#初始化預測返回系列的數據幀
fit = arima(stock_train,order = c(2,0,2),include.mean = FALSE)
#繪制殘差的acf圖
acf(適合$ residuals,main =“Residuals plot”)
arima.forecast = forecast.Arima(fit,h = 1,level = 99)
#繪制預測
#為預測期創建一系列預測回報
forecasted_series = rbind(forecasted_series,arima.forecast $ mean [1])
#為預測期創建一系列實際回報
Actual_series = c(Actual_series,xts(Actual_return))
RM(Actual_return)
}
在我們轉到代碼的最后部分之前,讓我們從測試數據集中檢查ARIMA模型的結果以獲取樣本數據點。
從得到的系數,返回方程可寫為:
Y t = 0.6072 * Y (t-1) -0.8818 * Y (t-2) -0.5447ε (t-1)+0.8972ε (t-2)
系數給出了標准誤差,這需要在可接受的范圍內。Akaike信息標准(AIC)評分是ARIMA模型准確性的良好指標。模型更好地降低AIC得分。我們還可以查看殘差的ACF圖; 良好的ARIMA模型的自相關性將低於閾值限制。預測的點返回為-0.001326978,在輸出的最后一行中給出。
讓我們通過比較預測回報與實際回報來檢查ARIMA模型的准確性。代碼的最后一部分計算此准確性信息。
#調整實際返回系列的長度
Actual_series = Actual_series [-1]
#創建預測系列的時間序列對象
forecasted_series = xts(forecasted_series,index(Actual_series))
#創建兩個回歸系列的圖 - 實際與預測
#創建一個表格,用於預測的准確性
comparsion = merge(Actual_series,forecasted_series)
comparsion $ Accuracy = sign(comparsion $ Actual_series)== sign(comparsion $ Precasted)
#計算准確度百分比指標
Accuracy_percentage = sum(comparsion $ Accuracy == 1)* 100 / length(comparsion $ Accuracy)
如果預測收益的符號等於實際收益的符號,我們已為其指定了正准確度得分。模型的准確率百分比達到55%左右,看起來像是一個不錯的數字。可以嘗試運行模型以獲得(p,d,q)的其他可能組合,或者使用auto.arima函數選擇最佳的最佳參數來運行模型。
結論
最后,在本文中,我們介紹了ARIMA模型,並將其應用於使用R編程語言預測股票價格回報。我們還通過實際回報檢查了我們的預測結果。在我們即將發布的帖子中,我們將介紹其他時間序列預測技術,並使用Python / R編程語言進行嘗試。