TICK回测二:数据如何存储

一、概述

  前一节讲了如何用极星每日批量获取TICK数据,并存到CSV文件,存储格式是:

  【合约编号,时间戳,最新价】

  比如:ZCE|F|AP|112,20211102145321750,8035.0

  交易日11月2日,跑了ZCE全部198个合约,得到了676569条记录,CSV文件25M

  交易日11月3日,跑了ZCE全部198个合约,得到了755613条记录,CSV文件28M

  如果以此类推,一年约需要6600M的空间,3家交易所就是19.8G/年。想想其实也还好,但是不压缩压缩就不高端了是吧,而且上期的品种比较活跃,可能一个顶两也说不定,所以我们要考虑数据的压缩和存储。

二、数据压缩

  1、合约编号没必要没必要每一行都写,可以每一个合约整一个目录,这样至少省了1/3的空间了

  2、日期也没必要每一行都写,年月日也是可以用目录的形式,存行情的文件只需要写时分秒+最新价即可

  那么下图中的存储方式应该就是兼具实用和压缩的最佳解了,测试了一下最终数据大小是12.8M,有效压缩了不少。

  3、进一步压缩(经典办法)

  可以看到,除了数值外,时间是会一直重复出现的数,而且占了9位。最经典的压缩方法就是将两两数字映射成一个ASCII字符,比如

    0 - 9 = 0 - 9

    a - z = 10 - 35

    A - Z = 36 - 61

  时间显示中,最多24小时、60分钟、60秒,所以14时05分52秒可以映射成e5Q这样的字符,妥妥的缩小了1倍空间。

  接着我们看毫秒位只显示了000、250、500、7500四种情况,所以也可以简单映射下000=A、250=B、500=C、750=D。

  于是14时05分52秒750毫秒就映射成了e5QD,字符串的宽度由9位变成了4位超过50%的压缩比,实测了一下最终大小是8.68M。

  

  4、继续压缩(差值法)

  我们可以注意到,行情的数值经常是重复且连续的,像下图这样,就是重复的4个数值。同时772.0完全可以理解为772.2-0.2,那么我们能不能用前后差值的办法来进一步压缩数据呢。

    比如像下图这样,对于数值越大的效果越明显。

  实测结果是6.95M,效果不错。

  5、用差值法来压缩时间

  前面用差值法来压缩数字效果很好,如果时间也用差值法是否可行呢?我们试试看。

  可能需要做一些调整,首先不能用年月日时分秒这样的时间格式,得用时间戳,不然不好做减法对吧。其次毫秒位要单独拉出来继续按ABCD映射,因为本来就只占一位,没必要搞什么减法了。但前面时间戳的差值位数不好说,所以可以将毫秒位映射的字母放在最前面。大概是下面这个意思:

  2021-11-06 14:55:27.250  ->   B1636181727

  2021-11-06 14:55:28.500  ->   C1

  2021-11-06 14:55:29.000  ->   A1

  实测结果是5.64M,效果并不明显,而且往回转的时候比较麻烦,所以时间还是用ASCII码来压缩。

三、总结

  最终我采用了时间用ASCII码映射的办法,数值部分用差值法,总体压缩率在25%左右,还算是有一点用处。

  还有没有进一步压缩的空间呢?有的,但是没有必要的,一家交所全部合约,一天的数据不到7M,够了,就算再压缩一倍到3.5M,没有意义了,不是数量级的差异。

原文地址:https://www.cnblogs.com/cation/p/15506884.html