用于金融時(shí)序預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò):可改善移動(dòng)平均線經(jīng)典策略
近日,Medium 上出現(xiàn)了一篇題為《Neural networks for algorithmic trading: enhancing classic strategies》的文章,作者Alex Honchar在文章中通過一個(gè)實(shí)際預(yù)測(cè)用例總結(jié)了金融時(shí)序預(yù)測(cè),使用神經(jīng)網(wǎng)絡(luò)真正改善了經(jīng)典的移動(dòng)平均線策略,提高了最終預(yù)測(cè)結(jié)果。
在之前的 教程中,我們討論了用于金融預(yù)測(cè)的人工神經(jīng)網(wǎng)絡(luò),比較金融時(shí)序預(yù)測(cè)的不同架構(gòu),意識(shí)到如何通過正確的數(shù)據(jù)處理和正則化實(shí)現(xiàn)充分的預(yù)測(cè),執(zhí)行基于多變量時(shí)序的預(yù)測(cè),并取得了非常好的波動(dòng)率(volatility)預(yù)測(cè)結(jié)果,以及自定義損失函數(shù)的實(shí)現(xiàn)。在第6篇教程中,我們借助不同來源的數(shù)據(jù)進(jìn)行設(shè)置和實(shí)驗(yàn),用一個(gè)神經(jīng)網(wǎng)絡(luò)完成兩個(gè)任務(wù),優(yōu)化超參數(shù)從而實(shí)現(xiàn)更優(yōu)預(yù)測(cè)。
今天,我想借助一個(gè)實(shí)際的預(yù)測(cè)用例,對(duì)金融時(shí)序預(yù)測(cè)做個(gè)總結(jié):我們將使用神經(jīng)網(wǎng)絡(luò)改善經(jīng)典的移動(dòng)平均線策略,證明它可以真正提升***的結(jié)果,并介紹了一些大家可能感興趣的新的預(yù)測(cè)目標(biāo)。
以下是之前的 6 篇教程:
- 簡(jiǎn)單的時(shí)序預(yù)測(cè):https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-part-one-simple-time-series-forecasting-f992daa1045a
- 正確的一維時(shí)序+回溯測(cè)試:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589
- 多變量時(shí)序預(yù)測(cè):https://medium.com/@alexrachnog/neural-networks-for-algorithmic-trading-2-1-multivariate-time-series-ab016ce70f57
- 波動(dòng)率預(yù)測(cè)與自定義損失: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ù)測(cè)完全不同的值,從股價(jià)變化到波動(dòng)率。過去我們把這些預(yù)測(cè)看作是抽象的,甚至試圖僅根據(jù)這些「上下」變動(dòng)的預(yù)測(cè)進(jìn)行交易。但是我們也知道,存在基于技術(shù)分析和金融指標(biāo)的其他大量交易策略。比如,我們可以建立不同窗口的移動(dòng)平均線(一個(gè)是長(zhǎng)線,比如說 30 天,另一個(gè)是短線,很可能是 14 天),我們認(rèn)為交叉點(diǎn)即代表趨勢(shì)改變的時(shí)刻:
兩條移動(dòng)平均線交叉的示例
但是這一交易策略有個(gè)主要的缺點(diǎn):在平滑區(qū)域,我們依然在那些無實(shí)際變化的點(diǎn)上做交易,從而遭受金錢損失。
平滑區(qū)域中移動(dòng)平均線交叉的示例
我們?nèi)绾瓮ㄟ^機(jī)器學(xué)習(xí)解決這一問題?
讓我們看看下面的策略假設(shè):我們?cè)谝苿?dòng)平均線交叉處預(yù)測(cè)某些特征的變化。如果出現(xiàn)一個(gè)跳躍,我們便將其作為交易信號(hào);否則就跳過它,因?yàn)槲覀儾幌朐谄交瑓^(qū)域損失錢。
我想嘗試把偏度(skewness)作為預(yù)測(cè)目標(biāo),偏度即度量分布非對(duì)稱性的指標(biāo)。假設(shè)我們預(yù)測(cè)分布出現(xiàn)變化,這意味著當(dāng)前的趨勢(shì)(不只是平滑區(qū)域)將在未來發(fā)生改變。
分布偏度
輸入數(shù)據(jù)
這里我們使用 pandas 和 PyTi 來生成更多指標(biāo),并將其作為輸入。我們將使用 MACD、Ichimocku cloud、RSI、波動(dòng)率等。所有這些值將形成多變量時(shí)序,并逐漸變得平滑,以方便之后在 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 用于時(shí)序預(yù)測(cè):
- 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ò)單個(gè)層的輸出中添加了小噪聲。這樣神經(jīng)網(wǎng)絡(luò)的運(yùn)行和 L2 正則化類似,其數(shù)學(xué)解釋請(qǐng)參見
https://www.deeplearningbook.org。
示例來自 http://www.deeplearningbook.org/contents/regularization.html
神經(jīng)網(wǎng)絡(luò)按照常規(guī)方式進(jìn)行訓(xùn)練,我們來檢查一下偏度預(yù)測(cè)如何改善(不改善)移動(dòng)平均線策略(moving averages strategy)。
我們基于 2012 到 2016 年的 AAPL 價(jià)格訓(xùn)練神經(jīng)網(wǎng)絡(luò),然后在 2016-2017 年的數(shù)據(jù)上進(jìn)行測(cè)試(測(cè)試教程:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)。
訓(xùn)練完成后,我繪制了收盤價(jià)、移動(dòng)平均線和交叉點(diǎn)處的垂直線:紅線和橙線是我們想要進(jìn)行交易的點(diǎn),綠線是我們不想進(jìn)行交易的點(diǎn)??雌饋聿⒉?**,我們用回溯測(cè)試的方法來判斷。
哪一種移動(dòng)平均線交叉(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)介紹的回溯測(cè)試方法進(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
滾動(dòng)平均策略(rolling mean strategy)的回溯測(cè)試結(jié)果
使用神經(jīng)網(wǎng)絡(luò)的結(jié)果
我們只使用「紅色」和「橙色」交易信號(hào),跳過綠色交易信號(hào)。我們可以看到,這樣的策略少進(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ò)的策略的回溯測(cè)試結(jié)果
可能的改進(jìn)
看起來這個(gè)想法有點(diǎn)作用呢!我還想介紹一些可能有效的改進(jìn),大家可以自己試一下:
- 不同的指標(biāo)策略:MACD、RSI
- 將能夠極好優(yōu)化的交易策略與提出的方法相結(jié)合
- 試著預(yù)測(cè)不同的時(shí)序特征:赫斯特指數(shù)(Hurst exponent)、自相關(guān)系數(shù)(autocorrelation coefficient),或者其他的統(tǒng)計(jì)動(dòng)差(statistical moment)
這篇文章介紹了如何使用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)金融時(shí)序預(yù)測(cè),也暫時(shí)完結(jié)了該系列教程。坦白講,我們無法使用神經(jīng)網(wǎng)絡(luò)來預(yù)測(cè)價(jià)格趨勢(shì)。我們考慮不同的數(shù)據(jù)源和目標(biāo),認(rèn)真處理過擬合和優(yōu)化超參數(shù)。我們得出的結(jié)論是:
- 處理過擬合時(shí)要小心!99% 的案例都需要處理過擬合,如果準(zhǔn)確率達(dá)到 80% 就不要相信了,肯定是哪里出錯(cuò)了……
- 嘗試使用收盤價(jià)或收益以外的其他因素,比如波動(dòng)率、偏度等。
- 如果你有不同的數(shù)據(jù)源,那就使用多模態(tài)學(xué)習(xí)。
- 不要忘記找出合適的超參數(shù)!
- 創(chuàng)建一個(gè)由多個(gè)經(jīng)典策略組合而成的策略,并將其建立在機(jī)器學(xué)習(xí)之上,然后再進(jìn)行回溯測(cè)試。
原文:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-enhancing-classic-strategies-a517f43109bf
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】