作为一个关注加密货币市场超过一年的金融人,我来介绍一下现在币圈所谓量化交易平台的现状:
- 现在所谓的币圈量化基本上还是程序员在弄,正经的金融工程狗还没有进入这个圈子,如果你想找Quantopian,RiceQuant那样的回测平台,是没有的。现在的币圈量化产品也因此基本停留在trading bot的阶段(自带简单的technical analysis/ML/arbitrage驱动),不支持复杂策略的历史回测,他们做的产品不是从金融理论和严谨的金融逻辑出发的,更多是本能般地痴迷于自动化和炫技,大都是forward looking的黑盒子,不注重历史数据的积累。(Zenbot,Gekko,BotVS皆属于这一类)
- 在量化回测领域,你不能不提Zipline,就像你买电脑时,不是Intel的芯会让你犹豫再三一样,backtester不是zipline的量化回测平台,我是信不过的。那么币圈有没有内核是zipline的量化回测平台呢,是有的
- 阿布量化(应该是用了Zipline内核,百度数据部门的程序员弄的,非常自恋,每个函数的命名都以自己的名字开头,涵盖所有市场百科大全式的回测平台,加密货币市场只有比特币和莱特币的历史数据,数据种类和时间范围都有限,在未来也不一定会维护数据库。阿布很努力,技术很牛,可产品不了解真实需求,缺乏金融逻辑,是Data Science和Computer Science视角的人做出来的。)
- 微宽网(火币弄的,但是很早就不再维护了,现在网页已经打不开了)
当然还有一种可能性,就是在本地部署Zipline模块,自己找数据,清理数据,自己回测自己的策略,这是现在唯一靠谱可行的办法,代码如下。
因为赞比较多,在这里特地声明一下,本文中的代码我不是原创作者,是转自http://Pythonprogramming.net,我只是参考了他的教程,那里详细的介绍了如何在本地部署zipline及整理数据,我非常感谢原代码作者Sendtex
- import jupyterthemesfrom jupyterthemes import jtplotjtplot.style(theme='grade3')jtplot.style(context='poster', fscale=1.4, spines=False, gridlines='--')jtplot.style(ticks=True, grid=True, figsize=(16, 9))import pandas as pdfrom collections import OrderedDictimport pytzfrom zipline.api import order, record, symbol, set_benchmark, order_target_percent, get_open_ordersfrom zipline.utils.calendars.exchange_calendar_twentyfourhr import TwentyFourHRimport ziplineimport matplotlib.pyplot as pltfrom datetime import datetimedef initialize(context): set_benchmark(symbol("BTC"))def handle_data(context, data): slowma = data.history(symbol("BTC"), fields='price', bar_count=50, frequency='1m').mean() fastma = data.history(symbol("BTC"), fields='price', bar_count=10, frequency='1m').mean() if fastma slowma: if symbol("BTC") not in get_open_orders(): order_target_percent(symbol("BTC"), 0.96) record(BTC=data.current(symbol('BTC'), fields='price'))data = OrderedDict()data['BTC'] = pd.read_csv("BTC-USD.csv")data['BTC']['date'] = pd.to_datetime(data['BTC']['time'], unit='s', utc=True)data['BTC'].set_index('date', inplace=True)data['BTC'].drop('time', axis=1, inplace=True)data['BTC'] = data['BTC'].resample("1min").mean()data['BTC'].fillna(method="ffill", inplace=True)data['BTC'] = data['BTC'][["low","high","open","close","volume"]]print(data['BTC'].head())panel = pd.Panel(data)panel.minor_axis = ["low","high","open","close","volume"]panel.major_axis = panel.major_axis.tz_localize(pytz.utc)print(panel)perf = zipline.run_algorithm(start=datetime(2018, 2, 7, 0, 0, 0, 0, pytz.utc), end=datetime(2018, 3, 26, 0, 0, 0, 0, pytz.utc), initialize=initialize, trading_calendar=TwentyFourHR(), capital_base=10000, handle_data=handle_data, data_frequency ='minute', data=panel)``` low high open close \ date 2018-02-05 17:48:00 7170.000000 7171.000000 7170.000000 7170.990234 2018-02-05 17:49:00 7131.990234 7171.000000 7170.990234 7131.990234 2018-02-05 17:50:00 7120.000000 7137.359863 7132.000000 7120.020020 2018-02-05 17:51:00 7113.000000 7121.000000 7120.040039 7113.000000 2018-02-05 17:52:00 7113.000000 7122.000000 7113.000000 7121.990234 volume date 2018-02-05 17:48:00 3.425961 2018-02-05 17:49:00 5.209975 2018-02-05 17:50:00 14.767619 2018-02-05 17:51:00 18.237879 2018-02-05 17:52:00 22.768671 Dimensions: 1 (items) x 72277 (major_axis) x 5 (minor_axis) Items axis: BTC to BTC Major_axis axis: 2018-02-05 17:48:00+00:00 to 2018-03-27 22:24:00+00:00 Minor_axis axis: low to volumeperf.portfolio_value.pct_change().fillna(0).add(1).cumprod().sub(1).plot(label='BTC Momentum Strategy')perf.BTC.pct_change().fillna(0).add(1).cumprod().sub(1).plot(label='Benchmark:BTC')plt.legend(loc=2)plt.ylabel('Cumulative Return')plt.title('Momentum AlgoTrading with BTC')plt.show()
复制代码
|