昨晚大饼二饼的这一波行情来得真是及时,好久没有这么顺畅的趋势了。

这次说说如何使用 B 安的逐笔历史交易记录。

B安官方已经把很多交易数据共享了出来。有 Github 页面可以详细查看有哪些类别的数据以及如何下载。我这里主要介绍聚合交易记录 aggTrades 的下载、整理和使用。

aggTrades 就是聚合之后的逐笔交易记录,也就是币安把连续的几笔在同一时间、同一方向、同一价位成交的交易聚合成一笔记录,类似 k 线的一根,但是只有一个价格,没有最高最低价之类。比如盘口挂了一笔大单,很多小订单去吃它,那么这些在很短时间内(毫秒级)同时到达的订单,就会被聚合在一起。或者可能就是撮合引擎一次能够撮合的订单。

aggTrades 数据的好处就是可以有毫秒级别的交易记录,但是又不像纯逐笔 trades (就是最原始的数据,没有按照同一价格聚合)记录那样大的数据量,是一个不错的高频数据折中方案。

一般就是准高频策略使用这样的聚合数据。那些真正的高频一般都是用 trades 以及加上 orderbook 的数据,数据量非常大,处理起来也很不方便,如果用不上就没有必要。不仅消耗资源,也增加编程的难度。

aggTrades 的用处可以是用来合成任意级别的短 k 线,例如 5、10、15 秒的短 k 线,这样的 k 线用来做一些日内交易策略也还是有可能的。

譬如下面是之前贴过的 1 秒级别 k 线。

图片

还有高频套利,现在普通套利已经很难赚钱了,非常卷,频率高一点的话可能还有些许机会。

这种逐笔数据还可以用来合成另类的 k 线,例如等量 bar 之类的,用 aggTrades 比用分钟 k 线合成出来要精确得多,这样做出来的 CTA 策略可能和普通 k 线策略比较互补。后面几篇我可能会写如何合成这种 bar。

下面就是代码介绍(大部分代码见附件,因为太多太长,就不在正文中贴了)。下载代码是币安的例子,不过稍微有一些改动,还有就是我的加工整理代码。

这里是以月度数据为例(币安也提供了日数据)。代码都是单线程、同步执行,没有搞异步、多线程之类。因为这样的下载都是一个月或者 n 天执行一次,稍微等等就行了,用不着搞得很复杂。

基本的回测用旧一点的数据一般没有什么问题,因为高频数据回测也就主要是起到一些分析作用,主要还是得看实盘,因为滑点可能很大,或者挂单不成交,追单没追到,交易所延迟等等。

不过后面我也有下载即时数据的代码,就是下载当天的 aggTrades 数据,即时验证错过的行情。币安的日数据都是滞后几天才有的。要急着用的话,就得自己用交易所 api 爬取了。

一 下载

第一部分代码就是 agg.py 和 utility.py 两个文件,然后使用

python3 agg.py -y 2022 -m 6 -t um -folder /你的指定路径

这里就是一个下载 2022 年 6 月份的所有永续合约 aggTrades 数据的命令例子。一般十来分钟就可以下载完成。数据下载下来是压缩过的,所以下一步就是解压缩。

二 解压

解压就是使用 unzip.py 这个文件,非常短的代码,就两个函数,一个解压月度数据,一个解压日数据。

zip 文件解压出来之后是 csv 文件。csv 文件的问题是比较占硬盘,而且加载速度会比较慢。所以就是下一步,把 csv 文件转换为 pickle 文件。你可以根据自己的情况压缩和不压缩。如果你硬盘大,建议不用压缩,一般永续数据一个月大概 50GB 左右,所以看自己情况。一般可以买一个速度快一点的外置 SSD 硬盘,现在 1TB 也就几百块,早就白菜价了,回测时加载也挺快。

三 压缩转为 pickle

转换的代码就在 csv_to_pkl.py。如上所述,转换之后更容易保存使用。

转换之后我就是手动把 csv 文件删除,不然占硬盘。这一步就没有代码实现了。之前说了,都是很低频的操作,不用完全自动化。我在例子代码里使用的是 gzip 2 级压缩,一般一个月的数据压缩后也就不到 10GB。

csv 不仅占用空间,加载还慢。建议采用 pickle 格式。综合来看,它的性能不错,关键是兼容性好。如果你要用云服务器,或者很多其他开源包,比 feather 之类更兼容。

好了,到这一步数据就算准备妥当了,可以开始研究策略了。

四 即时数据下载

之前提到,因为币安的数据服务器上的数据都是滞后一两天的。如果你需要验证你的策略在当前的行情下会怎么样,而又没及时上某个币的实盘,那么可以通过下面代码下载回溯到指定时间的 aggTrades。我一般就是用来下载当前 12 小时的数据,看看策略可能的表现会怎样。

下面代码使用的话,需要修改为最近的开始时间。

图片

下载下来的数据是这样。可以对照币安的文档,近期成交(归集)看看他们的具体意义。

图片

有了这样的原始数据,你可以使用 df.resample(bar_size).agg() 把它们聚合成你需要的任何级别 k 线,更随心所欲。

最后

基本上这就是我之前用到的 aggTrades 数据的准备了。现在的策略是越来越卷,使用更细致的数据可以开发更多类别的策略。策略之间互补才是多策略的王道。

如果你需要以上代码,可以联系领取。