連続先物系列は、満期を迎える契約を順につないで1本の履歴にしたものです。この履歴を使ってシグナルを研究することはできますが、価格変動から直接売買損益を計算すると、ロールのたびに利益や損失を作り出すことがあります。この系列だけでは、どの契約を保有していたかは分かりません。
とりわけ厳しい例を見てみましょう。2020年4月20日のNYMEX WTI原油です。5月限は1バレルあたりマイナス37.63ドルで清算され、6月限はプラス20.43ドルで清算されました。どちらも実際の価格です。その差である58.06ドルも実際のものでした。しかし、チャートを5月限から6月限へ切り替えても、ロングポジションがその差額を稼いだわけではありません。
この接続を分解してみましょう。以下は過去の清算価格です。後述する仮定上の会計例は計算の仕組みを示すためにこれらの価格を使うもので、その価格で注文が約定できたと主張するものではありません。
CLK20とCLM20:チャートが落としてしまった識別子
| 項目 | 5月限 | 6月限 |
|---|---|---|
| 契約識別子 | CLK20 | CLM20 |
| 受渡月 | 2020年5月 | 2020年6月 |
| 4月20日の清算価格、1バレルあたりドル | −37.63 | 20.43 |
| 契約サイズ | 1,000バレル | 1,000バレル |
ティッカーの先頭部分より、月コードのほうが重要です。Kは5月、Mは6月を表します。この2つの契約は受渡義務も価格も異なります。異例の貯蔵圧力がかかるなか、5月限は満期が迫っていました。6月限なら、さらに1か月先まで保有できます。
データベンダーの連続銘柄では、この違いが見た目には便利なほど簡潔な表記の裏に隠れています。簡潔な表記は好きですが、取引ログに残っている識別子がそれだけになると話は別です。デバッグは考古学さながらになり、コーヒーだけはまずくなります。
そもそも、連続履歴に唯一の正解があるわけではありません。ベンダーによって、満期の一定営業日前、出来高の逆転時、あるいは別のスケジュールでロールすることがあります。4月20日より前に5月限から乗り換えていた履歴も多くありました。ここでは問題をはっきり示すため、意図的にこの2つの清算価格を接続しています。特定のベンダーのロール方法を示すものではありません。
1,000バレル:各価格の裏にある乗数
標準的なNYMEX WTI先物契約は1,000バレルを表します。したがって、価格が1ドル動くと、1枚のロングポジションの価値は1,000ドル変わります。0.01ドルのティックは10ドルです。
1枚の契約を変わらず保有した場合、基本的な計算式は次のとおりです。
gross_pnl = contracts × 1,000 × (ending_price − starting_price)
価格がゼロを下回っても、この式は使えます。提示された先物価格に対するパーセントリターンは、ずっと使いにくくなります。ゼロをまたぐと未定義になったり、見かけ上の意味が逆転したりするためです。戦略リターンは、口座のエクイティとキャッシュフローの計上ルールから算出するべきです。1バレルの提示価格は、その戦略に投じた資金ではありません。
58.06ドル:接続箇所に生じる不連続
単純なエンジンが5月限の清算価格の次に6月限の清算価格を見て、銘柄が変わっていないかのように式を適用したとしましょう。
invented_pnl = 1 × 1,000 × (20.43 − (−37.63))
= $58,060
この比較では、時間の経過に伴う価格変動は何もありません。2つの価格は同じ取引日の別々の契約のものです。エンジンは、契約間の価格差を保有期間中の利益と取り違えています。
日次データを実際に接続する場合、昨日の旧契約価格と今日の新契約価格には、通常の市場変動も含まれます。そのため、誤りは見つけにくくなります。記録された変化には、旧契約の価格変動と、切り替え時点での契約間の価格差が混在します。
また、見せかけの「ロールコスト」として58,060ドルを差し引いても、モデルは直りません。先物は、提示された名目額の全額を支払って購入するものではありません。ある契約を決済して別の契約を建てると、ポジションの変化に加え、実現または清算される損益、手数料、約定の影響、証拠金要件が発生します。契約間の価格差が自動的に現金支出になるわけではありません。
+58.06:履歴に書き込まれるバックアジャストメント
よくある連続系列の作り方の1つでは、ロール差を過去の価格に加算します。この方式なら、5月限の−37.63は20.43となり、6月限と段差なくつながります。同じ過去区間のそれ以前の観測値も58.06だけ上がります。
| 作成方法 | この接続箇所で起きること | 調査への影響 |
|---|---|---|
| 未調整 | 58.06ドルの差が残る | 指標が契約の切り替えを市場変動と解釈する可能性がある |
| 加算バックアジャストメント | 古い区間に58.06を加算する | 区間内のドル建て変動は保たれる一方、過去の価格水準と変化率は変わる |
| 比率バックアジャストメント | 古い区間に20.43 / −37.63を掛ける。約−0.543 | 係数が負のため、区間内の価格変動の符号が反転する |
最後の行があるからこそ、「比率調整済み」という説明だけではデータ仕様として不十分です。価格が常に正なら妥当に動く方法でも、ゼロやマイナス価格をどう扱うか明示する必要があります。
加算調整にも独自の影響があります。絶対値で30ドルを下回ったら買うシグナルは、後のロールで過去の価格水準が書き換えられると変わることがあります。短期移動平均と長期移動平均の差を使うシグナルは、両方の期間に同じ加算が適用される限り、その一律のシフトの影響を受けない場合があります。調整境界をまたぐ期間は、個別に確認が必要です。
調整方法、ロールスケジュール、データのバージョンを研究結果と一緒に保存しましょう。調整後の価格水準に左右されるシグナルについては、各判断日時点で利用できた履歴を再構築してください。現在ダウンロードしたデータには、その時点ではまだ起きていなかったロールによる調整が含まれている可能性があります。
連続チャートから抜け落ちている2つの注文行
ここでは、意図的に単純化した台帳を示します。ロール前に5月限を1枚、−30.00で評価していたと仮定します。5月限の決済と6月限の新規建ては、先ほどの過去の清算価格で行い、その後、6月限を21.00で評価すると仮定します。これらの約定価格は会計例のための仮定です。
| 台帳上の事象 | 計算 | 売買損益(コスト控除前) |
|---|---|---|
| 5月限のロング1枚を−37.63で決済 | 1,000 × (−37.63 − (−30.00)) | −$7,630 |
| 6月限のロング1枚を20.43で新規建て | 建てた時点では価格変動なし | $0 |
| 6月限を21.00で評価 | 1,000 × (21.00 − 20.43) | +$570 |
| 合計 | 約定コストと手数料を除く | −$7,060 |
58.06ドルの差は、単独の収益にも費用にもなっていません。日々の変動証拠金は、先物損益がいつ現金に反映されるかを決めますが、同じ損益を二重に作り出すものではありません。
実際のロールは、独立した2つの注文ではなく、カレンダースプレッド注文で執行する場合があります。シミュレーターでは、どの方法を想定する場合も、その約定と費用を含めて表現しつつ、個別契約のポジションを保持する必要があります。
私たちの受け入れ基準はシンプルです。先物取引の損益はすべて、契約名、数量、乗数、そしてその契約に属する2つの価格に照合できなければなりません。ロールの判断時刻と、その判断に使った入力も確認します。当日の確定出来高を使うルールが、同じ日のそれより前にひそかに取引することはできません。
連続価格の線は全体像を見るために描きましょう。その下には実際に保有した契約を描き、切り替え箇所に印を付けます。切り替え時にエクイティカーブが跳ねたら、まず確認するのはこの2つの注文行です。
← 記事一覧


