我是Python新手并尝试修改我在这里找到的一对交易脚本:
https://github.com/quantopian/zipline/blob/master/zipline/examples/pairtrade.py
原始脚本旨在仅使用价格.我想使用退货来适应我的模型和投资数量的价格,但我不知道它是怎么做的.
我试过了:
>在main中定义返回的数据框并在运行中调用它
>将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’是一个数据框,其中包含全局定义的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'
谁会知道为什么以及如何正确地做到这一点?
非常感谢,
文森特
解决方法:
这是一个有趣的想法.在zipline中执行此操作的最简单方法是使用Returns转换,它将返回字段添加到事件框架(这是一个ndict,而不是像某人指出的pandas DataFrame).
self.add_transform(返回,’返回’,window_length = 1)
(确保从zipline.transforms import添加在开头返回).
然后,在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,
托马斯
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。