寫在前面
在本文中,我們利用Nixtla的NeuralForecast框架,實現多種基于Transformer的時序預測模型,包括:Transformer, Informer, Autoformer, FEDformer和PatchTST模型,并且實現將它們應用于股票價格預測的簡單例子。
1
NeuralForecast
neuralforecast 是一個旨在為時間序列預測提供一個豐富的、高度可用和魯棒的神經網絡模型集合的工具庫。這個庫集成了從傳統的多層感知器(MLP)和遞歸神經網絡(RNN)到最新的模型如N-BEATS、N-HiTS、TFT,以及其他高級架構,以適應多樣化的預測需求。它的關鍵功能包括對靜態、歷史和未來的外生變量的支持,提高了模型在實際應用中的靈活性。庫中的模型提供了良好的預測可解釋性,允許用戶繪制趨勢、季節性以及外生預測組件。neuralforecast 還實現了概率預測,通過簡單的適配器支持量化損失和參數分布,增加了預測結果的置信度。此外,它提供了自動模型選擇功能,通過并行自動超參數調整來高效確定最優的模型配置。庫的簡潔接口設計與SKLearn兼容,確保了易用性,并且訓練和評估損失的計算能夠適應不同的比例,這為不同規模的數據集提供了靈活性。最后,neuralforecast 包含了一個廣泛的模型集合,包括但不限于LSTM、RNN、TCN、N-BEATS、N-HiTS、ESRNN以及各種基于Transformer的預測模型等,都是以即插即用的方式實現,方便用戶直接應用于各種時間序列預測場景。這些特性使得neuralforecast 成為那些尋求高效、精確且可解釋時間序列預測模型的研究人員和實踐者的有力工具。本文將利用neuralforecast 實現各種Transformer模型,并展示將它們應用于股票價格預測的簡單例子。
2
環境配置
本地環境:
Python 3.8
IDE:Pycharm
庫版本:
Pandas version: 2.0.3
Matplotlib version: 3.7.1
Neuralforecast version: 1.6.4
為了使用最新的其他模型,也可以直接fork neuralforecast的源碼:
git clone https://github.com/Nixtla/neuralforecast.git
cd neuralforecast
pip install -e .
3
代碼實現
步驟 1: 導入所需的庫
- 導入庫:首先,導入處理數據所需的
pandas
庫,繪圖所需的matplotlib.pyplot
庫,以及neuralforecast
中的多個模塊。這些模塊包括各種預測模型和評估指標函數。
import pandas as pd
from neuralforecast.models import VanillaTransformer, Informer, Autoformer, FEDformer, PatchTST
from neuralforecast.core import NeuralForecast
import matplotlib.pyplot as plt
from neuralforecast.losses.numpy import mae, rmse, mse
步驟 2: 數據準備
-
讀取數據:使用
pandas
從 CSV 文件加載數據。這個數據集包含股票的每日收盤價。 -
數據預處理:重命名列以符合模型的輸入要求(例如,將日期列重命名為 ‘ds’,將收盤價列重命名為 ‘y’)。此外,將日期列轉換為日期時間格式,并為數據集添加一個唯一標識符,這對于使用neuralforecast進行時間序列預測是必要的。
df = pd.read_csv('./000001_Daily_Close.csv')
df['unique_id'] = 1
df = df.rename(columns={'date': 'ds', 'Close': 'y'})
df['ds'] = pd.to_datetime(df['ds'])
步驟 3: 定義預測模型
-
初始化模型:定義一個模型列表,每個模型都是
neuralforecast
庫中的一個類的實例。對于每個模型,指定預測范圍(horizon)、輸入窗口大小(input_size)以及其他訓練參數(如 max_steps, val_check_steps)。 -
模型配置:這些參數決定了模型的訓練方式,包括訓練持續時間、評估頻率和早停機制等。每個模型都有一些公共的參數以及它們自身的參數可以調整,這里均使用它們默認的參數進行模型初始化。
models = [VanillaTransformer(h=horizon,input_size=input_size,max_steps=train_steps,val_check_steps=check_steps,early_stop_patience_steps=3,scaler_type='standard'),Informer(h=horizon, # Forecasting horizoninput_size=input_size, # Input sizemax_steps=train_steps, # Number of training iterationsval_check_steps=check_steps, # Compute validation loss every 100 stepsearly_stop_patience_steps=3, # Number of validation iterations before early stoppingscaler_type='standard'), # Stop training if validation loss does not improveFEDformer(h=horizon,input_size=input_size,max_steps=train_steps,val_check_steps=check_steps,early_stop_patience_steps=3),Autoformer(h=horizon,input_size=input_size,max_steps=train_steps,val_check_steps=check_steps,early_stop_patience_steps=3),PatchTST(h=horizon,input_size=input_size,max_steps=train_steps,val_check_steps=check_steps,early_stop_patience_steps=3),]
步驟 4: 模型訓練與交叉驗證
-
創建 NeuralForecast 實例:使用
NeuralForecast
類整合所有的模型。這個類提供了一個統一的接口來訓練和評估多個模型。 -
執行交叉驗證:使用
cross_validation
方法對每個模型進行訓練和評估。這個方法自動進行時間序列的交叉驗證,分割數據集并評估模型在不同時間窗口上的性能。
nf = NeuralForecast(models=models,freq='B')Y_hat_df = nf.cross_validation(df=df,val_size=100,test_size=100,n_windows=None)
步驟 5: 數據篩選
- 篩選數據點:通過選擇特定的“cutoff”點來過濾
Y_hat_df
中的預測。這種篩選基于預測范圍horizon
,確保評估是在均勻間隔的時間點上進行。
Y_plot = Y_hat_df
cutoffs = Y_hat_df['cutoff'].unique()[::horizon]
Y_plot = Y_plot[Y_hat_df['cutoff'].isin(cutoffs)]
步驟 6: 繪圖與性能評估
-
繪制預測結果:使用
matplotlib
繪制真實數據與每個模型的預測結果。這有助于直觀地比較不同模型的預測準確性。 -
計算評估指標:對每個模型,計算和打印均方根誤差(RMSE)、平均絕對誤差(MAE)和均方誤差(MSE)等性能指標。這些指標提供了量化模型性能的方式。
plt.figure(figsize=(20, 5))
plt.plot(Y_plot['ds'], Y_plot['y'], label='True')
for model in models:plt.plot(Y_plot['ds'], Y_plot[model], label=model)rmse_value = rmse(Y_hat_df['y'], Y_hat_df[model])mae_value = mae(Y_hat_df['y'], Y_hat_df[model])mse_value = mse(Y_hat_df['y'], Y_hat_df[model])print(f'{model}: rmse {rmse_value:.4f} mae {mae_value:.4f} mse {mse_value:.4f}')plt.xlabel('Datestamp')
plt.ylabel('Close')
plt.grid()
plt.legend()
plt.show()
步驟 7: 結果展示
- 展示圖表:最后,顯示繪制的圖表。圖表展示了不同模型在整個時間序列上的預測表現,允許直觀地評估和比較模型。
VanillaTransformer: rmse 56.5187 mae 38.8573 mse 3194.3650
Informer: rmse 52.2324 mae 39.1110 mse 2728.2239
FEDformer: rmse 48.9400 mae 35.9884 mse 2395.1237
Autoformer: rmse 58.5010 mae 45.7157 mse 3422.3614
PatchTST: rmse 48.5870 mae 36.1392 mse 2360.6968
在對比基于 Transformer 的各種模型在股票價格預測任務上的表現時,從可視化以及評估結果中,我們發現 FEDformer 和 PatchTST 在所有評估指標(RMSE、MAE、MSE)上表現最為出色,這可能歸因于它們在處理長期依賴關系和捕獲時間序列數據中的復雜模式方面的優勢。相較之下,雖然 Informer 顯示了合理的性能,但其表現略遜于 FEDformer 和 PatchTST。VanillaTransformer 和 Autoformer 的性能相對較差。這些結果強調了根據特定任務的需求選擇合適的模型架構的重要性,同時也表明了在實際應用中進行模型選擇時需要考慮到模型的特定優勢和潛在的局限性。
4
總結
本文展示了如何使用 neuralforecast 實現多種 Transformer 模型(包括 Informer, Autoformer, FEDformer 和 PatchTST),并將它們應用于股票價格預測的簡單示例。通過這個演示,我們可以看到 Transformer 模型在處理時間序列數據方面的潛力和靈活性。雖然我們的實驗是初步的,但它為進一步的研究和應用提供了一個基礎。讀者可以在此基礎上進行更深入的模型調優、特征工程和超參數實驗,以提升預測性能。此外,這些模型的應用不限于股票價格預測,還可以擴展到其他領域的時間序列分析。