量化投資:第2節 擇時策略的優化
作者: 阿布
上一節編寫了AbuFactorBuyBreak和AbuFactorSellBreak,做為擇時買入策略和擇時賣出策略,本節將繼續使用這兩個策略,
通過混入其它賣出策略來提高優化交易效果。
備註:已將AbuFactorBuyBreak和AbuFactorSellBreak做為abupy內建策略示例因子在專案中,所以本節不重複編寫因子,直接從abupy中import因子,如下所示
from abupy import AbuFactorBuyBreak, AbuFactorSellBreak
# buy_factors 60日向上突破,42日向上突破兩個因子
buy_factors = [{'xd' : 60, 'class': AbuFactorBuyBreak},
{'xd': 42, 'class': AbuFactorBuyBreak}]
# 使用120天向下突破為賣出訊號
sell_factor1 = {'xd': 120, 'class': AbuFactorSellBreak}
1 基本止盈止損策略
上一節的策略大多數的交易賣出因子都生效了,但效果很不好,量化交易系統一般都會有止盈策略和止損策略。
下面使用abupy中內建的基本止盈止損策略AbuFactorAtrNStop做回測,即使用AbuFactorAtrNStop和AbuFactorSellBreak兩個賣出因子策略並行同時生效, 交易結果如下所示
備註:
AbuFactorAtrNStop是真實波幅atr作為最大止盈和最大止損的常數值:
- 當stop_loss_n 乘以 當日atr > 買入價格 - 當日收盤價格:止損賣出,如下止損n = 0.5
- 當stop_win_n 乘以 當日atr < 當日收盤價格 -買入價格:止盈賣出,如下止盈n = 3.0
更多詳情請閱讀abupy中AbuFactorAtrNStop程式碼實現
from abupy import AbuFactorAtrNStop
from abupy import ABuPickTimeExecute, AbuBenchmark, AbuCapital
# 趨勢跟蹤策略止盈要大於止損設定值,這裡0.5,3.0
sell_factor2 = {'stop_loss_n': 0.5, 'stop_win_n': 3.0,
'class': AbuFactorAtrNStop}
# 兩個賣出因子策略並行同時生效
sell_factors = [sell_factor1, sell_factor2]
benchmark = AbuBenchmark()
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
benchmark,
buy_factors,
sell_factors,
capital, show=True)
2. 風險控制止損策略
可以看到效果比之前好多了,下面再加入一些其它賣出策略,量化交易系統中一般都會有風險控制策略,比如當股票今天價格開始劇烈下跌,採取果斷平倉措施。
可以使用abupy中內建的風險控制止損策略AbuFactorPreAtrNStop
- 策略中繼續使用真實波幅atr作為常數值: 當今日價格下跌幅度 > 當日atr 乘以 pre_atr_n(下跌止損倍數)賣出股票, 本例使用pre_atr_n=1.0
更多詳情請閱讀abupy中AbuFactorPreAtrNStop程式碼實現
sell_factors中加入AbuFactorPreAtrNStop賣出因子,三個賣出因子策略並行同時生效:
from abupy import AbuFactorPreAtrNStop
# 暴跌止損賣出因子形成dict
sell_factor3 = {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.0}
# 三個賣出因子同時生效,組成sell_factors
sell_factors = [sell_factor1, sell_factor2, sell_factor3]
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
benchmark,
buy_factors,
sell_factors,
capital,
show=True)
如上所示由於使用AbuFactorPreAtrNStop,效果繼續變好,有兩筆交易通過AbuFactorPreAtrNStop進行賣出,阻止了進一步的交易損失:
3. 利潤保護止盈策略
接下來注意下圖這筆交易,讀者會發現本來有很多盈利的,但是由於止盈沒有達到,所以最後變成了虧損
下面通過新增abupy內建的保護盈利的賣出因子AbuFactorCloseAtrNStop來使上圖那筆交易獲利:
- AbuFactorCloseAtrNStop atr移動止盈策略,當買入股票有一定收益後,如果股價下跌幅度超過close_atr_n乘以當日atr:則保護止盈賣出,如下示例使用close_atr_n=1.5
更多詳情請閱讀abupy中AbuFactorCloseAtrNStop程式碼實現
sell_factors加入AbuFactorCloseAtrNStop賣出因子,四個賣出因子策略並行同時生效
from abupy import AbuFactorCloseAtrNStop
# 保護止盈賣出因子組成dict
sell_factor4 = {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
# 四個賣出因子同時並行生效
sell_factors = [sell_factor1, sell_factor2, sell_factor3,
sell_factor4]
capital = AbuCapital(1000000, benchmark)
orders_pd, action_pd, _ = ABuPickTimeExecute.do_symbols_with_same_factors(['usTSLA'],
benchmark,
buy_factors,
sell_factors,
capital,
show=True)
從上圖交易結果可以看到最終那筆失敗的交易也盈利賣出了。
注意:
上面的很多擬合優化操作在實際應用中是不可取的,比如最後的那個使用AbuFactorCloseAtrNStop使交易盈利以及我之後即將講解的另一些手段使整體交易變好的做法,不應該因為某些特定股票或者特定交易修改引數或者新增因子等方式使結果變好,這樣就是過擬合擇時交易系統,將會在下一章節來示例如何挑選引數及因子的選擇問題,本節內容主要是為了講解擇時系統的示例。
讀者可能注意到我在多個賣出因子,還有即將講到的倉位控制都使用了atr,但請不要誤會我不是強調atr有多重要多好,只不過是我想盡量使用一個概念來完成儘可能多的任務,不必反覆引入過多的交易概念,因為篇幅有限,且容易引發閱讀困難
本節只是示例賣出策略的使用,更多個性化的賣出策略可根據自己的交易買入策略與交易風格自行編寫。
abu量化文件目錄章節
abu量化系統文件教程持續更新中,請關注公眾號中的更新提醒。
更多關於量化交易相關請閱讀《量化交易之路》
更多關於量化交易與機器學習相關請閱讀《機器學習之路》
更多關於abu量化系統請關注微信公眾號: abu_quant