PyAlgoTrade:多合约用resampleBarFeed重采样报错求助
解决PyAlgoTrade多合约重采样时的时间戳重复错误
错误原因分析
你遇到的Bar date times are not in order错误,是因为重采样后的BarFeed中出现了重复时间戳的条目。PyAlgoTrade的BarFeed默认要求时间戳严格递增,当检测到当前Bar的时间戳等于上一个时就会抛出异常。多合约场景下,直接用全局重采样器会把不同合约的Bar混在一起处理,容易触发这个问题。
有效解决方案
方案1:为每个合约单独重采样再合并
避免多合约共用一个重采样器,而是为每个合约单独创建重采样Feed,最后合并成一个复合Feed,确保时间戳有序:
from pyalgotrade import strategy, bar, barfeed class MyStrategy(strategy.BaseStrategy): def __init__(self, instruments, feed, brk): super().__init__(feed, brk) self.__position = None self.__instruments = instruments self._resampledBF = barfeed.CompositeBarFeed() # 逐个合约处理重采样 for inst in instruments: # 提取单个合约的原始数据Feed single_inst_feed = barfeed.BarFeed(bar.Frequency.MINUTE) single_inst_feed.addBarsFromFeed(inst, feed) # 对单个合约重采样 resampled_feed = self.resampleBarFeed( 2 * bar.Frequency.MINUTE, self.resampledOnBar_2minute, instrument=inst ) # 添加到复合Feed self._resampledBF.addFeed(resampled_feed) self.info("策略初始化完成") def resampledOnBar_2minute(self, bar_2min): # 你的2分钟Bar处理逻辑 pass
方案2:修改PyAlgoTrade源码放宽时间戳检查
如果允许修改库源码,可以调整BarFeed的时间戳校验逻辑,允许同一时间戳的多合约Bar存在:
- 找到PyAlgoTrade安装目录下的
pyalgotrade/barfeed/__init__.py - 定位到
getNextValues方法中的时间戳检查代码:if dateTime <= prevDateTime: raise Exception(f"Bar date times are not in order. Previous datetime was {prevDateTime} and current datetime is {dateTime}") - 将判断条件修改为:
这样仅当时间戳倒退时才抛出异常,同一时间戳的多个Bar会被正常处理。if dateTime < prevDateTime: raise Exception(f"Bar date times are not in order. Previous datetime was {prevDateTime} and current datetime is {dateTime}")
方案3:预处理原始Feed确保时间戳严格有序
如果原始Feed中存在同一时间戳的多合约Bar,先对所有Bar按「时间戳+合约代码」排序,再传入策略:
# 预处理原始Feed sorted_bars = [] for inst in instruments: bars = feed.getBars(inst) sorted_bars.extend([(bar.getDateTime(), inst, bar) for bar in bars]) # 按时间戳升序,时间戳相同则按合约代码升序排序 sorted_bars.sort(key=lambda x: (x[0], x[1])) # 重新构建有序的Feed new_feed = barfeed.BarFeed(bar.Frequency.MINUTE) for dt, inst, bar in sorted_bars: new_feed.addBar(inst, bar) # 用处理后的Feed初始化策略 my_strategy = MyStrategy(instruments, new_feed, broker)
关于谷歌群组方案的适用性
你提到的「替换IB时间戳」方案仅针对IB数据源的时间戳重复问题,如果你的原始Feed并非来自IB,这个方案可能不适用。优先尝试上面的3种方案,尤其是方案1,它是多合约重采样场景下最稳妥的做法。
内容的提问来源于stack exchange,提问作者user19942592
相关产品推荐
相关产品推荐

