我在尝试回测 Zipline 的财务想法时遇到问题。
我得到的是第一列数据['SPY'] 中 SPY 的收盘价,以及一个“自制”信号数据['Signal']。该信号类似于移动平均线,低于或高于 data['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 > Signal 然后买入,如果相反则卖出。我尝试了各种迭代,但无法使其工作。
任何人都可以帮助苦苦挣扎的业余交易者吗?
#我设法走得更远。我需要做的是向我的数据框添加一个“转换”,在本例中为移动平均线。由于我不想实际使用移动平均线,因此我将天数设置为 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