2013-02-11 26 views
4

我是新来的Python和尝试修改对交易脚本,我发现这里: https://github.com/quantopian/zipline/blob/master/zipline/examples/pairtrade.py的Python:KeyError异常“转向”

原来的脚本设计只使用价格。我想使用回报来适合我的模型和投资数量的价格,但我不明白它是如何做到的。

我曾尝试:

  • 在主定义返回的数据帧,并调用它在运行
  • 在主定义返回的数据帧为全局对象,并使用在需要的地方在“句柄数据”
  • 直接在句柄数据,以限定retuns的数据帧

我假设的最后一个选项是最合适的,但然后我有熊猫错误“转向” ATTRIB UTE。

更具体我尝试定义“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) 

其中“数据”是含有价格,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' 

有人会知道为什么以及如何正确执行该操作吗?

非常感谢, 文森特

+0

它是导致异常的最后一行吗? ('DataRegression = DataRegression.dropna(axis = 0)'?) – 2013-02-11 12:35:39

+0

这是第二行导致异常 – VincentH 2013-02-11 12:41:26

+0

(这更有意义的错误!)这是否意味着'DataRegression [Stock1] .shift(1 )'抛出相同的异常?你能确认'type(DataRegression [Stock1])'的输出吗? – 2013-02-11 12:52:17

回答

2

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

为此,您需要添加转换到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, Thomas

+0

非常感谢您的答案。我不是很熟悉@batch_transform到目前为止 - VincentH – VincentH 2013-04-17 15:43:16