日本株PTS×寄り付きギャップ・リバーサル入門:『夜→朝』の歪みを体系化する実践ガイド

投資入門

本稿では、日本株のPTS(私設取引システム)で形成された夜間価格と、翌営業日の東証の寄り付き(オープン・オークション)で形成される価格との「ズレ=ギャップ」に注目し、その過大反応が寄り後の短時間で修正されやすいという現象を、個人投資家でも再現しやすい戦略として整理します。投資初心者の方が最短距離で試せるように、口座準備・画面操作・発注方法・検証・リスク管理までを、ステップバイステップで具体的に説明します。

スポンサーリンク

本稿のゴール

読了後、次の三つが即日で実行できる状態を目指します。

  1. PTS価格と終値の差から「ギャップ」を定義し、寄り直後のリバーサル(逆行)を狙う基礎ルールを理解する。
  2. 寄付成行・指値・逆指値の使い分け、約定の優先順位、気配・板情報の読み方の基本を押さえる。
  3. Excel/スプレッドシートによる簡易検証と、日経225(JP225)のCFDを用いたMQL4 EA参考実装で、自動化の入口を掴む。

なぜ「夜→朝」で歪みが生まれるのか

東証の現物市場がクローズした後も、国内のPTSや先物・CFD、海外市場の動き、個別ニュースの配信により価格発見は続きます。夜間に形成された価格は出来高が薄く、注文の偏りで過度に動きやすい一方、翌朝のオークションでは参加者が一気に増えるため、過大反応の修正(平均回帰)が起きやすくなります。特に「ニュースの強弱が曖昧」「夜間出来高が少ない」「前日の終値付近に強い板の群れが残っている(記憶の価格)」といった条件が重なると、寄り直後にギャップを埋める動きが統計的に観察されやすくなります。

戦略の全体像(サマリー)

本戦略は、寄り付き時点でのギャップ(GAP%)が一定以上に拡大した銘柄を対象に、寄り後の短時間で生じやすい平均回帰を狙うものです。

  • 対象銘柄:板が厚くスプレッドの狭い主力銘柄または流動性の高いETF。
  • ギャップ定義:GAP% = (参考価格 − 前日終値) ÷ 前日終値 × 100。参考価格は「直近PTS価格」または「寄り直前の気配(参考気配)」のいずれか。
  • 基本アイデア:ギャップ拡大(+)ならショート、縮小(−)ならロングで、寄り後30〜60分の平均回帰を取りに行く。
  • フィルター:夜間出来高が細い/PTSスプレッドが広い/直近ニュースが弱含み等。ノイズ・フェイクブレイクの回避に用いる。
  • イグジット:ギャップ半値埋め到達/最大保有時間到達/固定幅のストップ/前日終値タッチのいずれか。

PTSと寄り付きの基礎(初心者向け)

PTSとは

PTSは、取引所外で株式の売買を可能にする私設取引システムです。夜間(例:16:30〜23:59等)に取引できることが多く、仕事終わりの個人投資家がニュースを織り込んだ発注を出す場として機能します。板は薄く、気配の飛びやギャップが出やすい点が特徴です。

寄り付き(オープン・オークション)

東証の寄り付きは、積み上がった成行・指値注文を突き合わせて「一点で清算」する競りです。ここで形成される始値は、多数の参加者の注文を反映するため、夜間の過大反応が修正される起点になりやすいのです。

ルール設計:最小限で始めるベースライン

まずはシンプルに始め、慣れたらフィルターを段階的に追加するのが王道です。以下はベースラインの例です。

1. スクリーニング(前日終値と夜間価格)

  • 対象:日中の出来高が十分で、スプレッドの狭い銘柄。
  • GAP%の算出:前日終値と直近PTS価格の差で計算。閾値は±1.0%〜±2.0%から検討。
  • 除外:ストップ高・安近辺、決算直後でサプライズが明確なケース、重要な規制・行政処分等のニュース。

2. エントリー(寄り付き約定を前提)

  • GAP%が+のとき:寄付でショート(信用売りまたは代替手段)。
  • GAP%が−のとき:寄付でロング。
  • 寄付成行を基本に、板の状況により寄付指値(気配より有利側)を使い分け。

3. イグジット

  • 目標1:ギャップ半値埋め(寄値と前日終値の中間)。
  • 目標2:時間制限30〜60分(時間で切る勇気)。
  • 損切り:固定幅(ATRの0.3〜0.6倍目安)か、直近スイング高安の外側。

実務:口座準備〜発注まで

一般的な手順は次の通りです。

  1. 本人確認とマイナンバーの提出、信用口座の開設(売りから入る可能性に備える)。
  2. PTS対応の取引チャネルを有効化し、夜間板と約定履歴を見られる画面を用意。
  3. 寄り前(例:8:00〜8:59)に気配と板の厚さを確認し、寄りで執行する注文を準備。
  4. 約定後は、事前に決めた時間ルールと価格ルールに従って利確・損切りを機械的に実施。

データの集め方(初心者でもできる範囲)

  • 前日終値・寄値は公式の終値・始値を参照。
  • PTSの夜間終盤価格は、夜間の最終約定や最良気配を記録(スクショでも可)。
  • Excel/スプレッドシートで銘柄ごとのGAP%と結果(半値埋め達成/T値/最大不利行進)を記録。

簡易バックテスト(Excel/Sheets)

  1. 列A:日付、列B:銘柄、列C:前日終値、列D:夜間参考価格、列E:GAP%(自動計算)。
  2. 列F:寄値、列G:寄値からの最高有利行進、列H:最大不利行進、列I:半値埋め到達フラグ。
  3. 条件付き書式でGAP%の絶対値が大きい行をハイライト。
  4. ピボットで「GAP帯ごとの勝率」「平均有利/不利行進」「時間内達成率」を集計。

フィルター設計(精度を高める追加条件)

  • 夜間出来高が細い:出来高が薄いほど過大反応の可能性は高まる。
  • ニュースの曖昧さ:定量インパクトが読みにくい場合ほど揺り戻しが出やすい。
  • 板の偏り:寄り直前の板が薄い方向にギャップが出ているとリバーサルが起きやすい。
  • ボラティリティ環境:前日・当日の市場全体のボラが高すぎる場合はノイズ増。

ケーススタディ(数値は解説用の仮例)

仮に前日終値が1,000円、夜間の参考価格が1,030円(+3.0%)だったとします。寄り付きは1,028円で成立。戦略はショートで寄り約定し、前日終値と寄値の中間である1,014円に利確指値を置きます。9:25に1,014円に到達し利確。到達しない場合でも10:00のタイムリミットで成行決済する、といった運用です。

実装サンプル:MQL4 EA(JP225 CFD版・参考)

以下は、日経225(JP225)CFDを対象に、寄り付きギャップの平均回帰を「時間ベース」で模擬する参考実装です。ブローカーの銘柄名(例:JP225Cash, JPN225 等)とサーバー時間のオフセットを調整してください。教育目的のサンプルであり、動作や損益を保証するものではありません。


//+------------------------------------------------------------------+
//|  EA: JP225_GapReversal_Sample.mq4                               |
//|  Purpose: 寄り付きギャップの平均回帰を時間で模擬(教育目的)     |
//+------------------------------------------------------------------+
#property strict

input string  InpSymbol            = "JP225Cash";   // ブローカーの銘柄名に合わせる
input double  InpLots              = 0.10;          // ロット
input double  InpGapPercentThresh  = 0.80;          // エントリー閾値(%)
input int     InpOpenHour          = 3;             // サーバー時間での東京9:00相当の時
input int     InpOpenMinute        = 0;             // サーバー時間での東京9:00相当の分
input int     InpHoldMinutes       = 60;            // 最大保有時間(分)
input double  InpSL_ATR_Mult       = 0.6;           // ATR倍率のSL
input double  InpTP_HalfGapRatio   = 0.50;          // 半値埋め比率
input int     InpATRPeriod         = 14;            // ATR期間
input bool    InpOneTradePerDay    = true;          // 1日1回制限

datetime trade_open_time = 0;
double   entry_price     = 0.0;
int      last_traded_day = -1;

double iATRpoints(string sym, int period) {
   double atr = iATR(sym, PERIOD_M5, period, 0);
   return atr;
}

bool InTradingWindow() {
   datetime nowt = TimeCurrent();
   MqlDateTime mt; TimeToStruct(nowt, mt);
   if(mt.hour == InpOpenHour && mt.min >= InpOpenMinute && mt.min <= InpOpenMinute + 5) return true;
   return false;
}

double CalcGapPercent(string sym) {
   // 「前日終値」と「今日の寄り直前価格」を近似:直前のM5クローズを疑似的に使用
   double yclose = iClose(sym, PERIOD_D1, 1);
   double preopen = iClose(sym, PERIOD_M5, 1);
   if(yclose <= 0 || preopen <= 0) return 0.0;
   return (preopen - yclose) / yclose * 100.0;
}

void CloseAll(string sym) {
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderSymbol()==sym) {
            if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), Bid, 5);
            if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 5);
         }
      }
   }
}

int OnInit(){ return(INIT_SUCCEEDED); }
void OnDeinit(const int reason){}

void OnTick() {
   string sym = InpSymbol;
   if(Symbol()!=sym) sym = Symbol(); // 現在チャートのシンボル優先

   MqlDateTime mt; TimeToStruct(TimeCurrent(), mt);
   int today = (mt.year*10000 + mt.mon*100 + mt.day);

   // 日跨ぎの1回制限
   if(InpOneTradePerDay && today==last_traded_day) {
      // 保有中の時間管理
      if(trade_open_time>0 && (TimeCurrent()-trade_open_time) > InpHoldMinutes*60) {
         CloseAll(sym); trade_open_time=0; entry_price=0.0;
      }
      return;
   }

   // 既存ポジションのTP/SL管理
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==sym) {
         // 時間切れクローズ
         if(trade_open_time>0 && (TimeCurrent()-trade_open_time) > InpHoldMinutes*60) {
            CloseAll(sym); trade_open_time=0; entry_price=0.0; last_traded_day=today;
            return;
         }
      }
   }

   // エントリー判定(寄り直後の5分だけ)
   if(InTradingWindow()) {
      double gap = CalcGapPercent(sym);
      double atr = iATRpoints(sym, InpATRPeriod);
      if(atr<=0) return;

      double price = (gap>=0 ? Bid : Ask);
      double yclose = iClose(sym, PERIOD_D1, 1);
      double halfgap_target = yclose + ( (price - yclose) * (1.0 - InpTP_HalfGapRatio) );

      int ticket = -1;
      if(MathAbs(gap) >= InpGapPercentThresh) {
         // 正のギャップ(上方向)→ ショート
         if(gap > 0 && OrdersTotal()==0) {
            ticket = OrderSend(sym, OP_SELL, InpLots, Bid, 5, 0, 0, "GapShort", 0, 0, clrNONE);
            if(ticket>0) {
               entry_price = Bid; trade_open_time = TimeCurrent(); last_traded_day=today;
            }
         }
         // 負のギャップ(下方向)→ ロング
         if(gap < 0 && OrdersTotal()==0) {
            ticket = OrderSend(sym, OP_BUY, InpLots, Ask, 5, 0, 0, "GapLong", 0, 0, clrNONE);
            if(ticket>0) {
               entry_price = Ask; trade_open_time = TimeCurrent(); last_traded_day=today;
            }
         }
      }

      // 目標到達・ATRベースSL/TP(簡易)
      for(int j=OrdersTotal()-1; j>=0; j--) {
         if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==sym) {
            double sl = 0, tp = 0;
            if(OrderType()==OP_BUY) {
               tp = MathMin(halfgap_target, OrderOpenPrice() + atr*InpTP_HalfGapRatio);
               sl = OrderOpenPrice() - atr*InpSL_ATR_Mult;
               OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrNONE);
            }
            if(OrderType()==OP_SELL) {
               tp = MathMax(halfgap_target, OrderOpenPrice() - atr*InpTP_HalfGapRatio);
               sl = OrderOpenPrice() + atr*InpSL_ATR_Mult;
               OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrNONE);
            }
         }
      }
   }
}
  

リスク管理(最重要)

  • 1トレードの損失許容額を資金の0.5〜1.0%以内に制限。
  • 決算・大型材料の直後は除外。ギャップに「理由」が明確なときは平均回帰が働かないことがある。
  • 連敗時はロットを縮小し、検証で優位性が崩れていないかを再点検。

運用チェックリスト(朝のルーティン)

  • 今日の対象銘柄リスト(GAP%順)
  • 直近の重要ニュース確認
  • 板の厚さとスプレッド、寄り直前の気配
  • 発注(寄付成行/指値)と逆指値の準備
  • イグジット価格と時間の設定
  • 結果記録と日誌(スクショ・数値)

よくある失敗と対策

  • ギャップの理由を無視:材料の強弱を軽視せず、除外ルールを明確化。
  • 時間切れの先送り:時間リミット到達で必ず手仕舞い。次のチャンスに集中。
  • 無理な板への成行突入:スプレッドが広すぎるときは見送り。

用語ミニ辞典

ギャップ(GAP%)
前日終値と寄り直前の参考価格の差を前日終値で割った値。
寄付成行
寄り付きでの約定を狙う成行注文。
半値埋め
寄値から前日終値への差の半分を埋める動き。
平均回帰
過度の価格乖離が平均に戻る統計的傾向。

まとめ

夜間の薄い板で形成された価格は、翌朝の厚いオークションで修正されやすい——これが本戦略の根幹です。「シンプルなルール × 時間で切る × 記録と検証」を徹底すれば、初心者でも無理なく運用の土台を築けます。実装はExcelから始め、必要に応じてMQL4による半自動化へと拡張してください。

追加Q&A 1

Q1: ギャップ閾値はどう最適化しますか?

A1: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 2

Q2: ギャップ閾値はどう最適化しますか?

A2: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 3

Q3: ギャップ閾値はどう最適化しますか?

A3: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 4

Q4: ギャップ閾値はどう最適化しますか?

A4: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 5

Q5: ギャップ閾値はどう最適化しますか?

A5: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 6

Q6: ギャップ閾値はどう最適化しますか?

A6: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 7

Q7: ギャップ閾値はどう最適化しますか?

A7: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 8

Q8: ギャップ閾値はどう最適化しますか?

A8: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 9

Q9: ギャップ閾値はどう最適化しますか?

A9: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 10

Q10: ギャップ閾値はどう最適化しますか?

A10: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 11

Q11: ギャップ閾値はどう最適化しますか?

A11: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 12

Q12: ギャップ閾値はどう最適化しますか?

A12: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 13

Q13: ギャップ閾値はどう最適化しますか?

A13: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 14

Q14: ギャップ閾値はどう最適化しますか?

A14: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 15

Q15: ギャップ閾値はどう最適化しますか?

A15: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 16

Q16: ギャップ閾値はどう最適化しますか?

A16: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 17

Q17: ギャップ閾値はどう最適化しますか?

A17: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 18

Q18: ギャップ閾値はどう最適化しますか?

A18: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 19

Q19: ギャップ閾値はどう最適化しますか?

A19: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

追加Q&A 20

Q20: ギャップ閾値はどう最適化しますか?

A20: 統計的には絶対値が大きいほど平均回帰が強まりやすい一方、件数が減ります。±1.0%・±1.5%・±2.0%などの帯で勝率と平均Rを比較し、ポートフォリオ全体の分散を加味して選択します。フィルターの追加は一度に1つだけにし、改善が再現するかを必ずアウト・オブ・サンプルで確認します。

コメント

タイトルとURLをコピーしました