Execution Cost First.
実効スプレッド管理で勝率を底上げ:初心者向け“執行コスト最適化”プレイブック(株・FX・暗号資産対応)
「エントリー・エグジットのロジックは合っているのに、トータルで勝てない」。その原因の大半は、売買シグナルではなく“執行(Execution)”にあります。本稿は、実効スプレッド=表示スプレッド+手数料+スリッページを一つの指標にまとめて可視化し、時間帯・注文種類・板厚の三点だけで成績を底上げする入門プレイブックです。道具立てはシンプルで、証券会社(または取引所)の約定照会CSVと、Excel/Googleスプレッドシート、そして必要なら簡易ログ用のEA(MT4/MQL4)だけです。
1. 実効スプレッドとは何か
「スプレッドは0.2銭だから有利」といった宣伝は、ほぼ常に手数料とスリッページを含んでいません。あなたの損益に直接効くのは表示スプレッドではなく、約定ベースで支払った総コスト=実効スプレッドです。
定義(片道、買いの場合):
実効スプレッド[ポイント] = (約定価格 - 同時刻の中値) × 符号換算 + 手数料換算[ポイント] + スリッページ換算[ポイント]
売りのときは符号が逆になります。中値は (ベストビッド + ベストアスク) / 2
。株式なら呼値単位、FXならpips/ポイント、暗号資産ならティック/ドルなど、同一単位に正規化してください。
実務では、次の三層が積み上がって実効スプレッドになります:
- 表示スプレッド:板上のアスク−ビッド。
- 手数料:明示手数料(取引所/証券会社)+インフラ費用(小さければ無視可)。
- スリッページ:成行・指値ヒット時の滑り/部分約定の平均悪化。
結論:実効スプレッドを下げる=期待値の底上げ。勝率・損益比率・保有時間をいじる前に、まずコストを詰めるべきです。
2. 初心者でもできる計測フロー
- 約定データを取得:証券会社/取引所の約定照会CSVをダウンロード(約定時刻・売買区分・数量・約定価格・手数料)。
- 当時の気配を取得:可能ならティック(ベストビッド/アスク)または分足OHLCV。無ければ約定直前直後の成行気配を近似に使う。
- 中値を算出:
mid = (bid + ask)/2
(分足しか無い場合は(high+low)/2
を暫定中値とする)。 - 実効スプレッドを計算:各取引でポイント換算したコストを足し上げる。損益はコスト差し引きの純額で評価。
- 時間帯別に平均化:1時間バケット(例:9:00-9:59)ごとに平均実効スプレッドを出す。
- 注文種類別に比較:成行/指値/逆指値/指値+条件(MIT, MOC など)で比較。
- 板厚フィルター:ベスト気配の合計厚みや出来高に閾値を設け、閾値未満のトレードを除去した場合の改善幅を測る。
ここまでで、あなたの実運用における“本当のコスト地図”が手元にできます。
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_pt
と slip_pt
を足し、手数料をポイント換算して加えれば、実効スプレッドの連続モニタとして機能します。ロットは常に最小、ニュース前後は停止してください。
9. よくある失敗と対策
- “最狭スプレッド=最良”と誤解:滑り・手数料込みで評価すること。
- 数量が大きすぎる:板厚の10〜15%を越える発注は原則禁止。
- イベント時間を意識しない:禁止リストに入れ、別ルールに。指標カレンダーは毎週更新。
- 一発成行:厚い時間帯でも分割執行が基本。
- 検証時にコストを入れ忘れる:バックテスト・手仕舞いの両方で実効スプレッドを引く。
10. まとめ:ロジックより先に“執行”を磨く
本稿のポイントは一つです。実効スプレッドを測り、悪い時間・悪い板・悪い注文を切る。これだけで期待値は底上げできます。手持ちの戦略をいじる前に、まず執行コストを確実に削りましょう。改善幅は小さく見えても、回転数が高い戦略ほど年率で巨大になります。
コメント