高頻度取引(HFT)やマーケットマイクロストラクチャーの理論を個人環境(VPS・リテールECN)へ適用し、ミリ秒〜秒スケールの歪みから優位性(エッジ)を抜き取れるのか。
Dukascopy提供のUSDJPY生Tickデータ(約3,400万行)を用い、Numbaによる超高速バックテストエンジンを構築して検証を実施しました。本稿では、成行(Taker)アプローチの崩壊プロセスと、その失敗から導き出された指値(Maker)による微小反発エッジの定量的測定結果を記録としてまとめます。
1. 検証の前提とデータアーキテクチャ
1.1 使用データ仕様(Dukascopy ECN直結・3,404万行Tick)
徹底的なクレンジングと前処理を施したNumPyバイナリ配列(tick_master.npy)を使用しています。
- 総レコード数: 34,045,106行(約3,404万Tick)
- データ型 / 形状:
int32/(34045106, 16)(メモリマップ展開時:約2.18GB) - 価格スケーリング: 小数第3位を整数化(
1 = 0.001円 = 0.1 pips)。例:156658= 156.658円、スプレッド15= 1.5 pips。 - データ整合性: 通信断区間(Gap)および週末ロールオーバーはParquet前処理段階で検知し、最上位ビット(
IS_VALIDフラグ)で完全無効化。
主要カラムレイアウト(抜粋)
- Col 0 (
flags): ビットマスク(IS_98,IS_100,IS_96,STREAK_REVERSAL,IS_VALIDなど) - Col 1 (
streak_len): 同一方向板叩きの連続発生回数 - Col 2 (
minute_idx): 日中通算分(0〜1439)。M1境界検知用 - Col 3 (
delta_ms): 前Tickからの経過ミリ秒 - Col 4〜7:
bid/ask/mid/spread
1.2 高速バックテストエンジンの設計(Numba JIT・O(N)単一パス走査)
3,400万行の走査にPython通常ループを用いると数時間を要するため、Numba(@njit(nogil=True, fastmath=True))によるネイティブC水準の単一パス走査エンジンを構築しました。これにより、1回のフルバックテスト(3,400万行の走査およびシグナル後の時間追跡)を0.8〜2.0秒以内(毎秒1,500万〜5,000万Ticks)で完了させることが可能です。
1.3 厳密な約定モデル(未来予知バイアスの排除)
- i+1 約定モデル(Look-ahead Bias排除): シグナルを検知したTick
iの価格では約定させず、必ず次Ticki+1の対抗気配(買いならask[i+1]、売りならbid[i+1])で判定。 - リアルタイム前進探索(Forward Scan): 事前計算された未来最大値(MFE)を確定PnLとして誤認する「聖杯バグ」を排除し、経過ミリ秒を積算して正確に15s・60s・300s・900s後の実レートを取得してクローズ。
2. フェーズ1〜3:成行(Taker)アプローチの検証と全滅ログ
2.1 【プランA】M1オーダーフロー・インバランス(OFIRダイバージェンス)
M1足内部の「売り板叩き数(N98)」と「買い板叩き数(N100)」の比率からオーダーフロー・インバランス(OFIR)を算出。大陽線形成時に売りが過半数を占めるダイバージェンスを検知し、次足始値で逆張り(ショート)を仕掛けました。
- 逆張り結果: 15s〜900sの全ホライズンで期待値 -0.69 〜 -0.73 pips。勝率23%〜44%に低迷。
- 順張り(モメンタム追随)反転検証: 「買い板を粉砕して進む巨大フロー」と再定義して順張りに反転し、売買分離集計を実施するも、買い -0.700 pips / 売り -0.590 pips で同様にマイナス。
2.2 【プランB】時間間隔による静寂(真空・3秒停止)ブレイクアウト
活況時間帯にTick間隔が3.0秒以上途絶える「静寂(流動性の真空状態:IS_96)」を検知。再開後の一撃方向へ次Tickで成行順張りエントリーを行いました(全69,718トレード)。
- 15s 期待値: -0.720 pips(勝率 25.8%)
- 60s 期待値: -0.717 pips(勝率 35.7%)
- 300s 期待値: -0.718 pips(勝率 42.3%)
- 900s 期待値: -0.746 pips(勝率 44.8%)
2.3 【プランC】連続性の破綻(Streak Exhaustion:8連続叩き後の反転)
一方向への板叩きが8回以上連続した後、反転フラグが立った瞬間を検知。パニック注文の食い尽くしを狙い、反転方向へ成行エントリーを行いました(全7,859トレード)。
- 15s 期待値: -0.700 pips(勝率 18.3% / MFE -0.10p / MAE 1.31p)
- 60s 期待値: -0.684 pips(勝率 31.6%)
- 300s 期待値: -0.686 pips(勝率 41.5%)
- 900s 期待値: -0.637 pips(勝率 44.4%)
2.4 成行アプローチの検証サマリー
| プラン | シグナル種別 | 平均スプレッド | 15s 期待値 | 60s 期待値 | 300s 期待値 | 判定 |
|---|---|---|---|---|---|---|
| Plan A (OFIR) | M1足ダイバージェンス | 0.66 pips | -0.69 pips | -0.73 pips | -0.70 pips | 全滅 |
| Plan B (Vacuum) | 3秒停止後ジャンプ | 0.74 pips | -0.72 pips | -0.72 pips | -0.72 pips | 全滅 |
| Plan C (Streak) | 8回連続後の反転初動 | 0.69 pips | -0.70 pips | -0.68 pips | -0.69 pips | 全滅 |
3. なぜ成行戦略は全滅したのか?:微細構造(HFT)の敗因分析
3.1 「期待値 ≒ スプレッド代」が証明する完全なランダムウォーク
全プランの期待値(-0.64 〜 -0.74 pips)は、エントリー時に支払った平均スプレッド(0.66 〜 0.74 pips)とほぼ完全一致していました。
これは、シグナル検知後の値動きが50:50のランダムウォークであり、方向性予測力(Alpha)がゼロであることを意味します。成行で跨いだ瞬間にスプレッド分の初期負債を抱え、その後はノイズに巻かれて手数料分だけ削り取られていく構造です。
3.2 LP(大手マーケットメイカー)とのレイテンシ格差
大手流動性プロバイダー(LP)は数マイクロ秒単位で板の提示・キャンセルを行っています。個人がインターネット経由でTickを受信し、シグナルを判定して成行注文を返答する数百ミリ秒後には、相場の歪みはすでに裁定され尽くした「出がらし」となっています。
4. 追加解析:スプレッド負け潰しと「指値(Maker)」への転換
4.1 発想の転換:スプレッドを「受け取る側」へ
成行(Taker)でスプレッドを支払うから負けるのであれば、「指値を置いてスプレッドを回収する(Maker)」側に回るべきです。Plan C(連続叩き反転)をベースに、反転側の板に指値を置くシミュレータを構築しました。
4.2 逆選択コスト(Adverse Selection Cost: ASC)の定量的測定
指値戦略における最大のリスクは、約定した瞬間にそのまま突き抜けて大損する「逆選択(Toxic Flow)」です。約定後ホライズン $\tau$ 秒におけるMidレート変動から、逆選択コスト(ASC)を定義しました。
- ASC > 0: 約定後にMidが不利な方向へ下落(逆選択・Toxic Flow)
- ASC < 0: 約定後にMidが有利な方向へ反発(スプレッド回収成功)
4.3 指値オフセット別(Mid -0.3p〜-1.0p)の比較検証
| 指値位置 (Offset) | 約定率 | 平均待機時間 | 逆選択コスト (ASC 60s) | 成行PnL (60s) | MAE (60s) |
|---|---|---|---|---|---|
| Mid – 0.3 pips | 90.9% | 2.23秒 | -0.199 pips (反発) | -0.181 pips | 1.76 pips |
| Mid – 0.5 pips | 74.1% | 5.99秒 | -0.143 pips | -0.253 pips | 1.91 pips |
| Mid – 0.6 pips | 66.6% | 7.35秒 | -0.117 pips | -0.286 pips | 1.98 pips |
| Mid – 0.7 pips | 60.6% | 8.35秒 | -0.101 pips | -0.307 pips | 2.04 pips |
| Mid – 1.0 pips | 47.8% | 10.34秒 | -0.129 pips | -0.295 pips | 2.13 pips |
Mid - 0.3 pips では約定率90.9%を記録しつつ、ASCが -0.199 pips(反発)を記録しました。約定直後に平均0.2 pipsのリバウンドが発生しており、Toxic Flowを回避できていることが判明しました。一方で、指値を深く置くほど待機時間が延び、本格的な貫通トレンドに巻き込まれて反発力が縮小していく現象が確認されました。
5. Maker-Maker(両建て指値)と非対称リスクリワードの限界
5.1 利確指値(+0.3〜+1.0p)+30秒タイムアウト撤退の検証
エントリーで得た反発エッジを刈り取るため、エグジット側にも利確指値を配置。30秒刺さらなければ成行撤退させるモデルを検証しました。
- 利確目標 +0.3 pips: 利確到達率 60.2% | タイムアウト損失 -1.326 pips | 総合期待値 -0.347 pips
- 利確目標 +0.5 pips: 利確到達率 50.8% | タイムアウト損失 -1.184 pips | 総合期待値 -0.329 pips
- 利確目標 +1.0 pips: 利確到達率 34.4% | タイムアウト損失 -0.952 pips | 総合期待値 -0.281 pips
勝率が60%を超えても期待値はマイナスに沈みました。微小利確で大勝ちトレードの天井が抑えられた一方、利確に届かない玉が30秒間放置されて平均 -1.3 pips の深手を負ったためです(負の歪度リスク)。利確目標を広げるほど期待値が改善するデータは、「微小利確で頭を抑えてはならない」ことを示しています。
5.2 早期見切りとスプレッド狭窄フィルターの効果
「発注時スプレッド0.5p以下」「指値寿命1秒」「5秒時点で含み損なら早期スクラッチ成行撤退」「利確幅+1.5〜+2.5p」に改善した結果、損失幅は半減しました。
- Spread<=0.5p / TP=+1.5p / 5s見切り: TP到達 23.1% | 見切り 41.1% (-0.70p) | 期待値 -0.188 pips
- Spread<=0.5p / TP=+2.5p / 5s見切り: TP到達 11.8% | 見切り 41.1% (-0.70p) | 期待値 -0.172 pips
負け玉の損失は -0.70 pips まで抑制されたものの、「早期見切り時に成行(Taker)でスプレッドを吐き出すコスト」が重く、プラ転にはわずかに届きませんでした。
6. 結論と次回へのロードマップ
【検証から得られた結論】
個人環境において、Tickレベルの微細構造から数pipsの利益を抜き出すことはスプレッド摩擦により極めて困難。
ただし、「パニック反転直後の短寿命な指値」を用いれば、エントリー直後に2秒以内で0.2〜0.3 pipsの反発を得て、スプレッドコストを相殺(無効化)することは100%可能である。
6.1 次の設計思想:「マクロ(M5~H1トレンド)順張り × ミクロ(Tick反転)Maker指値」
Tickの歪みは「利益を抜く武器」ではなく、「上位足のトレンドにノーリスクで乗るための防具(スプレッド相殺チケット)」として使い倒すのが合理的です。
- 環境認識(M5足): Tickから内部生成したM5足の移動平均から大局のトレンド方向を定義。
- 精密エントリー(Tick): トレンド方向への押し目・戻りにおいて、Tickの連続反転で
Mid - 0.2 pipsに指値を配置。 - 非対称管理: 2秒以内の反発を利用して即座に建値ストップ(±0 pips)をロック。ノーリスク状態を作った上で、上位足の利幅(15分〜60分保有、+3.0〜+5.0 pips)を回収する。
速度競争でHFTと殴り合う消耗戦を脱し、個人環境に適した「時間軸の非対称戦」へ移行します。

