zoukankan      html  css  js  c++  java
  • 利用rqalpha完成一个股指期货的回测(二) 分钟数据获取和转换

    前面已经可以简单的跑起来了,只不过是日线级的股票,我们最终目标是5分钟级的期货

    由于平台不支持5分钟数据,因此这些数据需要我们手动解决,分两块,一块是历史数据的获取,一块是实时数据的采集。先搞定历史数据。

    目前看通达信的数据还算是比较靠谱的。股指期货主要有IF,IC,IH三个,以IF为例,由于通常我们要的数据比较多一点,通常是1年以上而非1个月,因此用主连IFL8

    一、获取数据:

    image

     
    点击下载即可,
    然后利用通达信的导出功能:
    image
     
     然后打开数据看一下:
    image

    考虑到后期各种处理,因此最好还是将这些数据存于数据库中,存好后形如:

    image

    二、转换数据

    顺便说一下,通达信上的数据IFL8是完全按照各主力合约拼接而成,通过下载期货合约的实时行情数据进行合并成5分钟数据,然后与主力合约K线的开高低收量及持仓进行对比,基本上没有什么误差。

    当然,之前的历史数据从通达信上获取,后面的数据以及动态生成的历史有能力的还是从实时行情生成为好。毕竟股指期货一个点就是200或300块,随便搞一手就是几万的盈亏,数据还是用自己的安心点。

    由于rqalpha没有提供分钟级数据,因此我们要将获取的数据转成rqalpha识别的数据ndarray

    先看ndarray的数据类型:

    dtype = np.dtype([('date', '<u4'), ('time', '<u4'), ('open', '<u4'),
                              ('close', '<u4'), ('high', '<u4'), ('low', '<u4'),
                              ('limit_up', '<u4'), ('limit_down', '<u4'), ('basis_spread', '<i4'),
                              ('open_interest', '<u4'), ('volume', '<u4'), ('total_turnover', '<u8'),
                              ('trade_date', '<u4')])

    这里需要注意的是,open,high,low,close这四个值在rqalpha都是扩大了10000倍的,因此,这儿转换时需要先乘上10000

    然后将之存于一个list中

    values.append((ft.date, ft.time, ft.open, ft.close, ft.high, ft.low,
                                       0, 0, 0, 0, ft.volume, 0, ft.date))

    最后将之转成ndarray类型数据:

    result = np.array(values, dtype=dtype)

    rqalpha的数据存成bcolz格式,我们依照着存,由于是5分钟,我们取名为:

    futures_5mb.bcolz和futures_5mb_index.bcolz

    其中5mb.bcolz存储的为真正的数据,index.bcolz为按天存储的数据索引。

    存储时按每支票存成一个result,然后通过代码 arr = DataFrame(result, columns=fields) 将之转换成DataFrame存成bcolz格式数据。

    接着存储索引futures_5mb_index.bcolz, 这个数据中存两个量,line_map表示每支票存了多少天的数据, mb_index_list表示存的各支票每一天的数据是从哪儿存到哪儿。

    这儿有一个函数比较重要:calc_mb_indexs,计算每一天的数据具体存在表的哪些区域:

    def calc_mb_indexs(cls, date_dict, mb_index_list, base_index):
            s, e = base_index, base_index
            for date in date_dict.keys():
                e += date_dict[date]
                mb_index_list.append([date, s, e])
                s = e
            return e

    如果存的是第0个品种数据,base_index为0,否则把前面的base_index计算出来作为当前品种的初始值,比如后面列举的IF88的初始值为:808*48=38784,IF2005的初始值为1616*48=77568

    举例如下:

    mb_index_list转成DateFrame图:

    index_df = pd.DataFrame(data=mb_index_list, columns=['date', 'start_at', 'end_at'])

    image

    line_map数据:

    image

    这样就清楚了,IFL8存了808天数据,每天数据存了48条(1天交易时间4小时即240分钟,我们存的为5分钟数据,即240/5=48),一共存了808*48=38784条数据

    下面是futures_5mb存储表示:

    image

    image

  • 相关阅读:
    SVN的学习
    IIS 503 错误
    Windows系统CMD下常用命令
    Linux基础整理
    JavaEESSM框架配置文件
    JavaXML整理
    Java反射、反射练习整理
    Java网络通信协议、UDP、TCP类加载整理
    Java多线程、线程池和线程安全整理
    JavaProperties类、序列化流与反序列化流、打印流、commons-IO整理
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/12796825.html
Copyright © 2011-2022 走看看