Python:KeyError'shift'

时间:2013-02-11 10:16:47

标签: python pandas shift zipline

我是Python新手并尝试修改我在此处找到的配对交易脚本:     https://github.com/quantopian/zipline/blob/master/zipline/examples/pairtrade.py

原始脚本旨在仅使用价格。我想使用退货来适应我的模型和投资数量的价格,但我不知道它是怎么做的。

我试过了:

  • 在main中定义一个返回数据框并在运行中调用它
  • 在main中定义一个返回数据框作为全局对象,并在'handle data'中使用需要的地方
  • 直接在句柄数据中定义retuns的数据框

我认为最后一个选项是最合适的但是我的panda'shift'属性出错了。

更具体地说,我尝试将“DataRegression”定义如下:

DataRegression = data.copy()
DataRegression[Stock1]=DataRegression[Stock1]/DataRegression[Stock1].shift(1)-1
DataRegression[Stock2]=DataRegression[Stock2]/DataRegression[Stock2].shift(1)-1
DataRegression[Stock3]=DataRegression[Stock3]/DataRegression[Stock3].shift(1)-1
DataRegression = DataRegression.dropna(axis=0)

其中'data'是一个数据框,其中包含全局定义的price,stock1,stock2和stock3列名。句柄数据中的那些行返回错误:

File "A:\Apps\Python\Python.2.7.3.x86\lib\site-packages\zipline-0.5.6-py2.7.egg\zipline\utils\protocol_utils.py", line 85, in __getattr__
return self.__internal[key]
KeyError: 'shift'

有谁知道为什么以及如何正确地做到这一点?

非常感谢, 文森特

1 个答案:

答案 0 :(得分:2)

这是一个有趣的想法。在zipline中执行此操作的最简单方法是使用Returns转换,它将返回字段添加到事件框架(这是一个ndict,而不是像某人指出的pandas DataFrame)。

为此,您必须将转换添加到initialize方法: self.add_transform(Returns, 'returns', window_length=1)

(请务必在开头添加from zipline.transforms import Returns。)

然后,在batch_transform中,您可以访问返回而不是价格:

@batch_transform
def ols_transform(data, sid1, sid2):
    """Computes regression coefficient (slope and intercept)
    via Ordinary Least Squares between two SIDs.
    """
    p0 = data.returns[sid1]
    p1 = sm.add_constant(data.returns[sid2])
    slope, intercept = sm.OLS(p0, p1).fit().params

    return slope, intercept

或者,您也可以创建一个batch_transform,将价格转换为您想要的返回值。

@batch_transform
def returns(data):
    return data.price / data.price.shift(1) - 1

然后将其传递给OLS转换。或者在OLS变换本身内部进行此计算。

HTH, 托马斯