Python:keyrerror';班次';

Python:keyrerror';班次';,python,pandas,shift,zipline,Python,Pandas,Shift,Zipline,我是Python新手,尝试修改我在此处找到的配对交易脚本: 原始脚本设计为仅使用价格。我想用回报来适应我的模型和投资数量的价格,但我不知道怎么做 我试过: 在main中定义返回数据帧并在run中调用它 将main中的返回数据框定义为全局对象,并在需要时在“handle data”中使用 直接在句柄数据中定义retuns的数据帧 我假设最后一个选项是最合适的,但是熊猫“shift”属性有一个错误 更具体地说,我尝试将“数据回归”定义如下: DataRegression = data.copy

我是Python新手,尝试修改我在此处找到的配对交易脚本:

原始脚本设计为仅使用价格。我想用回报来适应我的模型和投资数量的价格,但我不知道怎么做

我试过:

  • 在main中定义返回数据帧并在run中调用它
  • 将main中的返回数据框定义为全局对象,并在需要时在“handle data”中使用
  • 直接在句柄数据中定义retuns的数据帧
我假设最后一个选项是最合适的,但是熊猫“shift”属性有一个错误

更具体地说,我尝试将“数据回归”定义如下:

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)
其中,“数据”是一个数据框,其中包含全局定义的prices、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'
有人知道为什么以及如何正确地做到这一点吗

非常感谢,,
文森特这是一个有趣的想法。在zipline中实现这一点最简单的方法是使用Returns转换,它将一个Returns字段添加到事件帧(这是一个ndict,而不是有人指出的pandas数据帧)

为此,必须将转换添加到initialize方法:

self.add\u转换(返回“返回”,窗口长度=1)

(确保在开始处添加zipline.transforms导入返回的

然后,在批处理转换中,您可以访问退货而不是价格:

@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
def returns(data):
    return data.price / data.price.shift(1) - 1
然后将其传递给OLS变换。或者在OLS变换本身内部执行此计算

嗯,,
Thomas

是导致异常的最后一行吗?(
DataRegression=DataRegression.dropna(axis=0)
?)导致异常的是第二行(这对错误更有意义!)这是否意味着
DataRegression[Stock1].shift(1)
会引发相同的异常?您能确认
类型(DataRegression[Stock1])
的输出吗?是DataRegression[Stock1]。shift(1)引发相同的异常。类型为'zipline.utils.protocol_utils.ndict'lib-zipline已更改了我假设的类型…DataRegression不是panda数据帧,而是一个zipline对象:(非常感谢您的回答。到目前为止,我对@batch_transform–VincentH不太熟悉