バックテスト目的の連続先物契約

作者: リン・ハーン優しさ, 作成日: 2019-03-18 10:48:28, 更新日:

フューチャー契約の概要

フューチャーとは,将来の特定の日に,当たる資産の量を購入または売却するために,両当事者間で作成された契約の形態である.この日付は,配達または有効期限として知られる.この日付に達すると,購入者は,契約結成日に合意された価格で,物理的当たる資産 (または現金相当) を売り手に届けなければならない.

フューチャー取引は,取引先で取引される.フューチャー取引は,取引先で取引される.フューチャー取引は,取引先の標準化量と品質を基準に取引される.フューチャー取引は,非常に流動性があり,投機的な目的のために大量に使用される.フューチャー取引は,農業品や工業品の価格をヘッジするためにしばしば使用されていたが,フューチャー契約は,株式指数,外貨価値の利息など,あらゆる有形または無形の基盤で形成することができる.

各取引所における先物契約に使用されるすべてのシンボルコードの詳細なリストは,CSIデータサイト:先物情報表で確認できます.

フューチャー契約と株式所有の主な違いは,フューチャー契約は期限により限られた利用時間があるという事実である.任意の瞬間に,同じ底辺にある様々なフューチャー契約が,すべて期限が異なる日付で存在します. 最寄りの期限を持つ契約は,近い契約として知られています. 定量トレーダーとして私たちが直面する問題は,任意の時点で取引するための複数の契約の選択肢があるということです. したがって,私たちは株式や外貨の場合のように連続的な流れではなく重複する一連の時間列を扱っています.

この記事の目的は,この複数のシリーズから継続的な契約の流れを構築するための様々なアプローチを概要し,各技術に関連したトレードオフを強調することです.

継続 的 期日 契約 を 結成 する

異なる配送を持つ基礎契約から連続契約を生成しようとする主な困難は,契約がしばしば同じ価格で取引されないことである.したがって,いずれから次のいずれへもスムーズなスペイルを提供できない状況が発生する.これはコンタンゴおよびバックワード効果による.この問題を解決するためのさまざまなアプローチがあり,現在議論する.

一般 的 な 方法

金融業界では,先物契約を結びつけるための単一の標準方法はない.最終的に選択した方法は,契約を採用する戦略と実行方法に大きく依存する.単一の方法が存在していないにもかかわらず,いくつかの一般的なアプローチがあります.

バック/フォワード (パナマ) 調整

この方法は,各契約を移動して,個々の納品が隣接する契約にスムーズに結合するように,複数の契約の間の"ギャップ"を軽減する.したがって,期限切れ時の前の契約の間のオープン/閉鎖は一致する.

パナマメソッドの主要な問題は,価格に大きな変動をもたらす傾向バイアスの導入を含む.これは十分に歴史的な契約の負のデータにつながる可能性があります.また,絶対値の変化による相対価格差の損失があります.これは,リターンが計算するのが複雑 (または単純に誤っている) ということです.

比例調整

比例調整アプローチは,株式における株式分割の処理の調整方法と類似している.連続した契約において絶対的なシフトを取ることではなく,古い決済 (閉じる) 価格と新しい開設価格の比率を使用して,歴史的な契約の価格を比例的に調整する.これは,百分比収益の計算の中断なしに継続的な流れを可能にします.

比例調整の主な問題は,絶対価格レベルに依存する取引戦略も,正しい信号を実行するために同様の調整を行う必要があることである.これは問題的でエラーに易いプロセスである.したがって,この種の連続流は,直接バックテスト研究とは異なり,概要統計分析にのみ有用である.

ロールオーバー/パーペチュアルシリーズ

このアプローチの本質は,各契約の間での過渡がより円滑であることを確保するために,各契約の数日間を線形的に重んじられた割合で,連続した契約の契約を作成することです.

例えば,平滑5日間を考えてみましょう.第1日の価格P1は,遠距離契約価格 (F1) の80%と近距離契約価格 (N1) の20%に等しい.同様に,第2日の価格P2=0.6×F2+0.4×N2です.第5日に,P5=0.0×F5+1.0×N5=N5があり,契約はちょうど近距離価格の継続になります.したがって,5日後に契約は遠距離から近距離に順調に移行します.

ロールオーバー方法の問題は 5日間の取引が必要で 取引コストが上がる可能性があります

この問題に対する他の方法も 少なく見られますが ここで避けます

パイソンとパンダでロール・リターン・フォーメーション

この記事の残りの部分は,バックテストに最も適しているため,永続系列方法の実施に焦点を当てます.これは戦略パイプライン研究を行うのに有用な方法です.

WTI原油の先物契約 (シンボル CL) を結び,連続価格シリーズを作成します.執筆時点 (2014年1月),先物契約は CLF2014 (1月) で,先物契約は CLG2014 (2月) です.

フューチャーデータのダウンロードを実行するために Quandl プラグインを使用しました. システム上の正しい Python 仮想環境を設定し,ターミナルに次のことを入力して Quandl パッケージをインストールしてください.

import datetime
import numpy as np
import pandas as pd
import Quandl

主な作業は,フューチャーズ_ロールオーバー_ウェイトス関数で実行されます. 開始日 (近い契約の最初の日),契約決済日 (有効期限_日),契約のシンボル,契約をロールオーバーする日数 (デフォルトで5日) の辞書が必要です. 下のコメントはコードを説明します:

def futures_rollover_weights(start_date, expiry_dates, contracts, rollover_days=5):
    """This constructs a pandas DataFrame that contains weights (between 0.0 and 1.0)
    of contract positions to hold in order to carry out a rollover of rollover_days
    prior to the expiration of the earliest contract. The matrix can then be
    'multiplied' with another DataFrame containing the settle prices of each
    contract in order to produce a continuous time series futures contract."""

    # Construct a sequence of dates beginning from the earliest contract start
    # date to the end date of the final contract
    dates = pd.date_range(start_date, expiry_dates[-1], freq='B')

    # Create the 'roll weights' DataFrame that will store the multipliers for
    # each contract (between 0.0 and 1.0)
    roll_weights = pd.DataFrame(np.zeros((len(dates), len(contracts))),
                                index=dates, columns=contracts)
    prev_date = roll_weights.index[0]

    # Loop through each contract and create the specific weightings for
    # each contract depending upon the settlement date and rollover_days
    for i, (item, ex_date) in enumerate(expiry_dates.iteritems()):
        if i < len(expiry_dates) - 1:
            roll_weights.ix[prev_date:ex_date - pd.offsets.BDay(), item] = 1
            roll_rng = pd.date_range(end=ex_date - pd.offsets.BDay(),
                                     periods=rollover_days + 1, freq='B')

            # Create a sequence of roll weights (i.e. [0.0,0.2,...,0.8,1.0]
            # and use these to adjust the weightings of each future
            decay_weights = np.linspace(0, 1, rollover_days + 1)
            roll_weights.ix[roll_rng, item] = 1 - decay_weights
            roll_weights.ix[roll_rng, expiry_dates.index[i+1]] = decay_weights
        else:
            roll_weights.ix[prev_date:, item] = 1
        prev_date = ex_date
    return roll_weights

重量化行列が作成されたので,個々の時間列に適用することも可能です.メイン機能は,近距離および遠距離契約をダウンロードし,両方のための単一のデータフレームを作成し,ロールオーバー重量化行列を構築し,最終的に,適切に重量化された両方の価格の連続行列を生成します:

if __name__ == "__main__":
    # Download the current Front and Back (near and far) futures contracts
    # for WTI Crude, traded on NYMEX, from Quandl.com. You will need to 
    # adjust the contracts to reflect your current near/far contracts 
    # depending upon the point at which you read this!
    wti_near = Quandl.get("OFDP/FUTURE_CLF2014")
    wti_far = Quandl.get("OFDP/FUTURE_CLG2014")
    wti = pd.DataFrame({'CLF2014': wti_near['Settle'],
                        'CLG2014': wti_far['Settle']}, index=wti_far.index)

    # Create the dictionary of expiry dates for each contract
    expiry_dates = pd.Series({'CLF2014': datetime.datetime(2013, 12, 19),
                              'CLG2014': datetime.datetime(2014, 2, 21)}).order()

    # Obtain the rollover weighting matrix/DataFrame
    weights = futures_rollover_weights(wti_near.index[0], expiry_dates, wti.columns)

    # Construct the continuous future of the WTI CL contracts
    wti_cts = (wti * weights).sum(1).dropna()

    # Output the merged series of contract settle prices
    wti_cts.tail(60)

この出力は次のとおりです

2013年10月14日 102.230 2013年10月15日 101.240 2013年10月16日 102.330 2013年10月17日 100.620 2013年10月18日 100.990 2013年10月21日 99.760 2013年10月22日 98.470 2013年10月23日 97.000 2013年10月24日 97.240 2013年10月25日 97.950 ... ほら ... ほら 2013年12月24日 99.220 2013年12月26日 99.550 2013年12月27日 100.320 2013年12月30日 99.290 2013年12月31日 98.420 2014年1月2日 95.440 2014年1月3日 93.960 2014年1月6日 93.430 2014年1月7日 93.670 2014-01-08 92.330 について 長さ: 60,dタイプ:浮遊機64

シリーズが現在2つの契約で連続していることがわかります.次のステップは,バックテストのニーズに応じて,さまざまな年にわたって複数の配達のためにこれを実行することです.


もっと