天天看點

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

标星★公衆号,第一時間擷取最新研究

本期作者:Alexandr Honchar

本期翻譯:LIN | 公衆号翻譯部

近期原創文章:

♥ 基于無監督學習的期權定價異常檢測(代碼+資料)

♥ 5種機器學習算法在預測股價的應用(代碼+資料)

♥ 深入研讀:利用Twitter情緒去預測股市

♥ Two Sigma用新聞來預測股價走勢,帶你吊打Kaggle

♥ 利用深度學習最新前沿預測股價走勢

♥ 一位資料科學PhD眼中的算法交易

♥ 基于RNN和LSTM的股市預測方法

♥ 人工智能『AI』應用算法交易,7個必踩的坑!

♥ 神經網絡在算法交易上的應用系列(一)

♥ 預測股市 | 如何避免p-Hacking,為什麼你要看漲?

♥ 如何鑒别那些用深度學習預測股價的花哨模型?

♥ 優化強化學習Q-learning算法進行股市交易

♥ 搭建入門級高頻交易系統(架構細節分享)

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

這是公衆号關于神經網絡在金融領域特别是算法交易上的一個連載系列:

1、簡單時間序列預測(已發表)

2、正确的時間序列預測+回測

3、多變量時間序列預測

4、波動率預測和自定義損失函數

5、多任務和多模式學習

6、超參數優化

7、用神經網絡增強傳統政策

8、機率程式設計和Pyro進行預測

歡迎大家關注公衆号檢視此系列。本期我們從講第二部分。

前言

在第二部分中,我們想描述更正确處理金融資料的方法。與前一篇文章相比,我們想展示不同的資料标準化方法,并多讨論些過拟合的問題(在處理具有随機特性的資料時肯定會出現過拟合問題)。我們不會比較不同的架構(CNN, LSTM),你可以在之前的文章中檢視它們。但即使隻使用簡單的前饋神經網絡,我們也能看到一些重要的東西。

資料準備

讓我們看看從2005年到今天蘋果股價的曆史時間序列。你可以很容易地從雅虎财經下載下傳到csv格式的檔案。在這個檔案中資料的順序是“颠倒”的——從2017年到2005年,是以我們需要先把它颠倒過來,如圖:

data = pd.read_csv('./data/AAPL.csv')[::-1] 
close_price = data.ix[:, 'Adj Close'].tolist() 
plt.plot(close_price) 
plt.show()
           
灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

正如我們在前一篇文章中所讨論的,我們可以用兩種不同的方式來處理金融時間序列預測的問題(暫時忽略波動率預測、異常檢測等有趣的話題):

我們将問題看作:

1、回歸問題(試圖準确預測收盤價或第二天的收益)

2、二進制分類問題(價格将上升[1;0]或向下[0;1])

首先,我們準備訓練資料。我們想根據N天前的資訊來預測t+1的值。例如,有過去30天的收盤價資料,我們想預測明天,也就是第31天的價格是多少。我們将前90%的時間序列作為訓練集(将其視為曆史資料),後10%作為測試集來評估模型。

金融時間序列的主要問題是它們并不一定平穩,這意味着它們的統計特性(平均值、方差、最大值和最小值)随着時間的變化而變化,我們可以用ADF檢驗。正因為這種不平穩性,我們不能使用經典的資料标準化方法,如MinMax或Z-score标準化。

在我們的例子中,我們将在分類問題上做一點“弊”。我們不需要預測某個确切的值,是以未來的期望值和方差對我們來說不是很有意義,我們隻需要預測價格往上還是往下運動。這就是為什麼我們冒險用30天視窗内資料的均值和方差(z-score标準化)來标準化的原因,不妨假設在一個時間視窗内均值和方差不會改變很多,和未來的資訊也沒有關系。

X = [(np.array(x) — np.mean(x)) / np.std(x) for x in X]
           

對于回歸問題,我們已經不能像這樣作弊了,是以我們用pandas計算收益率(價格與昨天相比變化的百分比),它看起來是這樣的:

close_price_diffs = close.price.pct_change()
           
灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

正如我們所看到的,這個資料已經比較規範了,位于-0.5到0.5之間。

神經網絡結構

正如我之前所說,在本文中,我們将隻使用MLPs來展示在金融資料上過度拟合神經網絡是多麼容易(在前一篇文章中實際上存在過拟合),以及如何預防它。在CNNs或RNNs上擴充這些想法相對容易,但是了解這個概念要重要得多。和以前一樣,我們使用Keras作為神經網絡原型的主要架構。

我們的第一個網絡是這樣的:

model = Sequential() 
model.add(Dense(64, input_dim=30)) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(2)) 
model.add(Activation('softmax'))
           
建議在每一個仿射或卷積層之後都使用批規範化方法和用 Leaky ReLU作為基本的激活函數,因為它已經成為了“工業标準”——它們有助于更快地訓練網絡。另一個好處是在訓練中降低學習率,Keras用ReduceLROnPlateau函數做到了這一點:
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.9, 
patience=5, min_lr=0.000001, verbose=1) 
model.compile(optimizer=opt,                
loss='categorical_crossentropy', metrics=['accuracy'])
           

我們是這樣開始訓練的:

history = model.fit(X_train, Y_train, nb_epoch = 50,  
batch_size = 128, verbose=1, validation_data=(X_test, Y_test),           
shuffle=True, callbacks=[reduce_lr])
           

這是我們将結果可視化的方法(讓我們來判斷loss和accuracy圖)

plt.figure() 
plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) 
plt.title('model loss') 
plt.ylabel('loss') 
plt.xlabel('epoch') 
plt.legend(['train', 'test'], loc='best')
           

重要時刻 : 

在上一篇文章中,我們在訓練網絡時隻疊代了10次——這是完全錯誤的。即使我們能看到55%的準确率,這并不意味着我們能比随機猜測更好地預測未來。最有可能的是,在我們的訓練資料集中有55%的視窗資料具有一種行為(向上),45%的視窗資料具有另一種行為(向下)。我們的網絡隻是學習到了訓練資料的這種分布而已。是以,最好可以讓網絡疊代學習20-50-100次,如果疊代次數太多的話無法使用提前停止政策(early stopping)。

分類

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

First network loss

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

First network accuracy

結果一點都不好,我們的測試loss根本沒有改變,我們可以看到明顯的過拟合,讓我們建立一個更深的網絡并嘗試一下:

model = Sequential() 
model.add(Dense(64, input_dim=30)) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(16)) 
model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(2)) model.add(Activation('softmax'))
           

以下是結果:

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Second network loss

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Second network accuracy

在這裡,我們看到結果或多或少是相同的,甚至更糟…… 是時候向模型添加一些正則化方法了,首先在權重求和上添加L2範數(譯者注:一種深度學習中常用的減少泛化誤差技術):

model = Sequential() 
model.add(Dense(64, input_dim=30,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(16,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(2)) 
model.add(Activation('softmax'))
           

它表現得更好,但仍然不夠好(即使損失在減少,但準确性很差)。這種情況在處理金融資料時經常發生——在這裡有更好的解釋:

https://www.quora.com/Loss-cross-entropy-is-decreasing-but-accuracy-remains-the-same-while-training-convolutional-neural-networks-How-can-it-happen

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Regularized network loss

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Regularized network accuracy

接下來我要做的事情看起來很奇怪,就是我們要對已經正則化的網絡進行正則化,以0.5的機率加入dropout(在反向傳播時随機忽略一些權重,以避免神經元之間的共适應關系造成的過拟合):

model = Sequential()  
model.add(Dense(64, input_dim=30,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dropout(0.5)) 
model.add(Dense(16,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(2)) 
model.add(Activation('softmax'))
           
灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Hardcore regularized network loss

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

Hardcore regularized network accuracy

正如我們所看到的,圖表上看起來有點湊合了,我們可以報告大約58%的準确率,這比随機猜測好一點。

回歸

對于回歸,我們将使用收益率資料和前面搭建好的神經網絡(但沒有dropout),并檢查回歸的效果如何:

model = Sequential()
model.add(Dense(64, input_dim=30,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(16,                 
activity_regularizer=regularizers.l2(0.01))) model.add(BatchNormalization()) 
model.add(LeakyReLU()) 
model.add(Dense(1)) 
model.add(Activation('linear'))
           

這是将預測結果可視化的代碼:

pred = model.predict(np.array(X_test)) 
original = Y_test 
predicted = pred  
plt.plot(original, color='black', label = 'Original data') plt.plot(predicted, color='blue', label = 'Predicted data') plt.legend(loc='best') 
plt.title('Actual and predicted') 
plt.show()
           

它的效果很差,甚至不值得評論。在結論部分,我們将給出一些有助于解決回歸問題的小提示。

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

回測

請想起通常我們為什麼處理這些時間序列?我們想要建立一個交易系統,這意味着它必須做一些交易——買賣股票,希望能使投資組合增值。

有很多現成的解決方案可以測試你的政策(比如Quantopian),但我們決定學習它們是如何從内部建構的,這本詳細介紹實作的方法:(文末下載下傳)

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

文末下載下傳

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

附随書代碼下載下傳

我們測試的政策非常簡單:如果我們的網絡說股價會上漲,我們就買入股票,然後在網絡說股價會下跌時賣出,并等待下一個買入信号。邏輯是這樣的:

if np.argmax(pred) == 0 and not self.long_market:
     self.long_market = True
     signal = SignalEvent(1, sym, dt, 'LONG', 1.0)
     self.events.put(signal)print pred, 'LONG'if np.argmax(pred) == 1 and self.long_market:
     self.long_market = False
     signal = SignalEvent(1, sym, dt, 'EXIT', 1.0)
     self.events.put(signal)print pred, 'EXIT'
           

以下是用2012 - 2016年資料訓練的分類網絡在2016 - 2017年5月測試的結果:

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

藍色的圖顯示了組合淨值的增長(哇,在1.5年裡增長了3%),黑色的圖顯示了收益,紅色的圖-回撤(虧錢的時期)。

讨論

乍一看,結果很爛。糟心的回歸和平淡無奇的分類(58%的準确率)似乎在乞求我們放棄這個想法。當你看到那“難以置信”的3%的收入(隻買蘋果股票并持有會更容易實作,在這段時間裡品蘋果股票增長了20%)之後,你也許想合上電腦,做一些不涉及金融或機器學習的事情。但是有很多方法可以改善我們的結果(人們在基金中所做的就是這些事情):

1、使用高頻資料(每小時、分鐘)——機器學習算法需要更多的資料,并且短期預測效果更好。

2、做一些超參數優化,不僅包括神經網絡優化和訓練參數優化,還包括訓練的曆史視窗優化。

3、使用更好的神經網絡架構,如CNNs或RNNs。

4、不僅要使用收盤價或收益率,還可以使用每天的所有開高低成交量資料;如果可能的話——收集N個最相關的公司、行業财務狀況、經濟變量等資訊。隻依靠我們使用的簡單資料是不可能建立好的預測模型的。

5、使用更複雜的,也許非對稱的損失函數。例如,我們用于回歸的MSE對符号是不變的,而符号卻對我們的任務至關重要。

結論

預測金融資料是極其複雜的。很容易過度拟合,我們不知道要訓練的正确曆史範圍,而且很難獲得所需的所有資料。但正如我們所看到的,它是有效的,甚至可以帶來一些利潤。本文可以作為一個進一步研究的好起點并提供了探索的一個流程。

在明天的文章中,我們計劃展示自動化的超參數搜尋過程,添加更多的資料(開高低收成交量量和财務名額),并使用強化學習來學習政策,以及檢查強化學習的agent是否相信我們的預測。敬請期待!

推薦閱讀

01、經過多年交易之後你應該學到的東西(深度分享)

02、監督學習标簽在股市中的應用(代碼+書籍)

03、全球投行頂尖機器學習團隊全面分析

04、使用Tensorflow預測股票市場變動

05、使用LSTM預測股票市場基于Tensorflow

06、美麗的回測——教你定量計算過拟合機率

07、利用動态深度學習預測金融時間序列基于Python

08、Facebook開源神器Prophet預測時間序列基于Python

09、Facebook開源神器Prophet預測股市行情基于Python

10、2018第三季度最受歡迎的券商金工研報前50(附下載下傳)

11、實戰交易政策的精髓(公衆号深度呈現)

12、Markowitz有效邊界和投資組合優化基于Python

13、使用LSTM模型預測股價基于Keras

14、量化金融導論1:資産收益的程式化介紹基于Python

15、預測股市崩盤基于統計機器學習與神經網絡(Python+文檔)

16、實作最優投資組合有效前沿基于Python(附代碼)

17、精心為大家整理了一些超級棒的機器學習資料(附連結)

18、海量Wind資料,與全網使用者零距離邂逅!

19、機器學習、深度學習、量化金融、Python等最新書籍彙總下載下傳

20、各大賣方2019年A股政策報告,都是有故事的人!

如何擷取書籍

在背景輸入

20190218

背景擷取方式介紹

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...

掃碼關注我們

灰色神經網絡的預測算法_神經網絡在算法交易上的應用系列——時序預測+回測...