SimonS's Algo
首发于SimonS's Algo

从零开始数字货币量化交易

作为一个数字货币小白,最近准备开始接触这块的量化交易,主要考虑的还是统计套利方向,虽然利润不高但是在数字货币波动这么大的市场,我个人感觉还是有利可图的。

首先当然是要去选择一个市场,目前国内用起来比较方便的应该就是火币和OKCoin,在我同事不断安利下我还是用了火币,手动投了点零花钱进去玩玩,除了这个 USDT 转到交易钱包卡了半天之外别的体验都还不错,火币官方提供的 API 也非常简单明了,所以不如就先拿火币作为我的第一个落脚点。

申请账号和币圈的一些基础知识就不提了,我们可以在这个页面登录后的右上角找到安全中心,去申请一个API KEY:

比特币交易平台_安全的以太坊莱特币比特币交易网-【火币网官网】

这里不填 IP 就是只有 90 天的有效期,一般建议自己租一台 Linux 云服务器,然后把你的外网 IP 填进去,这样以后用起来也会比较省心。

然后我们就可以打开火币的 API Wiki 了:

huobiapi/API_Docs

再顺手git clone一下这份demo:

github.com/huobiapi/RES

找到你想要用的编程语言(这里以 Python2.7 为例),然后把你前面申请的 KEY 填进去,激动地搓搓小手赶紧调用一下看看能不能拿到行情数据:

res = HuobiService.get_kline('ltcusdt', '15min', 5)

这里传3个参数进去,第一个symbol表示你要查的币及换算的法币,规则是「基础币种+计价币种」,如这里LTC/USDT就用ltcusdt来表示,第二个参数就是K线的period,第三个参数是size,单次最大请求为2000个。

调用成功,快来看看这个res里都有啥:

(Pdb) res.keys()
[u'status', u'ch', u'data', u'ts']
(Pdb) res['status']
u'ok'
(Pdb) res['ch']
u'market.ltcusdt.kline.15min'
(Pdb) res['ts']
1515469720884
(Pdb) res['data']
[{u'count': 108, u'vol': 58190.589664, u'high': 253.97, u'amount': 229.6306, u'low': 252.55, u'close': 253.12, u'open': 253.19, u'id': 1515469500}, {u'count': 339, u'vol': 272718.0327174751, u'high': 255.99, u'amount': 1070.3096582502249, u'low': 252.51, u'close': 253.18, u'open': 254.58, u'id': 1515468600}, {u'count': 356, u'vol': 408287.671812, u'high': 255.69, u'amount': 1604.580468170995, u'low': 253.78, u'close': 254.92, u'open': 254.58, u'id': 1515467700}, {u'count': 117, u'vol': 106373.02227, u'high': 254.85, u'amount': 419.6148544480732, u'low': 253.11, u'close': 254.63, u'open': 253.55, u'id': 1515466800}, {u'count': 168, u'vol': 124366.27545, u'high': 254.48, u'amount': 490.4057567470356, u'low': 251.99, u'close': 253.58, u'open': 252.2, u'id': 1515465900}]

关于data中的内容,可以参考文档中的说明:

"data": [
{
    "id": K线id,
    "amount": 成交量,
    "count": 成交笔数,
    "open": 开盘价,
    "close": 收盘价,当K线为最晚的一根时,是最新成交价
    "low": 最低价,
    "high": 最高价,
    "vol": 成交额, 即 sum(每一笔成交价 * 该笔的成交量)
  }
]

有了行情数据,我们就可以把这些数据给可视化出来,matplotlib中有一个 finance 库可以直接用来画K线,方法也很简单,对获取数据稍作调整即可:

import datetime
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib.pylab import date2num

data_list = []
# 操作上一步中获取到的data
for block in res['data']:
    dt = datetime.datetime.utcfromtimestamp(block['id']) + datetime.timedelta(hours=8)
    # mpf库中要求的顺序是:时间、开盘价、最高价、最低价、收盘价
    data_list.append((date2num(dt), block['open'], block['high'], block['low'], block['close']))

fig, ax = plt.subplots()
ax.xaxis_date()
ax.set_title('LTC/USDT')
mpf.candlestick_ohlc(ax,data_list,colorup='green',colordown='r',width=0.005)
plt.grid()
plt.show()

真的是太方便了,我们还可以把 BTC/USDT 和 LTC/USDT 再配合成交量绘在同一个画板里,就留给大家做练习了。

昨晚测试接口的时候看见 LTC 跌到245了,顺手挂了一个230的买单做测试,这不一觉醒来又涨回到了250+,你们看学习还是有回报的!


大家感兴趣的话可以先熟悉一下 API 的使用,下期再做近年来关于数字货币的风险量化分析,再撸一个简单的回测系统出来玩,便于以后的策略定制分析。


建了一个交流微信群,希望是纯技术交流非资讯类的,所以想要入群的同学私信我你的技术背景吧,大佬优先 ~

编辑于 2018-01-09

文章被以下专栏收录