はじめに
趣味で FX の自動売買ストラテジーを作ったり、自作環境でバックテストを回している方に、よくある悩みを今日共有します。
私自身、クラウドの時系列 DB を使って相場データを管理しているのですが、最初の頃はローソク足の描画やテクニカル指標の計算ばかり気にして、時系列の空白箇所が持つ影響を完全に見落としていました。 検証期間を長く取ったり、複数通貨ペアを同時にシミュレーションすると、祝日が原因のデータ欠損がボラティリティや収益率の数値を狂わせ、結果が全然信用できなくなるんです。
FX は株と違って一箇所の取引所が存在せず、世界中の流動性プールから価格が配信されています。 API から過去のティックやローソク足を取得したとき、データの間隔が開いたり記録が少なくなったりしても、一概に通信エラーとは限りません。地域の祝日や世界的な休業で流動性が落ちているだけのケースが多いので、データクレンジング時にきちんと判別する仕組みを作る必要があります。
1. 見た目が似ている 4 種類のデータ空白、区別するコツ
何百回もデータの洗浄作業を繰り返した結果、時系列の空白は大きく 4 パターンに分かれることがわかりました。初心者の方は全部「データ異常」と勘違いしがちなので、それぞれの特徴を整理します。
- 世界的祝日(クリスマス・元旦など) 大手金融機関が取引を縮小するため、全ての通貨ペアの配信数が減り、時間間隔が大きく開きます。
- 地域限定の休日 休暇を取る国に関連する通貨だけ動きが鈍くなります。日本の祝日なら USD/JPY、欧米の休暇なら EUR や USD 系ペアが疎になります。
- 定例の週末休場 FX 市場は土日に取引がないため、毎週固定で長い空白区間が生まれます。
- API の通信トラブル ネットワークの不調や API のリクエスト制限でデータが途切れるケース。休日と関係ないタイミングで発生するので、アラートを出して確認が必要です。
多くの方が、データに空白を見つけるとすぐ直前の価格で補完してしまうのですが、市場の自然な空白まで書き換えると本来の相場の動きが再現できず、バックテストの結果が大きく歪んでしまいます。 正しく判断するには「時間の間隔」「通貨ペアのタイムゾーン」「祝日カレンダー」の 3 つを照らし合わせるのがポイントです。
1.1 時間差から空白箇所を自動検知する方法
自作スクリプトの基本ロジックとして、連続した 2 つの相場データの時間差を計算し、規定の間隔を超えた箇所にフラグを立てる仕組みを入れています。 例えば 1 分足なら本来 60 秒間隔でデータが来るので、それ以上開いた区間を「要確認空白」と記録するイメージです。
検知時に保存しておく情報はこの 5 つです。 ・今回の相場タイムスタンプ ・1 つ前の相場タイムスタンプ ・2 件の時間差 ・通貨ペアコード ・当日の祝日判定フラグ
これらの情報があれば、後から「祝日が原因の空白」か「通信エラー」かを簡単に切り分けられます。
1.2 祝日カレンダーを使って再確認する仕組み
時間差だけだと誤判定が出やすいので、各国の休日一覧を用意して二重チェックするようにしています。 EUR/USD は欧米の祝日、AUD/USD はオーストラリアの休暇と紐付けて照合することで、必要のない警告を大幅に減らせます。クラウド上で一括データ処理する時も、処理速度がだいぶ安定します。
2. 使う用途別の空白処理ルールを紹介
祝日が原因の空白と確定した場合、一律同じ方法で補完するのは NG です。用途に合わせて対応を分けることで、元の相場データの正確さを保てます。
- 過去の相場を振り返るだけの場合 一切補完せず元の時系列をそのまま保管。実際に配信された価格だけを見ることで、市場の状況を忠実に把握できます。
- テクニカル指標の計算・機械学習に使う場合 欠損が生まれた理由を記録する専用のタグ欄を追加。「祝日欠損」「週末休場」「API 障害」の 3 種類に分類し、学習時に不要な区間を除外できるようにします。
- 途切れないグラフを描画したいシミュレーションの場合 補完データを作成しても大丈夫ですが、本物の相場データと別のテーブルに分けて保存。補完したデータだけで指標計算をしないように区切ります。
元データ・タグ記録用データ・補完データを分けて保管する構造にすると、後からデータの出どころを追いやすく、検索速度も落ちません。
3. 過去データとリアルタイム相場で判定ルールを統一
オフラインで過去データを検証する時と、リアルタイムで相場を受信する時で処理方法が違うと、バックテスト結果にズレが生じてしまいます。私はどちらも同じ祝日判定ロジックを使うよう統一しています。
リアルタイムの相場取得には AllTick API の WebSocket 接続を活用していて、取得したティックデータに対して過去データと同じ祝日チェックを走らせることで、オンライン・オフラインの基準を一致させています。
実装時のポイントとして、リアルタイムティックを DB に保存する前に祝日判定を実行しタグを付けること。後から過去データと合体させて一括検証してもルールのズレが起きません。
4. 長年データを扱って分かったまとめ
FX の時系列データは「途切れなければ良い」というわけではなく、空白ができた背景を理解することが一番大事です。 祝日の低流動性・週末休場・API の不具合は見た目の空白が同じでも、それぞれ適切な処理方法が全く異なります。
私が普段回している一連の流れを簡単にまとめます。
- 一括処理で全時系列の時間差を計算し、空白箇所を洗い出す
- 各国祝日カレンダーと照合し、市場由来の空白と通信障害を分類
- 利用シーン(過去検証・指標計算・グラフ描画)に合わせて処理を切り替え
- リアルタイム相場にも同じ祝日判定ロジックを適用し基準を統一
- 元データ・タグデータ・補完データを分けて保管し、検索を高速化
この流れでデータを整備することで、祝日が原因の数値の歪みを抑え、自作ストラテジーのバックテスト結果をより実際の市場に近づけられます。個人で少しだけ定量分析をする方から、小規模な開発チームまで幅広く活用できる方法だと思います。