Pandas A栏> B,与Zipline进行交易

时间:2014-09-04 17:14:59

标签: python pandas zipline

我试图回溯测试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

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

0 个答案:

没有答案