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

求助:基于backtesting.py实现时间触发平仓的代码修正

问题修正:backtesting.py实现15:15时间触发平仓

错误原因分析

  1. 时间获取时机错误:init()方法仅在回测初始化时执行一次,你在这里获取self.data.index得到的是整个数据集的时间索引数组,而非当前回测到的单根K线时间,导致self.hourNow和self.minuteNow是数组而非单值,无法用于条件判断。
  2. 当前时间取值错误:若直接用self.data.index[-1],会始终取数据集最后一根K线的时间,而非回测过程中当前正在处理的K线时间。

修正后的代码

class SmaCross(Strategy):
    # 定义两个均线参数(可后续优化)
    n1 = 10
    n2 = 20
    
    def init(self):
        # 预计算两条移动平均线
        self.sma1 = self.I(SMA, self.data.Close, self.n1)
        self.sma2 = self.I(SMA, self.data.Close, self.n2)

    
    def next(self):
        # 获取当前正在处理的K线时间
        current_datetime = self.data.index[self.data._i]
        hour_now = current_datetime.hour
        minute_now = current_datetime.minute
        
        # 15:15触发平仓
        if hour_now == 15 and minute_now == 15:
            self.position.close()
            
        # SMA金叉:平空开多
        if crossover(self.sma1, self.sma2):
            self.position.close()
            self.buy()

        # SMA死叉:平多开空
        elif crossover(self.sma2, self.sma1):
            self.position.close()
            self.sell()

bt = Backtest(symbol, SmaCross, cash=10_000, commission=.002)
stats = bt.run()

关键说明

  • 在next()方法中通过self.data._i获取当前回测的K线索引,进而拿到对应时间,确保每次循环都处理当前K线的时间。
  • 条件判断改为hour_now == 15 and minute_now == 15,精准匹配15:15的时间点,避免提前触发(比如15:00的K线会满足hour>=15但不是目标时间)。
  • 保留原有的均线交叉交易逻辑,仅修正时间触发平仓的部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:43:08