我试图回溯测试Zipline的财务理念时遇到了问题。
我得到的是在第一列数据['SPY']中收取SPY的价格,以及“自制”信号数据['Signal']。信号的作用类似于移动平均线,低于或高于数据['SPY']。
data = pd.read_csv('data.csv', index_col='Date', parse_dates=True)
现在交易逻辑不起作用,因为如果我理解正确,pandas不会按行进行计算,而是立即计算整个数据集。
def handle_data(self, data):
if data['SPY'] - data['Signal'] > 0:
self.order('SPY', 1)
else:
self.order('SPY', -1)
上面的非工作代码表达了我想要执行的逻辑 - 如果SPY>然后信号买入,如果相反则卖出。我已经尝试了各种迭代,但却无法使其正常工作。
任何可以帮助挣扎的业余交易员出去的人?
#我设法得到了更多。我需要做的是在我的数据框中添加一个“转换”,在这种情况下是移动平均线。由于我不想实际使用移动平均线,我将天数设置为1,这实际上应该意味着我使用原始数字。
class Test(TradingAlgorithm):
def initialize(self):
self.add_transform(MovingAverage, 'dummy', ['price'], window_length=1) # The moving average that I don't really want to utilize.
self.pos_long = False
self.pos_short = False
def handle_data(self, data):
if data['SPY'].dummy['price'] >= data['Signal'].dummy['price'] and not self.pos_long:
self.order('SPY', 100)
self.pos_long = True
self.pos_short = False
elif data['SPY'].dummy['price'] <= data['Signal'].dummy['price'] and not self.pos_short:
self.order('SPY', -100)
self.pos_long = False
self.pos_short = True
上面的代码几乎完全符合我的要求,唯一的怪癖是由于某种原因它不会占用任何空头头寸。但它至少是朝着正确方向迈出的一步,并可能帮助其他人。
以下这两个链接帮助我解决了这个问题。
http://zipline.readthedocs.org/en/latest/zipline.transforms.html