
※本記事にはアフィリエイト広告(プロモーション)が含まれています。
バックテストの結果を見るとき、多くの人は勝率やプロフィットファクター(PF)にまず目が行きます。しかし取引回数の多い戦略では、手数料とスリッページという「コスト」が成績を大きく削っていることがあります。今回は、このコストを定量的に捉える考え方を整理します。
取引コストには何が含まれるか
ボットの実質的な成績を考えるとき、無視できないコストは大きく3つに分けられます。
- 手数料(メイカー/テイカー): 取引所に支払う手数料。テイカー注文はメイカーより高くなるのが一般的です。詳しくはメイカー/テイカー手数料の記事で解説しています
- スリッページ: 想定した価格と実際の約定価格のズレ。板が薄い銘柄・時間帯ほど大きくなりやすい点はスリッページの記事で触れた通りです
- スプレッド: 買値と売値の差。成行注文で即座に約定させる場合、このスプレッドも実質的なコストとして乗ってきます
これらは1回あたりでは小さく見えても、取引回数が増えるほど積み上がります。
コストを「取引頻度」に対する比率で考える
コストの影響をざっくり見積もる式は次のようになります。
往復コスト率 = 手数料率 × 2 + 想定スリッページ率 × 2
日次コスト負担 = 1日の取引回数 × 往復コスト率
月間コスト負担 ≒ 日次コスト負担 × 30
たとえば往復コストが0.08%(手数料0.02%×2 + スリッページ0.02%×2)の戦略が1日4回取引するなら、1日あたり0.32%、1ヶ月(30日)でおよそ9.6%がコストとして消えていく計算になります。これは戦略自体の優劣とは関係なく、取引頻度に比例して効いてくる固定的な負担です。
※手数料率やスリッページの実際の値は取引所・銘柄・時間帯によって変わります。具体的な数値で判断する際は、必ず公式の最新情報や自分の取引ログで確認してください。
ブレークイーブン勝率を計算する
コストを踏まえると、「勝率何%以上あれば損益がプラスになるか」という損益分岐点(ブレークイーブン勝率)を計算できます。平均利益と平均損失の比率(ペイオフレシオ)をRとすると、コスト抜きのブレークイーブン勝率は次の式で求められます。
ブレークイーブン勝率 = 1 / (1 + R)
ここにコストを加味すると、必要な勝率はさらに高くなります。Pythonで確認してみます。
def breakeven_winrate(payoff_ratio: float, cost_rate: float, avg_loss: float) -> float:
"""
payoff_ratio: 平均利益 / 平均損失
cost_rate: 1トレードあたりの往復コスト率(例: 0.0008 = 0.08%)
avg_loss: 平均損失率(例: 0.01 = 1%)
"""
# コストを損失側に加算して必要勝率を再計算する
effective_loss = avg_loss + cost_rate
effective_gain = avg_loss * payoff_ratio
return effective_loss / (effective_gain + effective_loss)
# 例: 平均利益が平均損失の1.5倍、平均損失1%、往復コスト0.08%の場合
wr_no_cost = 1 / (1 + 1.5)
wr_with_cost = breakeven_winrate(payoff_ratio=1.5, cost_rate=0.0008, avg_loss=0.01)
print(f'コスト抜きのブレークイーブン勝率: {wr_no_cost:.1%}')
print(f'コスト込みのブレークイーブン勝率: {wr_with_cost:.1%}')
このように、コストを加えるだけで必要な勝率が数ポイント上がることが分かります。成績指標の読み方の記事でも触れていますが、勝率やPFを単体で見るのではなく、コストを含めた上で判断することが重要です。
バックテストにコストをどう組み込むか
移動平均クロス戦略の記事やウォークフォワード検証の記事でも紹介した通り、シグナルが反転したタイミングでコストを差し引く実装が基本になります。
def apply_trading_cost(strategy_returns, signal, fee_rate=0.0004, slippage_rate=0.0004):
"""シグナルが変化した(=取引が発生した)タイミングでコストを引く"""
trades = signal.diff().abs().fillna(0)
round_trip_cost = (fee_rate + slippage_rate) * 2
return strategy_returns - trades * round_trip_cost
バックテストの罠の記事でも指摘した通り、コストを入れ忘れたバックテストは本番と大きくズレます。コストの有無で成績がどれだけ変わるかを並べて見るだけでも、その戦略が本当に「取引頻度に見合うリターン」を出せているかの判断材料になります。
取引頻度とコストの関係を意識する
一般的な傾向として、次のような整理ができます。
| 戦略の傾向 | 取引頻度 | コストの影響 |
|---|---|---|
| 高頻度でわずかな値動きを狙う | 多い | 1回あたりの利幅が小さいため、コストの比率が相対的に大きくなりやすい |
| 低頻度でトレンドを狙う | 少ない | 1回あたりの利幅が大きいため、コストの比率は相対的に小さくなりやすい |
これは「高頻度=悪い」という話ではなく、取引頻度が上がるほど、コストに対してどれだけのリターンを上乗せできているかをより厳密に検証する必要があるという意味です。特にメイカー注文中心かテイカー注文中心かで往復コストが大きく変わるため、注文方法の選び方も合わせて見直す価値があります。
まとめ
- 取引コストは手数料・スリッページ・スプレッドの合計として考える
- コストは取引頻度に比例して積み上がるため、高頻度戦略ほど影響が大きい
- ブレークイーブン勝率を計算すると、コストが「必要な勝率」をどれだけ押し上げるかが分かる
- バックテストにコストを組み込んで、コストの有無で成績がどう変わるかを比較する
- 具体的な手数料率は変更されることがあるため、判断の際は必ず公式の最新情報を確認する
コストの影響を数字で把握しておくと、「勝率が高いのに資産が増えない」といった戦略の見落としに早く気づけるようになります。