阿布量化版权全部 未经容许 禁止转载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