rqalpha分钟数据的解析

本文探讨了RQAlpha开源版对于分钟数据的支持问题,详细分析了数据格式、索引结构及事件驱动机制,旨在为高频交易策略提供数据处理方案。

rqalpha开源版不支持分钟数据,在此研究一下。
要想将分钟数据放入系统需解决几个问题:

1、数据格式(存储和加载)

2、数据获取后怎样完成若干分钟一次的事件

3、公式如何像获取日线一样获取到分钟数据

数据格式:
主表:_table:内容数据, ctable类型
类型为:

[('date', '<u4'), ('time', '<u4'), ('open', '<u4'), ('close', '<u4'), ('high', '<u4'), 
('low', '<u4'), ('total_turnover', '<u8'), ('volume', '<u4'), ('limit_up', '<u4'), 
('limit_down', '<u4')]

数据类似于:

[(20050104, 93100, 16668, 16617, 16668, 16592, 99470, 59700, 18337, 14999)
 (20050104, 93200, 16617, 16617, 16617, 16592, 70955, 42700, 18337, 14999)
 (20050104, 93300, 16592, 16567, 16592, 16567, 85291, 51398, 18337, 14999)
 ...
 ]

索引表:_index_table, 看起来是按日期存储的索引, ctable类型
类型为:

[('date', '<u4'), ('start_at', '<u4'), ('end_at', '<u4')]

数据类似于:

[(20170221, 1383237840, 1383238080)
(20170222, 1383238080, 1383238320)
(20170223, 1383238320, 1383238560)
...
]

索引的索引表:_index_index, dict类型, 数据类似于:

{'000617.XSHE': [3638, 6653], '603779.XSHG': [3149315, 3149571],...}

解码时先从_index_index开始,获取到每一只股票在内存中的区域:

s, e = self._index_index[code]  ### s:3638, e:6653
date_day = self._index_table.cols['date'][s:e]  ### data_day:[20050104,20050105,...]
start_at = self._index_table.cols['start_at'][s:e]  ### start_at:[143412960,143413200,143413440,...]
end_at = self._index_table.cols['end_at'][s:e]  ### end_at:[143413200,143413440,143413680,...]
self._index[key] = {}
for i in range(0, len(date_day)):
    self._index[code][date_day[i]] = [start_at[i], end_at[i]]  #  _index['000617']={20050104:[143412960,143413200]}, 每个日期为一个key,后面标记在表的内存地址

判断开始时间和结束时间通过

def available_data_range(self, frequency):
	"""
	返回的是两个日期,精确到天,类似这样的值(date)2015-01-04,(date)2019-11-21
	"""
    if frequency in ['tick', '1d', '1m']:
        s, e = self._day_bars[self.INSTRUMENT_TYPE_MAP['INDX']].get_date_range('000001.XSHG')
        return convert_int_to_date(s).date(), convert_int_to_date(e).date()
    raise NotImplementedError

完成

事件驱动

在executor.py中的run函数
这一段代码:

for event in self._env.event_source.events(start_date, end_date, frequency):
    if event.event_type in self.KNOWN_EVENTS:
        self._env.calendar_dt = event.calendar_dt
        self._env.trading_dt = event.trading_dt

    if event.event_type == EVENT.TICK:
        event_bus.publish_event(PRE_TICK)
        event_bus.publish_event(event)
        event_bus.publish_event(POST_TICK)
    elif event.event_type == EVENT.BAR:
        bar_dict.update_dt(event.calendar_dt)
        event_bus.publish_event(PRE_BAR)
        event.bar_dict = bar_dict
        event_bus.publish_event(event)
        event_bus.publish_event(POST_BAR)
    elif event.event_type == EVENT.BEFORE_TRADING:
        event_bus.publish_event(PRE_BEFORE_TRADING)
        event_bus.publish_event(event)
        event_bus.publish_event(POST_BEFORE_TRADING)
    elif event.event_type == EVENT.AFTER_TRADING:
        event_bus.publish_event(PRE_AFTER_TRADING)
        event_bus.publish_event(event)
        event_bus.publish_event(POST_AFTER_TRADING)
    elif event.event_type == EVENT.SETTLEMENT:
        event_bus.publish_event(PRE_SETTLEMENT)
        event_bus.publish_event(event)
        event_bus.publish_event(POST_SETTLEMENT)
    else:
        event_bus.publish_event(event)

完成了事件驱动
函数 def enents()完成了不同频率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值