You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类开发,示例代码如下:
    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')
    
    之后在Broker类的初始化代码中,将原NYSE日历的调用替换为这个Forex24hCalendar。

2. 直接绕过日历校验逻辑

不想修改源码的话,可在策略层面强制控制时间推进:

  • 关闭Lumibot的自动时间跳跃机制,让回测遍历每一根K线数据。比如修改策略的on_trading_iteration方法,确保每次迭代都处理当前分钟的数据,而非跳转到“下一个市场开放时间”。
  • 尝试在初始化回测时,将market_hours参数设为None(若框架支持),直接跳过市场时间校验。

3. 修改源码默认日历设置

找到broker.py中初始化日历的代码块,直接将默认的NYSE替换为自定义的24小时日历,甚至可以移除日历校验逻辑,让回测连续运行所有K线时段。

注意事项

  • 修改源码后,若为全局安装的Lumibot,需重新安装或确保修改后的文件在Python路径中优先加载。
  • 自定义日历需注意时区问题,外汇市场建议使用UTC时区,避免时区转换导致的时间错位。
  • 回测的K线数据时间范围要与自定义日历匹配,避免出现数据和时段不对应的情况。

内容的提问来源于stack exchange,提问作者whoistari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:42:14