量化投资: 第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

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息