実効スプレッド管理で勝率を底上げ:初心者向け“執行コスト最適化”プレイブック(株・FX・暗号資産対応)

トレード実務

Execution Cost First.

実効スプレッド管理で勝率を底上げ:初心者向け“執行コスト最適化”プレイブック(株・FX・暗号資産対応)

「エントリー・エグジットのロジックは合っているのに、トータルで勝てない」。その原因の大半は、売買シグナルではなく“執行(Execution)”にあります。本稿は、実効スプレッド=表示スプレッド+手数料+スリッページを一つの指標にまとめて可視化し、時間帯・注文種類・板厚の三点だけで成績を底上げする入門プレイブックです。道具立てはシンプルで、証券会社(または取引所)の約定照会CSVと、Excel/Googleスプレッドシート、そして必要なら簡易ログ用のEA(MT4/MQL4)だけです。

1. 実効スプレッドとは何か

「スプレッドは0.2銭だから有利」といった宣伝は、ほぼ常に手数料とスリッページを含んでいません。あなたの損益に直接効くのは表示スプレッドではなく、約定ベースで支払った総コスト=実効スプレッドです。

定義(片道、買いの場合):

実効スプレッド[ポイント] = (約定価格 - 同時刻の中値) × 符号換算 + 手数料換算[ポイント] + スリッページ換算[ポイント]

売りのときは符号が逆になります。中値は (ベストビッド + ベストアスク) / 2。株式なら呼値単位、FXならpips/ポイント、暗号資産ならティック/ドルなど、同一単位に正規化してください。

実務では、次の三層が積み上がって実効スプレッドになります:

  • 表示スプレッド:板上のアスク−ビッド。
  • 手数料:明示手数料(取引所/証券会社)+インフラ費用(小さければ無視可)。
  • スリッページ:成行・指値ヒット時の滑り/部分約定の平均悪化。

結論:実効スプレッドを下げる=期待値の底上げ。勝率・損益比率・保有時間をいじる前に、まずコストを詰めるべきです。

2. 初心者でもできる計測フロー

  1. 約定データを取得:証券会社/取引所の約定照会CSVをダウンロード(約定時刻・売買区分・数量・約定価格・手数料)。
  2. 当時の気配を取得:可能ならティック(ベストビッド/アスク)または分足OHLCV。無ければ約定直前直後の成行気配を近似に使う。
  3. 中値を算出mid = (bid + ask)/2(分足しか無い場合は (high+low)/2 を暫定中値とする)。
  4. 実効スプレッドを計算:各取引でポイント換算したコストを足し上げる。損益はコスト差し引きの純額で評価。
  5. 時間帯別に平均化:1時間バケット(例:9:00-9:59)ごとに平均実効スプレッドを出す。
  6. 注文種類別に比較:成行/指値/逆指値/指値+条件(MIT, MOC など)で比較。
  7. 板厚フィルター:ベスト気配の合計厚みや出来高に閾値を設け、閾値未満のトレードを除去した場合の改善幅を測る。

ここまでで、あなたの実運用における“本当のコスト地図”が手元にできます。

3. 改善の三本柱:時間帯・注文種類・板厚

3-1. 時間帯最適化

市場は一日中、同じ“執行のしやすさ”ではありません。板が薄い時間帯やイベント前後は、表示スプレッドが同じでも滑りが拡大し、実効スプレッドが悪化します。あなたの過去データで最悪の時間帯を切るだけで、平均コストは即座に下がるはずです。

実践手順:

  • 約定時刻をローカル時間で丸め、1時間(または15分)ごとの実効スプレッドを平均。
  • “最悪上位20%の時間帯”を取引禁止リストに入れる。
  • イベント(決算・経済指標)直前直後にフラグを立て、悪化率を別集計。

3-2. 注文種類の使い分け

初心者ほど成行一択になりがちですが、指値・逆指値・条件付指値(MIT/IFD/OCO)の使い分けだけで滑りを抑えられます。コツは「指値は薄い板に置かない」「成行は厚い方へ小口分割」です。

チェックポイント:

  • 成行:板が厚い・出来高が出ている時間だけ使う。1回の注文数量を分割。
  • 指値:ベストに置くか、ベストから1ティック内側。深い板の直前に置かない(アイスバーグに飲まれる)。
  • 逆指値:損切り用は必須。約定優先で成行化(ストップ成行)を基本。ただし板が極端に薄い銘柄では幅を持たせる。
  • MIT/MOC:価格到達で成行化。イベント前後に限定して使い、通常時は避ける。

3-3. 板厚フィルター

「ベスト気配の合計数量 × 希望約定価格までの深さ」を現物的な“バケツ容量”と見なし、あなたの発注数量がその○%以下になる場面のみで取引します(例:あなたの発注がベスト+第二気配の合計の10%未満)。これだけで部分約定と滑りが激減します。

4. 期待値の作り直し:コスト込みの損益分解

取引1件あたりの期待値を、勝率・損益比率の前に“コスト”から分解します。

期待値[ポイント] = 勝率 × 利幅[ポイント] − (1−勝率) × 損幅[ポイント] − 実効スプレッド[ポイント]

この式の最後項を削るのが本稿の目的です。コストはあなたの管理次第で確実に下がる唯一の項です。

テンプレ計算式(スプレッドをpips、手数料をpips換算、滑りをpipsで):

<Excel/Sheets>
実効スプレッド(pips) = 表示スプレッド + 手数料換算 + 滑り
勝率 = 勝ち件数 / 総件数
平均利幅 = 勝ち平均pips
平均損幅 = 負け平均pips
期待値(pips) = 勝率 * 平均利幅 - (1-勝率) * 平均損幅 - 実効スプレッド
    

5. 具体例:株・FX・暗号資産のミニケーススタディ

5-1. 日本株・小型成長株(現物/信用)

あなたの過去30営業日の約定CSVを集計したところ、9:00-9:10の時間帯は平均実効スプレッドが通常の1.8倍でした。この時間を全面禁止にしただけで、1約定あたりのコストは平均で0.3ティック縮小。年間回転数が2,000回なら、0.3×2,000=600ティックの改善=おおよそ手数料何ヶ月分を相殺します。

さらに、板厚10万株以上・出来高上位30%銘柄のみで取引したところ、部分約定は半減、滑りは約40%減。ロジックは一切変更していません。

5-2. FX・USD/JPY(店頭/ECN)

表示スプレッド0.2銭でも、夜間は滑りが平均0.3pips。ロンドン立ち上がり(日本時間16〜18時)は滑り0.05pipsに縮小。執行時間をシグナルより優先してフィルタしたところ、同一ロジックで月次PFが1.12→1.34に改善。

さらに、成行を3回に分割(例:40%→40%→20%)。1回の平均滑りが0.08pips→0.04pipsに半減し、実効スプレッドが下がりました。

5-3. 暗号資産・BTC/USDT(現物/無期限)

ボラが高い時間帯は成行の滑りが致命的です。ATR(1h)の0.5%を“許容滑り上限”に設定し、ATRが閾値を超える時間帯は指値のみに限定。実効スプレッドは平均で36%低下。加えて、ベスト気配合計の15%を超える数量は即時禁止にした結果、強制ロスカットの連鎖も抑制されました。

6. 実務テンプレ:チェックリスト

  • 約定CSVを毎週取り込み、時間帯別・注文種類別・板厚別に実効スプレッドを計測しているか。
  • 最悪上位20%の時間帯は取引禁止に設定しているか。
  • 成行は厚い時間帯のみ/薄い時間帯は指値中心にしているか。
  • 1発注の数量は、ベスト+第二気配合計の10〜15%以内に収めているか。
  • 経済指標・決算などイベント前後のフラグを持ち、当該時間の執行ルールを別建てにしているか。
  • ATRや出来高で“市場の状態”を分類し、注文方式を切り替えているか。
  • 実効スプレッドを損益計算に常時反映しているか。

7. スプレッド・滑りの“単位合わせ”と換算

異なる市場・銘柄を比較するために、コストを1取引あたりの%やpipsに正規化してください。例:

  • 株:ティック=呼値単位。株価2,000円で呼値1円なら、1ティック=0.05%(概算)。
  • FX:1pips=0.01円(USD/JPY)。
  • 暗号資産:取引所の最小価格刻み(例:$0.10)を基準にティックに換算。

手数料は片道%をpips/ティックに換算して合算します。滑りは約定価格と気配の差分で計測します。

8. 初心者向けの簡易MQL4 EA(スプレッド/滑りログ)

MT4でスプレッドと滑りをCSVに記録する最小構成のEAです。バックテストではなく実弾ログ用。ロットは最小から。

//+------------------------------------------------------------------+
//|  SimpleExecLogger.mq4                                            |
//|  概要: 成行発注を小ロットで行い、スプレッドと滑りをCSVに記録       |
//+------------------------------------------------------------------+
#property strict
input string   Sym       = NULL;     // シンボル(NULL=現在のチャート)
input double   Lots      = 0.01;     // ロット(最小から)
input int      Slippage  = 5;        // 許容スリッページ(ポイント)
input string   CsvName   = "exec_log.csv";
int handle;
int OnInit(){
   string fn = CsvName;
   handle = FileOpen(fn, FILE_CSV|FILE_READ|FILE_WRITE|FILE_SHARE_WRITE, ';');
   if(handle!=INVALID_HANDLE){
      if(FileSize(handle)==0) FileWrite(handle,"time","symbol","bid","ask","spread_pt","type","req_price","fill_price","slip_pt","comm","swap");
      FileClose(handle);
   }
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason){}
void LogOrder(string typ, double req, double fill){
   double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double pt  = SymbolInfoInteger(_Symbol,SYMBOL_POINT);
   double spr = (ask - bid)/pt;
   double slip= MathAbs(fill - req)/pt;
   int h = FileOpen(CsvName, FILE_CSV|FILE_WRITE|FILE_READ|FILE_SHARE_WRITE|FILE_ANSI, ';');
   if(h!=INVALID_HANDLE){
      FileSeek(h,0,SEEK_END);
      FileWrite(h,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),_Symbol,bid,ask,spr,typ,req,fill,slip,AccountInfoDouble(ACCOUNT_COMMISSION),AccountInfoDouble(ACCOUNT_SWAP));
      FileClose(h);
   }
}
void OnTick(){
   static datetime lastTrade=0;
   if(TimeCurrent() - lastTrade < 300) return; // 5分おき
   lastTrade = TimeCurrent();
   string symbol = (Sym==NULL || Sym=="") ? _Symbol : Sym;
   double ask = SymbolInfoDouble(symbol,SYMBOL_ASK);
   double bid = SymbolInfoDouble(symbol,SYMBOL_BID);
   int    dig = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double vol = MathMax(MarketInfo(symbol,MODE_MINLOT), Lots);
   // BUY
   double reqBuy = ask;
   int tk = OrderSend(symbol,OP_BUY,vol,reqBuy,Slippage,0,0,"LOG_BUY",0,0,clrNONE);
   if(tk>0 && OrderSelect(tk,SELECT_BY_TICKET)){
      LogOrder("BUY", reqBuy, OrderOpenPrice());
   }
   // SELL
   double reqSell = bid;
   tk = OrderSend(symbol,OP_SELL,vol,reqSell,Slippage,0,0,"LOG_SELL",0,0,clrNONE);
   if(tk>0 && OrderSelect(tk,SELECT_BY_TICKET)){
      LogOrder("SELL", reqSell, OrderOpenPrice());
   }
}
//+------------------------------------------------------------------+

得られたCSVの spread_ptslip_pt を足し、手数料をポイント換算して加えれば、実効スプレッドの連続モニタとして機能します。ロットは常に最小、ニュース前後は停止してください。

9. よくある失敗と対策

  • “最狭スプレッド=最良”と誤解:滑り・手数料込みで評価すること。
  • 数量が大きすぎる:板厚の10〜15%を越える発注は原則禁止。
  • イベント時間を意識しない:禁止リストに入れ、別ルールに。指標カレンダーは毎週更新。
  • 一発成行:厚い時間帯でも分割執行が基本。
  • 検証時にコストを入れ忘れる:バックテスト・手仕舞いの両方で実効スプレッドを引く。

10. まとめ:ロジックより先に“執行”を磨く

本稿のポイントは一つです。実効スプレッドを測り、悪い時間・悪い板・悪い注文を切る。これだけで期待値は底上げできます。手持ちの戦略をいじる前に、まず執行コストを確実に削りましょう。改善幅は小さく見えても、回転数が高い戦略ほど年率で巨大になります。

コメント

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