1

我在尝试回测 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

http://nbviewer.ipython.org/github/twiecki/financial-analysis-python-tutorial/blob/master/3.%20Backtesting%20using%20Zipline.ipynb

4

0 回答 0