掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
近日,Medium 上出現(xiàn)了一篇題為《Neural networks for algorithmic trading: enhancing classic strategies》的文章,作者Alex Honchar在文章中通過(guò)一個(gè)實(shí)際預(yù)測(cè)用例總結(jié)了金融時(shí)序預(yù)測(cè),使用神經(jīng)網(wǎng)絡(luò)真正改善了經(jīng)典的移動(dòng)平均線策略,提高了最終預(yù)測(cè)結(jié)果。

創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、網(wǎng)站備案、服務(wù)器租用、申請(qǐng)域名、軟件開(kāi)發(fā)、小程序設(shè)計(jì)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營(yíng)推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開(kāi)一個(gè)面向全國(guó)乃至全球的業(yè)務(wù)窗口:建站聯(lián)系熱線:18980820575
在之前的 教程中,我們討論了用于金融預(yù)測(cè)的人工神經(jīng)網(wǎng)絡(luò),比較金融時(shí)序預(yù)測(cè)的不同架構(gòu),意識(shí)到如何通過(guò)正確的數(shù)據(jù)處理和正則化實(shí)現(xiàn)充分的預(yù)測(cè),執(zhí)行基于多變量時(shí)序的預(yù)測(cè),并取得了非常好的波動(dòng)率(volatility)預(yù)測(cè)結(jié)果,以及自定義損失函數(shù)的實(shí)現(xiàn)。在第6篇教程中,我們借助不同來(lái)源的數(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 篇教程:
你可以在 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)率。過(guò)去我們把這些預(yù)測(cè)看作是抽象的,甚至試圖僅根據(jù)這些「上下」變動(dòng)的預(yù)測(cè)進(jìn)行交易。但是我們也知道,存在基于技術(shù)分析和金融指標(biāo)的其他大量交易策略。比如,我們可以建立不同窗口的移動(dòng)平均線(一個(gè)是長(zhǎng)線,比如說(shuō) 30 天,另一個(gè)是短線,很可能是 14 天),我們認(rèn)為交叉點(diǎn)即代表趨勢(shì)改變的時(shí)刻:
兩條移動(dòng)平均線交叉的示例
但是這一交易策略有個(gè)主要的缺點(diǎn):在平滑區(qū)域,我們依然在那些無(wú)實(shí)際變化的點(diǎn)上做交易,從而遭受金錢(qián)損失。
平滑區(qū)域中移動(dòng)平均線交叉的示例
我們?nèi)绾瓮ㄟ^(guò)機(jī)器學(xué)習(xí)解決這一問(wèn)題?
讓我們看看下面的策略假設(shè):我們?cè)谝苿?dòng)平均線交叉處預(yù)測(cè)某些特征的變化。如果出現(xiàn)一個(gè)跳躍,我們便將其作為交易信號(hào);否則就跳過(guò)它,因?yàn)槲覀儾幌朐谄交瑓^(qū)域損失錢(qián)。
我想嘗試把偏度(skewness)作為預(yù)測(cè)目標(biāo),偏度即度量分布非對(duì)稱(chēng)性的指標(biāo)。假設(shè)我們預(yù)測(cè)分布出現(xiàn)變化,這意味著當(dāng)前的趨勢(shì)(不只是平滑區(qū)域)將在未來(lái)發(fā)生改變。
分布偏度
輸入數(shù)據(jù)
這里我們使用 pandas 和 PyTi 來(lái)生成更多指標(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)起來(lái),以生成最終向量。
網(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 正則化類(lèi)似,其數(shù)學(xué)解釋請(qǐng)參見(jiàn)
https://www.deeplearningbook.org。
示例來(lái)自 http://www.deeplearningbook.org/contents/regularization.html
神經(jīng)網(wǎng)絡(luò)按照常規(guī)方式進(jìn)行訓(xùn)練,我們來(lái)檢查一下偏度預(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)練完成后,我繪制了收盤(pán)價(jià)、移動(dòng)平均線和交叉點(diǎn)處的垂直線:紅線和橙線是我們想要進(jìn)行交易的點(diǎn),綠線是我們不想進(jìn)行交易的點(diǎn)。看起來(lái)并不***,我們用回溯測(cè)試的方法來(lái)判斷。
哪一種移動(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)鍵度量和圖:
滾動(dòng)平均策略(rolling mean strategy)的回溯測(cè)試結(jié)果
使用神經(jīng)網(wǎng)絡(luò)的結(jié)果
我們只使用「紅色」和「橙色」交易信號(hào),跳過(guò)綠色交易信號(hào)。我們可以看到,這樣的策略少進(jìn)行了 2 次交易,幫助我們稍微減少***回落,且最終收益幾乎是原來(lái)的兩倍!
使用神經(jīng)網(wǎng)絡(luò)的策略的回溯測(cè)試結(jié)果
可能的改進(jìn)
看起來(lái)這個(gè)想法有點(diǎn)作用呢!我還想介紹一些可能有效的改進(jìn),大家可以自己試一下:
這篇文章介紹了如何使用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)金融時(shí)序預(yù)測(cè),也暫時(shí)完結(jié)了該系列教程。坦白講,我們無(wú)法使用神經(jīng)網(wǎng)絡(luò)來(lái)預(yù)測(cè)價(jià)格趨勢(shì)。我們考慮不同的數(shù)據(jù)源和目標(biāo),認(rèn)真處理過(guò)擬合和優(yōu)化超參數(shù)。我們得出的結(jié)論是:
原文:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-enhancing-classic-strategies-a517f43109bf
【本文是專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】
戳這里,看該作者更多好文

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流