用于金融時序預(yù)測的神經(jīng)網(wǎng)絡(luò):可改善移動平均線經(jīng)典策略
近日,Medium 上出現(xiàn)了一篇題為《Neural networks for algorithmic trading: enhancing classic strategies》的文章,作者Alex Honchar在文章中通過一個實際預(yù)測用例總結(jié)了金融時序預(yù)測,使用神經(jīng)網(wǎng)絡(luò)真正改善了經(jīng)典的移動平均線策略,提高了最終預(yù)測結(jié)果。
在之前的 教程中,我們討論了用于金融預(yù)測的人工神經(jīng)網(wǎng)絡(luò),比較金融時序預(yù)測的不同架構(gòu),意識到如何通過正確的數(shù)據(jù)處理和正則化實現(xiàn)充分的預(yù)測,執(zhí)行基于多變量時序的預(yù)測,并取得了非常好的波動率(volatility)預(yù)測結(jié)果,以及自定義損失函數(shù)的實現(xiàn)。在第6篇教程中,我們借助不同來源的數(shù)據(jù)進(jìn)行設(shè)置和實驗,用一個神經(jīng)網(wǎng)絡(luò)完成兩個任務(wù),優(yōu)化超參數(shù)從而實現(xiàn)更優(yōu)預(yù)測。
今天,我想借助一個實際的預(yù)測用例,對金融時序預(yù)測做個總結(jié):我們將使用神經(jīng)網(wǎng)絡(luò)改善經(jīng)典的移動平均線策略,證明它可以真正提升***的結(jié)果,并介紹了一些大家可能感興趣的新的預(yù)測目標(biāo)。
以下是之前的 6 篇教程:
- 簡單的時序預(yù)測:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-part-one-simple-time-series-forecasting-f992daa1045a
- 正確的一維時序+回溯測試:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589
- 多變量時序預(yù)測:https://medium.com/@alexrachnog/neural-networks-for-algorithmic-trading-2-1-multivariate-time-series-ab016ce70f57
- 波動率預(yù)測與自定義損失:https://codeburst.io/neural-networks-for-algorithmic-trading-volatility-forecasting-and-custom-loss-functions-c030e316ea7e
- 多任務(wù)與多模態(tài)學(xué)習(xí):https://becominghuman.ai/neural-networks-for-algorithmic-trading-multimodal-and-multitask-deep-learning-5498e0098caf
- 超參數(shù)優(yōu)化:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-hyperparameters-optimization-cb2b4a29b8ee
你可以在 Github 查看神經(jīng)網(wǎng)絡(luò)訓(xùn)練的代碼:
https://github.com/Rachnog/Deep-Trading/blob/master/strategy/skew.py。
主要內(nèi)容
如上所述,我們能夠預(yù)測完全不同的值,從股價變化到波動率。過去我們把這些預(yù)測看作是抽象的,甚至試圖僅根據(jù)這些「上下」變動的預(yù)測進(jìn)行交易。但是我們也知道,存在基于技術(shù)分析和金融指標(biāo)的其他大量交易策略。比如,我們可以建立不同窗口的移動平均線(一個是長線,比如說 30 天,另一個是短線,很可能是 14 天),我們認(rèn)為交叉點即代表趨勢改變的時刻:
兩條移動平均線交叉的示例
但是這一交易策略有個主要的缺點:在平滑區(qū)域,我們依然在那些無實際變化的點上做交易,從而遭受金錢損失。
平滑區(qū)域中移動平均線交叉的示例
我們?nèi)绾瓮ㄟ^機器學(xué)習(xí)解決這一問題?
讓我們看看下面的策略假設(shè):我們在移動平均線交叉處預(yù)測某些特征的變化。如果出現(xiàn)一個跳躍,我們便將其作為交易信號;否則就跳過它,因為我們不想在平滑區(qū)域損失錢。
我想嘗試把偏度(skewness)作為預(yù)測目標(biāo),偏度即度量分布非對稱性的指標(biāo)。假設(shè)我們預(yù)測分布出現(xiàn)變化,這意味著當(dāng)前的趨勢(不只是平滑區(qū)域)將在未來發(fā)生改變。
分布偏度
輸入數(shù)據(jù)
這里我們使用 pandas 和 PyTi 來生成更多指標(biāo),并將其作為輸入。我們將使用 MACD、Ichimocku cloud、RSI、波動率等。所有這些值將形成多變量時序,并逐漸變得平滑,以方便之后在 MLP 中使用,或者停留在 CNN/RNN。
- nine_period_low = pd.rolling_min(pd.DataFrame(lowp), window= ROLLING / 2)
- ichimoku = (nine_period_high + nine_period_low) /2
- ichimokuichimoku = ichimoku.replace([np.inf, -np.inf], np.nan)
- ichimokuichimoku = ichimoku.fillna(0.).values.tolist()
- macd_indie = moving_average_convergence(pd.DataFrame(closep))
- wpr = williams_percent_r(closep)
- rsi = relative_strength_index(closep, ROLLING / 2)
- volatility1 = pd.DataFrame(closep).rolling(ROLLING).std().values#.tolist()
- volatility2 = pd.DataFrame(closep).rolling(ROLLING).var().values#.tolist()
- volatility = volatility1 / volatility2
- volatility = [v[0] for v in volatility]
- rolling_skewness = pd.DataFrame(closep).rolling(ROLLING).skew().values
- rolling_kurtosis = pd.DataFrame(closep).rolling(ROLLING).kurt().values
我把獲取的指標(biāo)特征和 OHLCV 元組串聯(lián)起來,以生成最終向量。
網(wǎng)絡(luò)架構(gòu)
這里,我想展示如何訓(xùn)練正則化 MLP 用于時序預(yù)測:
- main_input = Input(shape=(len(X[0]), ), name='main_input')
- x = GaussianNoise(0.05)(main_input)
- x = Dense(64, activation='relu')(x)
- x = GaussianNoise(0.05)(x)
- output = Dense(1, activation = "linear", name = "out")(x)
- final_model = Model(inputs=[main_input], outputs=[output])
- opt = Adam(lr=0.002)
- final_model.compile(optoptimizer=opt, loss='mse')
這里比較新奇的地方在于向輸入和神經(jīng)網(wǎng)絡(luò)單個層的輸出中添加了小噪聲。這樣神經(jīng)網(wǎng)絡(luò)的運行和 L2 正則化類似,其數(shù)學(xué)解釋請參見
https://www.deeplearningbook.org。
示例來自 http://www.deeplearningbook.org/contents/regularization.html
神經(jīng)網(wǎng)絡(luò)按照常規(guī)方式進(jìn)行訓(xùn)練,我們來檢查一下偏度預(yù)測如何改善(不改善)移動平均線策略(moving averages strategy)。
我們基于 2012 到 2016 年的 AAPL 價格訓(xùn)練神經(jīng)網(wǎng)絡(luò),然后在 2016-2017 年的數(shù)據(jù)上進(jìn)行測試(測試教程:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)。
訓(xùn)練完成后,我繪制了收盤價、移動平均線和交叉點處的垂直線:紅線和橙線是我們想要進(jìn)行交易的點,綠線是我們不想進(jìn)行交易的點??雌饋聿⒉?**,我們用回溯測試的方法來判斷。
哪一種移動平均線交叉(moving average intersection)有用?
未使用神經(jīng)網(wǎng)絡(luò)的結(jié)果
我使用這篇文章
(https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)介紹的回溯測試方法進(jìn)行操作,下面是一些關(guān)鍵度量和圖:
- [(‘Total Return’, ‘1.66%’),
- (‘Sharpe Ratio’, ‘16.27’),
- (‘Max Drawdown’, ‘2.28%’),
- (‘Drawdown Duration’, ‘204’)]
- Signals: 9
- Orders: 9
- Fills: 9
滾動平均策略(rolling mean strategy)的回溯測試結(jié)果
使用神經(jīng)網(wǎng)絡(luò)的結(jié)果
我們只使用「紅色」和「橙色」交易信號,跳過綠色交易信號。我們可以看到,這樣的策略少進(jìn)行了 2 次交易,幫助我們稍微減少***回落,且最終收益幾乎是原來的兩倍!
- [(‘Total Return’, ‘3.07%’),
- (‘Sharpe Ratio’, ‘27.99’),
- (‘Max Drawdown’, ‘1.91%’),
- (‘Drawdown Duration’, ‘102’)]
- Signals: 7
- Orders: 7
- Fills: 7
使用神經(jīng)網(wǎng)絡(luò)的策略的回溯測試結(jié)果
可能的改進(jìn)
看起來這個想法有點作用呢!我還想介紹一些可能有效的改進(jìn),大家可以自己試一下:
- 不同的指標(biāo)策略:MACD、RSI
- 將能夠極好優(yōu)化的交易策略與提出的方法相結(jié)合
- 試著預(yù)測不同的時序特征:赫斯特指數(shù)(Hurst exponent)、自相關(guān)系數(shù)(autocorrelation coefficient),或者其他的統(tǒng)計動差(statistical moment)
這篇文章介紹了如何使用神經(jīng)網(wǎng)絡(luò)實現(xiàn)金融時序預(yù)測,也暫時完結(jié)了該系列教程。坦白講,我們無法使用神經(jīng)網(wǎng)絡(luò)來預(yù)測價格趨勢。我們考慮不同的數(shù)據(jù)源和目標(biāo),認(rèn)真處理過擬合和優(yōu)化超參數(shù)。我們得出的結(jié)論是:
- 處理過擬合時要小心!99% 的案例都需要處理過擬合,如果準(zhǔn)確率達(dá)到 80% 就不要相信了,肯定是哪里出錯了……
- 嘗試使用收盤價或收益以外的其他因素,比如波動率、偏度等。
- 如果你有不同的數(shù)據(jù)源,那就使用多模態(tài)學(xué)習(xí)。
- 不要忘記找出合適的超參數(shù)!
- 創(chuàng)建一個由多個經(jīng)典策略組合而成的策略,并將其建立在機器學(xué)習(xí)之上,然后再進(jìn)行回溯測試。
原文:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-enhancing-classic-strategies-a517f43109bf
【本文是51CTO專欄機構(gòu)“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】