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

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

我试过了:

  • 在 main 中定义返回的数据框并在 run
  • 中调用它
  • 将 main 中返回的数据框定义为全局对象,并在“处理数据”中需要的地方使用
  • 直接在句柄数据
  • 中定义一个 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' 是一个数据框,其中包含全局定义的价格、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 转换,它将返回字段添加到事件框架(这是一个 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 变换本身内部进行此计算。

    哈,
    托马斯

    关于Python:KeyError 'shift',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14810060/

    10-12 20:15