4

私はPythonが初めてで、ここで見つけたペア取引スクリプトを変更しようとしています: https://github.com/quantopian/zipline/blob/master/zipline/examples/pairtrade.py

元のスクリプトは、価格のみを使用するように設計されています。モデルと投資数量の価格に合わせて返品を使用したいのですが、その方法がわかりません。

私が試してみました:

  • メインでリターンのデータフレームを定義し、それを実行で呼び出す
  • メインの戻り値のデータ フレームをグローバル オブジェクトとして定義し、「ハンドル データ」の必要な場所で使用する
  • ハンドル データで直接 return のデータ フレームを定義する

最後のオプションが最も適切であると想定していますが、パンダの「シフト」属性にエラーがあります。

より具体的には、「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)

ここで、「データ」は、グローバルに定義された価格、在庫 1、在庫 2、在庫 3 の列名を含むデータ フレームです。ハンドル データのこれらの行は、エラーを返します。

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'

それを正しく行う理由と方法を誰かが知っていますか?

どうもありがとう、ヴィンセント

4

1 に答える 1

2

これは興味深いアイデアです。zipline でこれを行う最も簡単な方法は、returns フィールドをイベント フレームに追加する Returns 変換を使用することです (これは、誰かが指摘した pandas DataFrame ではなく、ndict です)。

このためには、変換を初期化メソッドに追加する必要があります。 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、トーマス

于 2013-04-17T00:20:41.073 に答える