はじめに

趣味で株の自動売買システムを作ったり、過去データを使った戦略バックテストを回している方に共通する悩みを今日共有します。私自身クラウドの時系列 DB を使って米株のデータ管理をしているのですが、最初の頃は単純に価格データを取得するだけで満足し、プレマーケット・アフターマーケットのデータをどう扱うかまで考えていませんでした。

同じ売買ロジックなのに、使用する相場データソースを変えただけで勝率や最大損失幅が大きく変わる現象に悩まされ、コードを一つずつ追跡したところ、原因は延長取引時間のデータ集計ルールが統一されていない点だと分かりました。国内株と違って米株は一日に複数の取引区間が存在し、それぞれ流動性やニュースの影響度が異なるため、適当にデータをつなげると本来の相場構造が歪み、テスト結果が現実と大きく乖離してしまうのです。

1. 米株 3 つの取引時間帯とデータ処理の落とし穴

米東部時間を基準に分かれる取引区間の特徴を整理します。 ・プレマーケット(04:00~09:30):出来高が少なく、海外夜間のニュースで一方的な価格変動が起こりやすい ・通常取引(09:30~16:00):市場の流動性が一番高く、一般的なテクニカル指標の計算基準となる ・アフターマーケット(16:00~20:00):企業決算発表が集中し、短期の価格変動幅が大きい

初心者が陥りやすい 2 つの失敗パターンを紹介します。

  1. 通常取引のデータだけでローソク足を作成する プレでの高値安値、アフターの急変動データが完全に失われ、決算イベントを活用する戦略のテストが全く当てにならなくなります。
  2. 全時間帯のデータを区別なく混ぜて集計する 流動性の低い延長取引の出来高が平均化され、出来高移動平均などの指標の信頼度が大幅に低下します。

正しく連続したローソク足を生成するには「タイムゾーンの統一」「取引時間のタグ付け」「用途別の集計分け」の 3 段階のロジックを組み込む必要があります。

2. 用途別のデータ集計ルール

万能なデータ結合方法は存在しないので、自分の分析目的に合わせて処理を切り替えます。

表格

使用シチュエーション プレ・アフターデータの扱い方
長期のトレンド分析、伝統的指標の検証 通常取引のデータのみでローソク足を作成、延長取引データは別テーブルに保管し指標計算に使わない
日内ショート、高頻度売買のシミュレーション プレ・通常・アフターの全ティックデータを統合し、全日の価格変動を再現
決算発表時の値動き分析 アフターマーケットのデータだけを切り出し、日中のデータと分けて分析

また時刻処理の基礎として、サーバーは UTC で時刻を保管し、ローソク作成時のみニューヨーク時間に変換するルールを徹底しましょう。サマータイム切り替え時の時刻ズレを防げます。

3. リアルタイム相場の受信処理

過去データとライブのリアルタイムデータで時刻変換や区間判定のルールを分けると、2 つのデータを合体した際にローソク足に不連続な隙間が生まれます。私はリアルタイムのティック取得に AllTick API の WebSocket 接続を利用し、オフライン処理と完全に同じ時刻ロジックを共有するようにしています。

実装のポイントとして、DB に登録する前に時刻変換を済ませ取引区間のタグを付けておくと、後から必要な時間帯だけ抽出する作業が楽になり、重複した時刻計算を省けます。

4. 実装時に気を付ける細かいポイント

長く米株データを扱っている中で、何度もハマった箇所を 3 つ挙げます。

  1. 真夜中をまたぐ営業日判定 UTC の時刻データをそのまま使うと、真夜中の取引が翌日に分類されてしまうので、米東部の日付に合わせる補正処理を入れます。
  2. API の取得パラメータ確認 標準設定だと通常取引のデータしか返ってこない場合が多いので、プレ・アフターのデータが必要な時は専用のリクエストパラメータを追加します。
  3. リアルタイム通信のエラー対策 切断時の自動再接続、重複したティックデータの削除、時系列のソート機能を実装しないと、順番の乱れたデータから歪んだローソク足が生成されます。

5. まとめ

相場 API から価格データを取得するだけでは定量分析の第一段階に過ぎません。大切なのはプレマーケット、通常取引、アフターマーケットそれぞれの時系列ルールを正しく理解し、自分の分析目的に合わせて集計方法を切り替えることです。

生のティックデータ、通常取引のローソク、延長取引のデータを分けて保管する構成にすることで、長期トレンドの調査にも日内ショートのシミュレーションにも対応でき、延長取引が原因のテスト結果の歪みを抑えられます。