量化投資: 第10節 比特幣, 萊特幣的回測

阿布量化版權全部 未經容許 禁止轉載html

abu量化系統github地址(歡迎+star)python

本節ipython notebookgit

上一節講解的是港股市場的回測,以及使用AbuTLine.show_least_valid_poly優化策略,提升系統的穩定性,本節主要示例比特幣與萊特幣的走勢分析與回測。github

1. 比特幣, 萊特幣的走勢數據分析

abupy內置沙盒數據中:安全

  • 比特幣的數據是從2013-09-01至2017-07-26
  • 萊特幣的數據是從2014-03-19至2017-07-26

不少人說作幣類市場更容易,由於整個市場就兩個能作的票,比特幣,萊特幣,可是真的是這樣嗎?微信

量化策略失敗結果的人工分析,是對策略結果影響很是大的一個環節,可是在失敗結果分析前,對交易目標的歷史數據進行
分析也是對策略結果影響很是大的一個環節,經過觀察交易目標,分析價格走勢,趨勢的分佈,策略的適配度,以至生成定製針對交易目標的特定策略都是在這個環節中涉及的,本文不涉及與交易牽扯過深的知識,本節只示例一些簡單的數據分析以及可視化分析技巧。機器學習

首先使用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統計交易日震盪幅度能夠發現:

  • 無論周幾,每一天的比特幣的震盪幅度不論是最近一年仍是以前的走勢都大概在天天5%上下
  • 無論周幾,每一天的萊特幣的震盪幅度不論是最近一年仍是以前的走勢都大概在天天6%上下
ABuKLUtil.date_week_wave({'btc': btc, 'btc365':btc365, 'ltc':ltc, 'ltc365':ltc365})

下面統計週期內的上漲均值,下跌均值,以及數量,比值:

使用ABuKLUtil.p_change_stats能夠發現:

  • 比特幣最近一年日漲跌幅度呈現穩定趨勢:(up:2.615->2.264↓, down:-2.422->-2.135↓)
  • 比特幣最近一年的大趨勢並非天天的大幅拉昇:日平均漲跌比1.080->1.061↓,而是上漲的交易日遠大於下跌的數量:上漲下跌數量比1.183->1.411↑
  • 萊特幣最近一年日漲跌幅度呈現趨勢上升:(up:3.275->3.645↑, down:-2.773->--2.421↓)
  • 萊特幣最近一年的大趨勢是天天的大幅拉昇:日平均漲跌比1.181->1.5051↑,上漲的交易日遠大於下跌的數量:上漲下跌數量比0.980->1.151↑
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查看天天的漲跌機率:

  • 比特幣週一週二週五上漲機率都接近60%,週六下跌機率大,且最近一年更是週一到週五天天都有接近60%上漲機率
  • 萊特幣上漲機率大於下跌機率最近一年,以前無明顯套利模式
ABuKLUtil.date_week_win({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})

使用ABuKLUtil.date_week_mean查看天天的帶正負的漲跌mean:

  • 萊特幣最近一年平均都爲正,且最大週三週四有1以上
  • 比特幣一直以來的數據都顯示週一週二具備安全的套利空間
ABuKLUtil.date_week_mean({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})

下面使用ABuKLUtil.p_change_bcut_vc統計:

  • 比特幣和萊特幣最頻繁區間是(-3, 0], (0, 3]
  • 比特幣和萊特幣在(-inf, -10]和(10, inf]的分佈都有1%以上,萊特幣(-inf, -10]:0.0228有2%以上,屬於危險交易品種
ABuKLUtil.bcut_change_vc({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})

上面使用bcut_change_vc沒法知道(-inf, -10]和(10, inf]的正無窮與無窮的具體數值,使用qcut_change_vc:

  • 比特幣loss10: [-26.895, -3.284] , top10:(4.182, 38.786]
  • 比特幣最近一年風險降低:loss10: [-16.273, -2.783], top10:(3.948, 15.22]
  • 萊特幣loss10: [-28.48, -4.1], top10:(4.405, 41.083]
  • 萊特幣最近一年繼續呈現高風險loss10:[-22.823, -3.229] 高收益top10:(5.0606, 37.505]
ABuKLUtil.qcut_change_vc({'btc': btc, 'btc365': btc365, 'ltc': ltc, 'ltc365': ltc365})

上面經過數據的轉換分析對比特幣,萊特幣進行了分析,下面經過可視化對比特幣,萊特幣進行分析

2 比特幣, 萊特幣的走勢可視化分析

下面封裝一個函數使用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)

經過上面的數據分析和可視化分析,對比特幣使用和以前策略相同的參數和策略組合和參數分配實際上是不合適的,由於幣類市場的振幅實在是太大,並且走勢分佈混亂,止盈止損的設定也並不清晰,實際上最適合的量化策略是作一些統計套利策略,關於高頻統計套利相關策略,會在以後的章節使用比特幣,萊特幣作爲示例。

下面咱們本節先無論回測結果如何,先和以前使用的策略同樣的狀況下進行回測示例。

3. 比特幣,萊特幣市場的回測

與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作爲參數:

  • start='2013-09-01'
  • end='2017-07-26'

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量化文檔目錄章節

  1. 擇時策略的開發
  2. 擇時策略的優化
  3. 滑點策略與交易手續費
  4. 多支股票擇時回測與倉位管理
  5. 選股策略的開發
  6. 回測結果的度量
  7. 尋找策略最優參數和評分
  8. A股市場的回測
  9. 港股市場的回測
  10. 比特幣,萊特幣的回測
  11. 期貨市場的回測
  12. 機器學習與比特幣示例
  13. 量化技術分析應用
  14. 量化相關性分析應用
  15. 量化交易和搜索引擎
  16. UMP主裁交易決策
  17. UMP邊裁交易決策
  18. 自定義裁判決策交易
  19. 數據源
  20. A股全市場回測
  21. A股UMP決策
  22. 美股全市場回測
  23. 美股UMP決策

更多阿布量化量化技術文章

更多關於abu量化系統請關注微信公衆號: abu_quant

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息