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

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/12796825.html
Copyright © 2011-2022 走看看