時序分析:Python 中的 ARIMA 模型
時間序列分析廣泛用于預(yù)測和預(yù)測時間序列中的未來點。自回歸積分移動平均線(ARIMA)模型廣泛用于時間序列預(yù)測,被認為是最流行的方法之一。在本教程中,我們將學(xué)習如何在 Python 中構(gòu)建和評估用于時間序列預(yù)測的 ARIMA 模型。
推薦:使用NSDT場景編輯器快速助你搭建可二次編輯的3D應(yīng)用場景什么是ARIMA模型?
ARIMA 模型是用于分析和預(yù)測時間序列數(shù)據(jù)的統(tǒng)計模型。ARIMA 方法明確迎合了時間序列中的標準結(jié)構(gòu),為制作熟練的時間序列預(yù)測提供了一種簡單而強大的方法。
ARIMA 代表 自回歸積分移動平均線。它結(jié)合了三個關(guān)鍵方面:
自回歸 (AR):使用當前觀測值和滯后觀測值之間相關(guān)性的模型。滯后觀測值的數(shù)量稱為滯后順序或 p。
積分(I):使用原始觀測值的差分使時間序列平穩(wěn)。差異運算的次數(shù)稱為 d。
移動平均線 (MA):模型考慮當前觀測值與應(yīng)用于過去觀測值的移動平均模型的殘差之間的關(guān)系。移動平均線窗口的大小是階數(shù)或 q。
ARIMA 模型使用符號 ARIMA(p,d,q) 定義,其中 p、d 和 q 替換為整數(shù)值以指定所使用的確切模型。
采用 ARIMA 模型時的關(guān)鍵假設(shè):
時間序列是從基礎(chǔ) ARIMA 過程生成的。
參數(shù) p、d、q 必須根據(jù)原始觀測值適當指定。
在擬合 ARIMA 模型之前,必須通過差分使時間序列數(shù)據(jù)變得平穩(wěn)。
殘差應(yīng)不相關(guān),如果模型擬合良好,則正態(tài)分布。
總之,ARIMA 模型提供了一種結(jié)構(gòu)化且可配置的方法,用于為預(yù)測等目的對時間序列數(shù)據(jù)進行建模。接下來,我們將研究在 Python 中擬合 ARIMA 模型。
蟒蛇代碼示例在本教程中,我們將使用 Kaggle 的 Netflix 股票數(shù)據(jù)使用 ARIMA 模型預(yù)測 Netflix 股票價格。
數(shù)據(jù)加載我們將加載我們的股票價格數(shù)據(jù)集,并將“日期”列作為索引。
import pandas as pd net_df = pd.read_csv("Netflix_stock_history.csv", index_col="Date", parse_dates=True) net_df.head(3)數(shù)據(jù)可視化
我們可以使用熊貓“繪圖”功能來可視化股票價格和交易量隨時間的變化。很明顯,股價呈指數(shù)級增長。
net_df[["Close","Volume"]].plot(subplots=True, layout=(2,1));滾動預(yù)測 ARIMA 模型
我們的數(shù)據(jù)集已拆分為訓(xùn)練集和測試集,我們繼續(xù)訓(xùn)練 ARIMA 模型。然后預(yù)測了第一個預(yù)測。
通用ARIMA模型的結(jié)果很差,因為它產(chǎn)生了一條平線。因此,我們決定嘗試滾動預(yù)測方法。
注意:代碼示例是 BOGDAN IVANYUK 筆記本的修改版本。
from statsmodels.tsa.arima.model import ARIMA from sklearn.metrics import mean_squared_error, mean_absolute_error import math train_data, test_data = net_df[0:int(len(net_df)*0.9)], net_df[int(len(net_df)*0.9):] train_arima = train_data['Open'] test_arima = test_data['Open'] history = [x for x in train_arima] y = test_arima # make first prediction predictions = list() model = ARIMA(history, order=(1,1,0)) model_fit = model.fit() yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(y[0])
在處理時間序列數(shù)據(jù)時,由于依賴于先前的觀測值,滾動預(yù)測通常是必要的。執(zhí)行此操作的一種方法是在收到每個新觀測值后重新創(chuàng)建模型。
為了跟蹤所有觀察結(jié)果,我們可以手動維護一個名為 history 的列表,該列表最初包含訓(xùn)練數(shù)據(jù),每次迭代都會附加新的觀察結(jié)果。這種方法可以幫助我們獲得準確的預(yù)測模型。
# rolling forecasts for i in range(1, len(y)): # predict model = ARIMA(history, order=(1,1,0)) model_fit = model.fit() yhat = model_fit.forecast()[0] # invert transformed prediction predictions.append(yhat) # observation obs = y[i] history.append(obs)模型評估
我們的滾動預(yù)測 ARIMA 模型顯示,與簡單實施相比,改進了 100%,產(chǎn)生了令人印象深刻的結(jié)果。
# report performance mse = mean_squared_error(y, predictions) print('MSE: '+str(mse)) mae = mean_absolute_error(y, predictions) print('MAE: '+str(mae)) rmse = math.sqrt(mean_squared_error(y, predictions)) print('RMSE: '+str(rmse))
MSE: 116.89611817706545 MAE: 7.690948135967959 RMSE: 10.811850821069696
讓我們可視化并將實際結(jié)果與預(yù)測結(jié)果進行比較。很明顯,我們的模型已經(jīng)做出了高度準確的預(yù)測。
import matplotlib.pyplot as plt plt.figure(figsize=(16,8)) plt.plot(net_df.index[-600:], net_df['Open'].tail(600), color='green', label = 'Train Stock Price') plt.plot(test_data.index, y, color = 'red', label = 'Real Stock Price') plt.plot(test_data.index, predictions, color = 'blue', label = 'Predicted Stock Price') plt.title('Netflix Stock Price Prediction') plt.xlabel('Time') plt.ylabel('Netflix Stock Price') plt.legend() plt.grid(True) plt.savefig('arima_model.pdf') plt.show()結(jié)論
在這個簡短的教程中,我們概述了 ARIMA 模型以及如何在 Python 中實現(xiàn)它們以進行時間序列預(yù)測。ARIMA 方法提供了一種靈活且結(jié)構(gòu)化的方式來對依賴于先前觀測值和過去預(yù)測誤差的時間序列數(shù)據(jù)進行建模。如果您對 ARIMA 模型和時間序列分析的全面分析感興趣,我建議您查看使用時間序列分析進行股票市場預(yù)測。
原文鏈接:時序分析:Python 中的 ARIMA 模型 (mvrlink.com)
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。