Lumibot的PandasDataBacktesting依赖pandas_market_calendars是否阻碍24小时外汇回测?
Lumibot外汇24小时回测:解决时间跳跃、错过信号的问题
问题根源
Lumibot默认依赖pandas_market_calendars提供的交易所日历(比如NYSE)控制回测时间推进,但外汇属于24小时连续交易市场,该库没有对应的日历选项。导致回测仅在NYSE的9:30-16:00时段运行,其余时间直接跳过时点,70%的交易信号被遗漏,日志里的“Market opens in XX seconds”就是这个逻辑的体现。
可行的解决办法(并非架构根本性限制)
1. 自定义24小时无休日历
直接修改Lumibot的日历逻辑,编写覆盖全年所有分钟时段的自定义日历:
- 找到
lumibot/brokers/broker.py,将默认的NYSE日历替换为自定义实现。可以基于pandas_market_calendars的Calendar类开发,示例代码如下:
之后在Broker类的初始化代码中,将原NYSE日历的调用替换为这个from pandas_market_calendars import Calendar import pandas as pd class Forex24hCalendar(Calendar): @property def name(self): return "FOREX" @property def tz(self): return "UTC" # 外汇市场优先用UTC时区,避免时区转换误差 def schedule(self, start_date, end_date): # 生成起始到结束时间内的每分钟时间序列 dates = pd.date_range(start_date, end_date, freq='T', tz=self.tz) schedule = pd.DataFrame({ 'market_open': dates, 'market_close': dates + pd.Timedelta(minutes=1) }) return schedule.set_index('market_open')Forex24hCalendar。
2. 直接绕过日历校验逻辑
不想修改源码的话,可在策略层面强制控制时间推进:
- 关闭Lumibot的自动时间跳跃机制,让回测遍历每一根K线数据。比如修改策略的
on_trading_iteration方法,确保每次迭代都处理当前分钟的数据,而非跳转到“下一个市场开放时间”。 - 尝试在初始化回测时,将
market_hours参数设为None(若框架支持),直接跳过市场时间校验。
3. 修改源码默认日历设置
找到broker.py中初始化日历的代码块,直接将默认的NYSE替换为自定义的24小时日历,甚至可以移除日历校验逻辑,让回测连续运行所有K线时段。
注意事项
- 修改源码后,若为全局安装的Lumibot,需重新安装或确保修改后的文件在Python路径中优先加载。
- 自定义日历需注意时区问题,外汇市场建议使用UTC时区,避免时区转换导致的时间错位。
- 回测的K线数据时间范围要与自定义日历匹配,避免出现数据和时段不对应的情况。
内容的提问来源于stack exchange,提问作者whoistari
相关产品推荐
相关产品推荐

