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()完成了不同频率

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

被折叠的 条评论
为什么被折叠?



