日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

發布時間:2023/12/20 python 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【python量化】大幅提升预测性能,将NSTransformer用于股价预测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

NSTransformer模型來自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是為了解決其他方法出現過平穩化處理的問題。其通過提出序列平穩化以及去平穩化注意力機制可以使得模型面向提升預測性能的角度進行平穩化處理,相比于Transformer的變體,NSTransformer在預測性能方面實現了大幅度的提升。下面的這篇文章主要帶大家了解一下NSTransformer的基本原理,并使用作者開源的NSTransformer代碼,并將其用于股票價格預測當中。

1

NSTransformer模型

由于Transformer的全局范圍的建模能力,使其在時間序列預測中顯示出巨大的力量。然而,在聯合分布隨時間變化的非穩態真實世界數據上,它們的性能可能會退化得很可怕。以前的研究主要采用平穩化技術來削弱原始序列的非平穩特性,以提高預測能力。但是,被剝奪了內在非平穩性的平穩序列對于現實世界中的突發事件預測的指導意義不大。這個問題,在本文中被稱為過平穩化(over-stationarization),導致Transformer對不同序列產生無差別的時序關注,阻礙了深度模型的預測能力。為了解決序列的可預測性和模型能力之間的困境,作者提出了Non-stationary Transformer (NSTransformer)作為一個通用框架,其中有兩個相互依賴的模塊。序列平穩化(Series Stationarization)和去平穩化注意力(De-stationary Attention)。具體來說,序列平穩化模塊統一了每個輸入的統計特性,并將輸出轉換為恢復的統計特性,以提高可預測性。為了解決過平穩化問題,去平穩化注意力被設計出來,通過近似于從原始序列中學到的可區分的注意,將內在的非平穩信息恢復為時間依賴。作者提出的NSTransformer框架在很大程度上提升了主流Transformer模型的變體的預測性能,相比于Transformer,MSE降低了49.43%,相比于Informer,降低了47.34%,相比于Reformer,降低了46.89%。

模型框架

NSTransformer遵循先前在時間序列預測中使用的Transformer架構,采用標準的編碼器-解碼器結構,其中編碼器從過去的數據中提取信息,而解碼器則通過對過去的歷史信息進行過匯總來實施預測。典型的NSTransformer是通過對Transformer的輸入和輸出進行序列平穩化處理,并用提出的非平穩注意機制取代self-attention,這可以提高基礎模型的非平穩序列的預測能力??傊?#xff0c;NSTransformer主要包括下面兩個模塊:序列平穩化模塊以及去平穩注意力模塊。

NSTransformer的基本框架

序列平穩化

序列平穩化主要模塊兩個模塊,一個是歸一化(Normalization)模塊,另一個是反歸一化(De-Normalization)模塊。首先,歸一化模塊通過一個滑動窗口的形式對每一維時間序列數據進行歸一化處理,這樣窗口化的方式可以將每一個相鄰窗口內的數據都具有相同的均值跟方差,以消除序列之間尺度上的差異性,并增加輸入數據在時序上的分布穩定性。歸一化的過程是:

在模型預測結束之后,反歸一化模塊利用歸一化時記錄的均值跟方差信息,用來將模型的輸出映射回原來的尺度,以恢復歸一化時損失的信息。反歸一化的過程是:

通過這兩個階段的變換,模型將接收到平穩的輸入,這些輸入遵循穩定的分布,更容易泛化。這樣的設計還使模型對時間序列具有平移不變性和尺度不變性,從而有利于真實序列的預測。

序列平穩化過程(圖片來自:https://zhuanlan.zhihu.com/p/587665491)

去平穩化注意力

去平穩化注意力機制去平穩化注意力機制的過程如下圖所示:

去平穩化注意力機制(圖片來自:https://zhuanlan.zhihu.com/p/587665491)

如前面所提到的,過平穩化問題是由內在的非平穩信息的消失引起的,這將使模型無法捕捉到用于預測的事件性時間依賴。因此,作者試圖近似從原始的非平穩序列中去學習注意力。下面是Transformer計算注意力的原始公式:

對于輸入時間序列x,計算它的均值跟方差得到:

除此之外,為了簡化分析這里假設了用于嵌入的前饋層在時間維度是線性的,基于線性假設可以推導出??,??與對平穩化后時間序列計算得到的??跟??的關系是:

其中,??與??是??跟??在時間維度的均值。這樣從原始時間序列中計算注意力機制的公式,可以被從平穩化后的時間序列中計算的??跟??替代為下面的公式,具體的推導可以參考原文的附錄。

這樣得到的注意力公式不僅包含了原始時間序列的信息,也包含了經過平穩化后的序列信息。之后為了恢復對非平穩序列的原始注意力,這里作者將消失的非平穩信息重新引入到非平穩序列的計算中。為了得到所需要的計算值,作者引入了去平穩因子???跟??,它們都是通過兩個多層感知器從非平穩時間序列中計算得到的。進而,去平穩化注意力的計算方式可以得到如下形式:

這樣,它既能利用平穩序列的可預測性,又能保持原始序列固有的時間依賴性。

2

環境配置

本地環境:

Python?3.7 IDE:Pycharm

庫版本:

numpy 1.18.1 pandas 1.0.3 sklearn 0.22.2 matplotlib 3.2.1 torch?1.10.1

NSTransformer源碼Github鏈接:

https://github.com/thuml/Nonstationary_Transformers

3

代碼實現

NSTransformer的官方代碼實現借鑒了Informer的代碼,因此,與之前的推文【python量化】將Informer用于股價預測類似,首先將NSTransformer的源碼下載到本地,然后將我們的數據集放到某個路徑下,這里仍然用到了上證指數14到17年四年的開高低收成交量數據。在將NSTransformer的代碼用于我們的股票數據預測任務時,同樣需要明確的是,我們的任務是基于高低收成交量來預測收盤價,這是一個多變量輸入,單變量輸出的預測任務。所以主要需要修改下面幾個參數的設置。當需要進行不同預測任務時,如增加某些特征,預測多個目標變量等則可通過修改features,target,enc_in,dec_in以及c_out參數進行實現。NSTransformer的主要參數與Informer類似,主要包括:

model: ns_transformer,可以選擇其他模型包括Informer,Transformer以及Autoformer。 data: 設置為custom,用于調用Dataset_Custom類,從而可以自定義數據集。 root_path:指定數據集存放的文件夾。 data_path:指定csv數據集的名稱。 features:設置為MS,這是因為我們是用開高低收成交量來預測收盤價,所以是多變量輸出來預測單變量。 target:表示預測變量,設置為Close,對應我們csv文件預測變量的列名。 freq:表示預測頻率,設置為d,因為我們用到的是日線級別的數據。 seq_len:表示輸入encoder的序列長度,這里設置為20。 label_len:表示輸入decoder中的token的長度,這里設置為10,即通過前10個真實值來輔助decoder進行預測。 pred_len:表示預測序列的長度,這里設置為5,即表示預測后5個時刻的序列值。 enc_in:表示encoder的輸入維度,這里設置為5,因為我們用到了開高低收以及成交量5個特征。 dec_in:表示decoder的輸入維度,同enc_in。 c_out:表示輸出序列的維度,這里設置為1,因為我們的目標變量只有收盤價。 moving_avg:?移動平均的窗口大小。 p_hidden_dims:去平穩性映射器的隱層維度。 p_hidden_layers:映射器的層數。

其他參數像模型層數,維度之類的可以根據自己的電腦配置進行修改。下面是進行上證指數預測實驗的參數配置:

args.is_training = 1 args.model_id = 'test' args.model='ns_Transformer' # model name, options: [ns_Transformer, Transformer]# data loader args.data = 'custom' # dataset type args.root_path ='./data/stock/' # root path of the data file args.data_path ='SH000001.csv' # data file args.features='MS' # forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate' args.target='Close' # 'target feature in S or MS task' args.freq = 'd' # freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h' args.checkpoints ='./checkpoints/' # 'location of model checkpoints'# forecasting task args.seq_len = 20 # input sequence length args.label_len = 10 # start token length args.pred_len = 5 # prediction sequence lengthargs.# model define args.enc_in = 5 # encoder input size args.dec_in = 5 # decoder input size args.c_out = 1 # output size args.d_model = 256 # dimension of model args.n_heads = 4 # num of heads args.e_layers = 2 # num of encoder layers args.d_layers = 1 # num of decoder layers args.d_ff = 256 # dimension of fcn args.moving_avg = 5 # window size of moving average args.factor = 1 # attn factor args.distil= True # whether to use distilling in encoder, using this argument means not using distillingargs.dropout = 0.05 # dropout args.embed = 'timeF' # time features encoding, options:[timeF, fixed, learned] args.activation = 'gelu' # 'activation' args.output_attention = True # help='whether to output attention in encoder args.do_predict = True # whether to predict unseen future data# optimization args.num_workers = 0 # data loader num workers args.itr = 1 # experiments times args.train_epochs = 20 # train epochs args.batch_size = 32 # batch size of train input data args.patience = 3 # early stopping patience args.learning_rate = 0.0001 # optimizer learning rate args.des = 'test' # exp description args.loss = 'mse' # loss function args.lradj = 'type1' # adjust learning rate args.use_amp = False # use automatic mixed precision training# GPU args.use_gpu = False # use gpu args.gpu = 0 # gpu args.use_multi_gpu = False args.devices = '0,1,2,3' # device ids of multile gpus args.seed = 2021 # random seed# de-stationary projector params args.p_hidden_dims = [128, 128] # hidden layer dimensions of projector (List) args.p_hidden_layers = 2 # number of hidden layers in projector

按照設置的參數,然后對模型進行訓練跟測試:

Exp = Exp_Mainif args.is_training:for ii in range(args.itr):# setting record of experimentssetting = '{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format(args.model_id,args.model,args.data,args.features,args.seq_len,args.label_len,args.pred_len,args.d_model,args.n_heads,args.e_layers,args.d_layers,args.d_ff,args.factor,args.embed,args.distil,args.des, ii)exp = Exp(args) # set experimentsprint('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))exp.train(setting)print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))exp.test(setting)if args.do_predict:print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))exp.predict(setting, True)torch.cuda.empty_cache() else:ii = 0setting = '{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format(args.model_id,args.model,args.data,args.features,args.seq_len,args.label_len,args.pred_len,args.d_model,args.n_heads,args.e_layers,args.d_layers,args.d_ff,args.factor,args.embed,args.distil,args.des, ii)exp = Exp(args) # set experimentsprint('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))exp.test(setting, test=1)torch.cuda.empty_cache()

下面是在CPU上的訓練過程。經過訓練,可以看出模型的訓練集上的loss不斷下降,由于加入了early stop機制,所以經過6個epoch模型就停止訓練了。經過在測試集上的測試,NSTransformer實現了0.0027的mse跟0.0415的mae(歸一化后的結果)。需要注意的是,模型經過訓練跟測試之后,會在當前路徑的./checkpoints中保存模型參數,在./results/{settings}/下生成pred.npy以及true.npy文件用來分別存放測試集上的預測結果跟ground truth。

Use CPU >>>>>>>start training : test_ns_Transformer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_fc1_ebtimeF_dtTrue_test_0>>>>>>>>>>>>>>>>>>>>>>>>>> train 659 val 95 test 191 Epoch: 1 cost time: 1.7922062873840332 Epoch: 1, Steps: 20 | Train Loss: 0.0605105 Vali Loss: 0.0028209 Test Loss: 0.0028931 Validation loss decreased (inf --> 0.002821). Saving model ... Updating learning rate to 0.0001 Epoch: 2 cost time: 1.569800615310669 Epoch: 2, Steps: 20 | Train Loss: 0.0374645 Vali Loss: 0.0030634 Test Loss: 0.0028165 EarlyStopping counter: 1 out of 3 Updating learning rate to 5e-05 Epoch: 3 cost time: 1.5588312149047852 Epoch: 3, Steps: 20 | Train Loss: 0.0328267 Vali Loss: 0.0024335 Test Loss: 0.0027673 Validation loss decreased (0.002821 --> 0.002434). Saving model ... Updating learning rate to 2.5e-05 Epoch: 4 cost time: 1.5059726238250732 Epoch: 4, Steps: 20 | Train Loss: 0.0296629 Vali Loss: 0.0031771 Test Loss: 0.0028892 EarlyStopping counter: 1 out of 3 Updating learning rate to 1.25e-05 Epoch: 5 cost time: 1.6665441989898682 Epoch: 5, Steps: 20 | Train Loss: 0.0289504 Vali Loss: 0.0029475 Test Loss: 0.0027112 EarlyStopping counter: 2 out of 3 Updating learning rate to 6.25e-06 Epoch: 6 cost time: 1.5528459548950195 Epoch: 6, Steps: 20 | Train Loss: 0.0285680 Vali Loss: 0.0029404 Test Loss: 0.0027616 EarlyStopping counter: 3 out of 3 Early stopping >>>>>>>testing : test_ns_Transformer_custom_ftMS_sl20_ll10_pl5_dm256_nh4_el2_dl1_df256_fc1_ebtimeF_dtTrue_test_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< test 191 test shape: (5, 32, 5, 1) (5, 32, 5, 1) test shape: (160, 5, 1) (160, 5, 1) mse:0.0027673370204865932, mae:0.04154161363840103

調用模型的predict()方法可以直接預測所有數據后面的未知數據,因為這里預測長度為5,所以直接調用就相當于預測后5天的收盤價走勢了。預測的結果會保存在./results/{settings}/下面的real_prediction.npy文件中。

exp = Exp(args) exp.predict(setting, True) #?the?prediction?will?be?saved?in?./results/{setting}/real_prediction.npy prediction?=?np.load('./results/'+setting+'/real_prediction.npy') plt.figure() plt.plot(prediction[0,:,-1]) plt.show()

最后將完整的測試集上的預測結果進行可視化。

plt.figure() plt.plot(trues[:,0,-1].reshape(-1), label='GroundTruth') plt.plot(preds[:,0,-1].reshape(-1), label='Prediction') plt.legend() plt.show()

除此之外,NSTransformer的源碼中也提供了Transformer、Informer以及Autoformer的實現。為了直觀展示這幾種模型之間的預測表現,我們采用相同的超參數對另外幾種模型進行實驗,并將其可視化的結果進行展示。需要注意是這里為了方便實驗,每種模型的超參沒有進行尋優而是統一采用了NSTransformer模型的實驗配置。

Transformer

Informer

Autoformer

從可視化結果中可以看出相比于其他Transformer模型,NSTransformer實現了最好的擬合效果。最后統計這幾種模型的MSE跟MAE(未反歸一化),從誤差上也可以看出NSTransformer實現了最低的預測誤差,其次是Autoformer,Informer以及Transformer。

NSTransformer: mse:0.0027673370204865932, mae:0.04154161363840103 Transformer: mse:0.0147677231580019, mae:0.10331685841083527 Informer: mse:0.01395915262401104,?mae:0.09441611915826797 Autoformer: mse:0.008317378349602222, mae:0.07286103069782257

4

總結

時間序列的非平穩性是現實時間序列數據中存在的重要特性,尤其是對金融時間序列來說。而現有大多數方法都會對數據做平穩化處理來提升預測性能,然而,平穩化處理的過程也會導致一部分信息的丟失。而NSTransformer通過設計的序列平穩化以及去平穩化注意力機制,使得它既能利用平穩序列的可預測性,又能保持原始序列固有的時間依賴性。文中通過將NSTransformer與其他模型包括Transformer,Informer以及Autoformer的實驗對比,進一步證實了NSTransformer的預測性能。因此,在面對非平穩,高噪聲的股票數據預測中,NSTransformer或許可以取得較好的預測表現。

本文內容僅僅是技術探討和學習,并不構成任何投資建議。

參考文獻:

Liu, Y., Wu, H., Wang, J., & Long, M. (2022). Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting. In Advances in Neural Information Processing Systems.

NeurIPS2022 | NSTransformers: 非平穩時間序列的通用預測框架 - 游凱超的文章 - 知乎 https://zhuanlan.zhihu.com/p/587665491

獲取完整代碼與數據以及其他歷史文章完整源碼與數據可加入《人工智能量化實驗室》知識星球。

《人工智能量化實驗室》知識星球

加入人工智能量化實驗室知識星球,您可以獲得:(1)定期推送最新人工智能量化應用相關的研究成果,包括高水平期刊論文以及券商優質金融工程研究報告,便于您隨時隨地了解最新前沿知識;(2)公眾號歷史文章Python項目完整源碼;(3)優質Python、機器學習、量化交易相關電子書PDF;(4)優質量化交易資料、項目代碼分享;(5)跟星友一起交流,結交志同道合朋友。(6)向博主發起提問,答疑解惑。

總結

以上是生活随笔為你收集整理的【python量化】大幅提升预测性能,将NSTransformer用于股价预测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。