首先,我是一个编程的初学者。我一直在开发一个Python算法交易程序,并一直在使用backtesting.py库进行回测。我需要帮助实现基于时间的退出(调用self.position.close()
),例如使用简单的if语句。但是,我在从pandas DataFrame中正确检索数据时遇到了问题。我的数据是在15分钟的时间框架内,我想在15:15退出我的运行交易。我将示例数据存储在名为“symbol”的DataFrame中,并以时间作为索引(例如,2023-04-28 09:15:00+05:30
)。你能帮我实现它在下面的代码?
class SmaCross(Strategy):
# Define the two MA lags as *class variables*
# for later optimization
n1 = 10
n2 = 20
def init(self):
# Precompute the two moving averages
self.sma1 = self.I(SMA, self.data.Close, self.n1)
self.sma2 = self.I(SMA, self.data.Close, self.n2)
#TRYING TO RETRIEVE TIME DATA
self.current_datetime = self.data.index
self.hourNow = self.current_datetime.hour
self.minuteNow = self.current_datetime.minute
def next(self):
if (self.hourNow >= 15 and self.minuteNow >= 15):
self.position.close()
# If sma1 crosses above sma2, close any existing
# short trades, and buy the asset
if crossover(self.sma1, self.sma2):
self.position.close()
self.buy()
# Else, if sma1 crosses below sma2, close any existing
# long trades, and sell the asset
elif crossover(self.sma2, self.sma1):
self.position.close()
self.sell()
bt = Backtest(symbol, SmaCross, cash=10_000, commission=.002)
stats = bt.run()
上面的代码不起作用,因为self.hourNow, self.hourNow
得到了一个值列表。我也试过使用self.current_datetime = self.data.index[-1]
,但它总是使用最后一次而不是测试时间值。
1条答案
按热度按时间ktecyv1j1#
关于documentation:
在
init()
中,整个系列的点都是可用的,而在next()
中,self.data
的长度和所有声明的指示符在每次next()
调用时都被调整,使得array[-1]
(例如,self.data
)的长度和所有声明的指示符都是可用的。self.data.Close[-1]
或self.sma1[-1]
)始终包含最近的值,array[-2]
始终包含前一个值,依此类推。(普通的Python索引升序排序的1D数组)。您需要将这些行移动到
next()
的顶部,因为在那里self.data.index[-1]
是最近的时间,正如您所希望的那样。