給与統計フィルター戦略を作った皆さんへ、
シンプルなルールを作りました。米国の雇用統計発表後、月間の雇用者数の伸びが175,000人を超えていれば、株式ETFを5セッション保有する。そうでなければ現金のままです。株式市場の寄り付き後にエントリーするよう設定し、取引コストを含め、しきい値も固定しました。そして過去の雇用統計系列をダウンロードし、それを使ってすべてのシグナルを再現しました。
残る問題は、そのダウンロードデータです。過去の経済統計系列には、戦略が取引したとされる日にはまだ入手できなかった改定値が含まれていることがあります。マクロシグナルを正直にバックテストするには、それぞれの判断時点で入手可能だったバージョンが必要です。エントリーを1本先にずらしても、2カ月後に発表された数字の問題は解決しません。
1月の統計には、何度も更新日がやって来る
架空の発表履歴を見てみましょう。日付と雇用者数の変化は仕組みを説明するためのもので、実際の経済統計ではありません。
| 発表日 | 対象月 | 発表された雇用者数の変化 | その時点でのルール判定 |
|---|---|---|---|
| 2月7日 08:30 ET | 1月 | +150,000 | 現金のまま |
| 3月7日 08:30 ET | 1月、改定後 | +185,000 | 2月の判断は書き換わらない |
| 4月4日 08:30 ET | 1月、再改定後 | +210,000 | 2月の判断は書き換わらない |
ダウンロードしたデータで1月の値が+210,000になっていれば、バックテストでは2月にETFへエントリーします。実際のルールなら現金のままだったはずです。価格、注文時刻、手数料がすべて正しくても、その取引全体が架空のものになり得ます。
この混入で成績が良くなるとは限りません。改定によって勝ちトレードが生まれることも、負けトレードが生まれることも、どちらかが消えることもあります。問題は、シミュレーションが当時の戦略には立てられなかった問いに答えてしまうことです。
そして1月は、測定対象の期間にすぎません。測定値を知った日付ではありません。1月1日と記された行があっても、1月1日にそれを使って取引してよいことにはなりません。
各値の利用可能時点を記録する
調査用テーブルに必要なのは、月と数値だけではありません。対象期間、値、発表時刻、ビンテージ識別子、情報源を記録してください。継続的に収集するなら、システムが発表を受信した時刻も記録します。古いバージョンは値を上書きせず、保存しておきましょう。
判断時刻ごとに、利用可能時刻がその判断時刻以前である観測値に絞り、その中から各観測値の最新の適格バージョンを選びます。その再構成したスナップショットから特徴量を計算してください。
データ取得の手順:まず、その時点で利用可能だった記録に絞り、次に該当するバージョンを選び、それからシグナルを計算します。今日の改定後データで特徴量を計算してから結果をずらしても、先読みの混入は残ります。
保有期間が5セッションだからといって、この記録作業を省けるわけではありません。エントリー時刻を保守的に選ぶ余地は広がりますが、改定値を早く入手できるわけではありません。
過去の調査では、公表時刻の証拠はあっても、自分たちが受信した時刻の記録はないかもしれません。この違いは明確にしておきましょう。記録された公表時刻と明示した遅延時間をもとに、利用可能時刻をモデル化することはできます。その仮定を、過去の配信時刻を実測したかのように説明することはできません。
タイムゾーンを認識するタイムスタンプも必要です。記録された現地時刻を保存し、正しく変換してください。ニューヨークのUTCオフセットを固定すると、夏時間の切り替わりで破綻します。未来の自分に、ちょっとした親切をしておきましょう。9月のあなたが、3月のあなたの列名date_actual_final2を解読しなくて済むように。
ローリング特徴量には、各時点のビンテージが必要
固定しきい値を「雇用者数の伸びが過去12カ月平均を上回る」に置き換えるとしましょう。その判断時点での過去の観測値が必要です。そこには、その時点までに公表済みの改定も含まれます。
すべての月について、初回発表値を永久に使うなら、それは別の特徴量を定義することになります。初回発表の履歴を明示的に使いたいのであれば、妥当な設計です。ただし、ある日の朝に見えていた経済統計の状況を再現するものではありません。その時点の情報セットには、過去の月の改定値がすでに含まれている場合があるからです。
雇用者数の水準から月次変化を算出する場合は、差分を取る前に該当ビンテージの水準系列を再構成してください。新たに発表された水準と、前月の古いビンテージの水準を混ぜると、どの公表スナップショットにも存在しなかった変化を作り出しかねません。
つまり、特徴量が何を意味するのかを定義する必要があります。初回発表値なのか、その時点で入手可能な最新の経済状況なのか、それとも改定そのものなのか。「雇用者数の伸び」だけでは、決めるべきことが多く残っています。
10年分を再実行する前に、1回の発表を修復する
まずはALFREDを利用できます。多くの経済統計系列について、ビンテージ履歴を提供しています。対象の系列と期間がカバーされているか確認してください。ビンテージの日付だけでは日中の利用可能時刻は分かりません。同日シグナルに使う前に、記録された発表時刻と組み合わせてください。
最初の監査では発表を1つ選び、手作業で再構成してみましょう。
- アーカイブされた発表を見つけ、公表時刻、対象月、初回発表値を記録する。
- エントリー前に戦略が受け取っていたはずの入力スナップショットを再構成する。
- シグナルを手計算し、バックテストの結果と比べる。
- 後日の改定値をデータストアに追加し、過去の判断が変わらないことを確かめる。
最後の確認は、自動化された調査パイプラインで特に役立ちます。特徴量の値とともに、スナップショットの締め時刻と選択したビンテージ識別子を調査エージェントに渡してください。元のデータベースが大きくなった後でも、取引を特定の発表までたどれるだけの根拠が必要です。
その判断を再現できたら、過去全体を再実行し、リターンを比べる前にシグナルの不一致を比較します。修正によって生まれたエントリー、消えたエントリー、時刻が移動したエントリーを数えましょう。修正前後のSharpeを1つ比べるだけより、変わった判断を調べるほうが多くを学べます。
2月の取引は、2月時点の情報だけで成立しなければなりません。4月の改定は4月に残しておきましょう。
← 記事一覧


