求助:基于backtesting.py实现时间触发平仓的代码修正
问题修正:backtesting.py实现15:15时间触发平仓
错误原因分析
- 时间获取时机错误:
init()方法仅在回测初始化时执行一次,你在这里获取self.data.index得到的是整个数据集的时间索引数组,而非当前回测到的单根K线时间,导致self.hourNow和self.minuteNow是数组而非单值,无法用于条件判断。 - 当前时间取值错误:若直接用
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
相关产品推荐
相关产品推荐

