阿布量化版權全部 未經容許 禁止轉載html
abu量化系統github地址(歡迎+star)python
上一節講解的是港股市場的回測,以及使用AbuTLine.show_least_valid_poly優化策略,提升系統的穩定性,本節主要示例比特幣與萊特幣的走勢分析與回測。github
abupy內置沙盒數據中:安全
不少人說作幣類市場更容易,由於整個市場就兩個能作的票,比特幣,萊特幣,可是真的是這樣嗎?微信
量化策略失敗結果的人工分析,是對策略結果影響很是大的一個環節,可是在失敗結果分析前,對交易目標的歷史數據進行
分析也是對策略結果影響很是大的一個環節,經過觀察交易目標,分析價格走勢,趨勢的分佈,策略的適配度,以至生成定製針對交易目標的特定策略都是在這個環節中涉及的,本文不涉及與交易牽扯過深的知識,本節只示例一些簡單的數據分析以及可視化分析技巧。機器學習
首先使用ABuSymbolPd.make_kl_df接口將btc和ltc沙盒中的數據請求到對象btc,ltc中:函數
備註:下面使用btc.tail(7)能夠看到交易日是連續的,由於比特幣和萊特幣一年365天均可交易oop
# btc是比特幣symbol代號 btc = ABuSymbolPd.make_kl_df('btc', start='2013-09-01', end='2017-07-26') # ltc是萊特幣symbol代號 ltc = ABuSymbolPd.make_kl_df('ltc', start='2014-03-19', end='2017-07-26') btc.tail(7)
下面經過ABuMarketDrawing.plot_simple_two_stock縮放到一個級別上進行走勢對比,走勢基本類似,ltc的啓動要慢btc:學習
ABuMarketDrawing.plot_simple_two_stock({'btc': btc, 'ltc': ltc})
因爲最近一年的走勢和以前差異很大,因此單獨切割出btc365, ltc365:
btc365 = btc[-365:] ltc365 = ltc[-365:]
使用ABuKLUtil.date_week_wave統計交易日震盪幅度能夠發現:
ABuKLUtil.date_week_wave({'btc': btc, 'btc365':btc365, 'ltc':ltc, 'ltc365':ltc365})
下面統計週期內的上漲均值,下跌均值,以及數量,比值:
使用ABuKLUtil.p_change_stats能夠發現:
ABuKLUtil.p_change_stats({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
btc日漲幅平均值2.615, 共770個交易日上漲走勢 btc日跌幅平均值-2.422, 共651個交易日下跌走勢 btc日平均漲跌比1.080, 上漲下跌數量比:1.183 btc365日漲幅平均值2.264, 共213個交易日上漲走勢 btc365日跌幅平均值-2.135, 共151個交易日下跌走勢 btc365日平均漲跌比1.061, 上漲下跌數量比:1.411 ltc日漲幅平均值3.275, 共596個交易日上漲走勢 ltc日跌幅平均值-2.773, 共608個交易日下跌走勢 ltc日平均漲跌比1.181, 上漲下跌數量比:0.980 ltc365日漲幅平均值3.645, 共191個交易日上漲走勢 ltc365日跌幅平均值-2.421, 共166個交易日下跌走勢 ltc365日平均漲跌比1.505, 上漲下跌數量比:1.151
以下ABuKLUtil.wave_change_rate所示比特幣和萊特幣日振幅漲跌幅比都在2.0以上, 具有日交易進行統計套利的條件:
備註:美股市場在1.8以上認爲具備統計套利條件, 另外還有成交量等幾個參數須要綜合計算,以後的章節會具體講解
ABuKLUtil.wave_change_rate({'btc': btc, 'ltc': ltc})
btc日振幅漲跌幅比:2.068436 ltc日振幅漲跌幅比:2.051736
使用ABuKLUtil.date_week_win查看天天的漲跌機率:
ABuKLUtil.date_week_win({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
使用ABuKLUtil.date_week_mean查看天天的帶正負的漲跌mean:
ABuKLUtil.date_week_mean({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
下面使用ABuKLUtil.p_change_bcut_vc統計:
ABuKLUtil.bcut_change_vc({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
上面使用bcut_change_vc沒法知道(-inf, -10]和(10, inf]的正無窮與無窮的具體數值,使用qcut_change_vc:
ABuKLUtil.qcut_change_vc({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
上面經過數據的轉換分析對比特幣,萊特幣進行了分析,下面經過可視化對比特幣,萊特幣進行分析
下面封裝一個函數使用AbuTLine中的可視化接口分析數據:
備註: 關於AbuTLine中的具體實現以及接口的功能做用請閱讀源代碼AbuTLine
def show_tl(tc='btc', show_cnt=365, offset=0, step_x=1.0): tc = btc if tc =='btc'else ltc show_cnt = int(show_cnt) offset = int(offset) step_x = float(step_x) tc_line = tl.AbuTLine(tc[-show_cnt-offset:len(tc) - offset].close, 'tc_line') # 可視化技術線擬合曲線及上下擬合通道曲線 tc_line.show_regress_trend_channel(step_x=step_x) # 可視化可視化技術線骨架通道 tc_line.show_skeleton_channel(step_x=step_x) # 可視化技術線比例分割的區域 tc_line.show_percents() # 可視化技術線最優擬合次數 tc_line.show_best_poly() show_tl()
metrics_func rolling_mean=2940.278963120883, metrics_func y_fit=1674.1519187819645
best poly = 3, zoom=False
上面的show_tl函數若是想要切換觀察週期,須要不斷改參數,太麻煩,下面使用ipywidgets的可交互插件進行可視化控制:
from ipywidgets import interact tc_range = ['btc', 'ltc'] show_range = [180, 360, 720, 1080] offset_range = [0, 60, 120, 180, 250, 360, 720] step_x_range = [0.8, 1.0, 1.2, 1.5, 1.8, 2.0] _ = interact(show_tl, tc=tc_range, show_cnt=show_range, offset=offset_range, step_x=step_x_range)
經過上面的數據分析和可視化分析,對比特幣使用和以前策略相同的參數和策略組合和參數分配實際上是不合適的,由於幣類市場的振幅實在是太大,並且走勢分佈混亂,止盈止損的設定也並不清晰,實際上最適合的量化策略是作一些統計套利策略,關於高頻統計套利相關策略,會在以後的章節使用比特幣,萊特幣作爲示例。
下面咱們本節先無論回測結果如何,先和以前使用的策略同樣的狀況下進行回測示例。
與A股市場,港股相似首先將abupy量化環境設置爲E_MARKET_TARGET_TC表明幣類市場,代碼以下所示:
# 設置市場類型爲港股 abupy.env.g_market_target = EMarketTargetType.E_MARKET_TARGET_TC #買入因子,賣出因子等依然使用相同的設置,以下所示: read_cash = 1000000 # 買入因子依然延用向上突破因子 buy_factors = [{'xd': 60, 'class': AbuFactorBuyBreak}, {'xd': 42, 'class': AbuFactorBuyBreak}] # 賣出因子繼續使用上一節使用的因子 sell_factors = [ {'stop_loss_n': 1.0, 'stop_win_n': 3.0, 'class': AbuFactorAtrNStop}, {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5}, {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5} ]
繼續使用run_loop_back進行回測,以前示例回測都是使用n_folds參數,下面換一種寫法示例,使用start, end作爲參數:
choice_symbols=None或者使用['btc', 'ltc']都行, 若是使用None則作全市場測試,可是因爲幣類市場中暫時只有btc和ltc,因此這裏傳遞['btc', 'ltc']和傳遞None的結果是一致的。
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash, buy_factors, sell_factors, start='2013-09-01', end='2017-07-26', choice_symbols=None) AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)
買入後賣出的交易數量:43 勝率:51.1628% 平均獲利指望:35.8877% 平均虧損指望:-10.0494% 盈虧比:4.8866 策略收益: 392.9862% 基準收益: 2036.0891% 策略年化收益: 69.4965% 基準年化收益: 360.0663% 策略買入成交比例:69.7674% 策略資金利用率比例:14.4106% 策略共執行1425個交易日
從收益曲線對比上發現徹底輸給了基準的收益,雖然策略收益也有: 392%,可是既然作了高風險的產品,沒有高的收益是不對的,不要認爲這是貪心,俗話說操着賣白粉的心, 賺着賣白菜的錢,就是這種狀況。
備註:幣類市場使用的基準大盤就是比特幣
要想改善突破策略收益最簡單的方式就是以下方式:
# 賣出因子只使用AbuFactorAtrNStop,且止盈止損參數都設置100 sell_factors = [ {'stop_loss_n': 100, 'stop_win_n': 100, 'class': AbuFactorAtrNStop}, ] abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash, buy_factors, sell_factors, start='2013-09-01', end='2017-07-26', choice_symbols=None) AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)
買入後賣出的交易數量:0 勝率:0.0000% 平均獲利指望:0.0000% 平均虧損指望:0.0000% 盈虧比:0.0000 策略收益: 1468.0266% 基準收益: 2036.0891% 策略年化收益: 259.6089% 基準年化收益: 360.0663% 策略買入成交比例:4.6512% 策略資金利用率比例:94.8652% 策略共執行1425個交易日
哈,如上所示,其實這就是本身騙本身,賣出因子只使用AbuFactorAtrNStop,且止盈止損參數都設置100即就是買入後就不賣出了,我卻是相信大多數人虧損的時候能夠作到不賣出,將虧損的部分堅持持有,對外聲稱本身是價值投資者、基本面分析者,認爲應該長期持有、長線投資,但稍微有了一點利潤後就確定要着急兌現,盈利了那麼多以後還能一支持有的其實很了不得。
交易中應該追求的是讓利潤盡情的奔跑,讓虧損儘快的止損,但大多數人作的都是讓虧損盡情地虧損,讓利潤儘快地兌現。
下面使用正經的方法作策略參數選擇,首先買入因子沿用以前的60,42天突破就是很大的問題,幣類市場的趨勢週期從上面的數據分析看明顯要小於這兩個值,那麼到底選擇什麼值合適呢,這裏可使用abu量化文檔‘第七節 尋找策略最優參數和評分’來進行參數選擇,下面單隻從突破週期介紹使用另外一種方法。
使用abupy中的ABuKLUtil.resample_close_mean函數,首先針對以前章節作回測的tsla進行數據進行resample_close_mean
ABuKLUtil.resample_close_mean(ABuSymbolPd.make_kl_df('usTSLA'))
關於ABuKLUtil.resample_close_mean的做用這裏不過多講解,有興趣自行閱讀源代碼,這裏實際上只須要知道一點,使用週期突破的策略選擇的週期應該是ABuKLUtil.resample_close_mean返回值在0.08左右範圍的重採樣週期。
觀察上面resample_close_mean針對tsla數據的結果60D, 42D都是在0.08左右,因此以前一直使用的突破策略選擇60日突破和42日突破都是適合tsla作爲策略使用的。(實際從上面能夠看出21d,42d,60d,90d,120d其實均可以適應tsla,且基本適應大多數股票交易品種)
下面使用resample_close_mean針對比特幣,萊特幣數據:
ABuKLUtil.resample_close_mean({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})
從輸出能夠看出10d以上就已經不適合比特幣和萊特幣作爲週期參數了:
10D 0.0847 0.0760 0.0958 0.1147
下面的回測使用10d和12d,且修改止盈參數stop_win_n從3.0至7.0:
備註:止盈參數的設置原本就要隨着作的品種的風險而定,風險越大的,止盈也必要要提升,不然無論怎麼優化其它策略,參數收益都不會高,7.0也只是我隨意寫的數,讀者可嘗試使用其它值測試
# xd: 10, xd: 12 buy_factors = [{'xd': 10, 'class': AbuFactorBuyBreak}, {'xd': 12, 'class': AbuFactorBuyBreak}] # stop_win_n:3.0->7.0 sell_factors = [ {'stop_loss_n': 1.0, 'stop_win_n': 7.0, 'class': AbuFactorAtrNStop}, {'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5}, {'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5} ]
abu_result_tuple, kl_pd_manger = abu.run_loop_back(read_cash, buy_factors, sell_factors, start='2013-09-01', end='2017-07-26', choice_symbols=None) AbuMetricsBase.show_general(*abu_result_tuple, only_show_returns=True)
買入後賣出的交易數量:229 勝率:51.0917% 平均獲利指望:46.7237% 平均虧損指望:-9.3463% 盈虧比:6.8304 策略收益: 2138.7616% 基準收益: 2036.0891% 策略年化收益: 378.2231% 基準年化收益: 360.0663% 策略買入成交比例:70.6897% 策略資金利用率比例:38.3857% 策略共執行1425個交易日
上面的回測結果已經能夠比肩基準收益,且讀者能夠發現這個的收益比上面那個一直持有不賣出的:
'stop_loss_n': 100, 'stop_win_n': 100
收益還要好不少,並且更重要的是,採起了多種規避風險策略,止損參數依然使用1.0:
'stop_loss_n': 1.0, 'stop_win_n': 7.0,
依然使用風險控制止損策略AbuFactorPreAtrNStop,且參數依然使用1.5
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5}
依然使用風險控制止損策略AbuFactorPreAtrNStop,且參數依然使用1.5
依然使用利潤保護止盈策略AbuFactorCloseAtrNStop,且參數依然使用1.5
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
另外一點關於比特幣,萊特幣市場還有一點特殊便是買入數量非整數,精確到小數點後三位,最少交易數量爲0.01個幣,以下顯示交易單的buy_cnt所示:
abu_result_tuple.orders_pd.buy_cnt
2013-09-29 968.117 2013-09-29 968.117 2013-10-10 937.465 2013-10-12 934.364 2013-10-21 596.213 2013-10-30 275.019 2013-11-03 372.791 2013-11-15 104.432 2013-11-15 104.432 2013-11-28 33.106 ... 2017-06-07 16.361 2017-06-07 964.902 2017-06-17 908.975 2017-06-20 718.460 2017-06-22 20.591 2017-06-24 23.401 2017-07-04 721.415 2017-07-05 726.382 2017-07-21 18.441 2017-07-22 18.385 Name: buy_cnt, dtype: float64
更多關於abu量化系統請關注微信公衆號: abu_quant