取引コストとスリッページをバックテストに織り込む方法【Python】


「バックテストでは勝っていたのに、実運用ではトントンか負け」——よくある原因のひとつが 取引コストの過小評価 です。

手数料が無料の時代になっても、売買のたびに利益は少しずつ削られます。この「見えないコスト」を無視したバックテストは、机上では魔法のように勝ちます。この記事では、取引コストの正体と、Pythonでの織り込み方を解説します。

⚠️ 本記事は教育目的の情報共有です。投資は自己責任で行ってください。

目次

  1. 「手数料無料」でもコストはかかる
  2. コストの3つの正体
  3. Pythonでコストを織り込む
  4. 回転率(売買頻度)が利益を食う仕組み
  5. コストに強い戦略・弱い戦略
  6. まとめ

1. 「手数料無料」でもコストはかかる

多くのネット証券が「売買手数料0円」を打ち出しています。しかし実質的なコストはゼロではありません

なぜなら、あなたが「買える値段」と「売れる値段」には差(スプレッド)があり、その差は実質的に取引相手や仲介に渡っているからです。手数料という名前で取られないだけで、コストは確実に存在します。

2. コストの3つの正体

① スプレッド(買値と売値の差)

板(オーダーブック)には常に「買いたい人の最高値」と「売りたい人の最安値」に差があります。買ってすぐ売ると、この差の分だけ損をします。流動性の高い大型株では小さく、小型株では大きくなります。

② スリッページ(約定価格のズレ)

注文を出してから約定するまでに価格が動く、あるいは希望価格で全量約定しない現象です。特に:

  • 成行注文
  • 流動性の低い銘柄
  • 急変動している相場

で大きくなります。

③ マーケットインパクト

自分の注文自体が価格を動かしてしまう影響。個人の少額取引ではほぼ無視できますが、大きな金額になると効いてきます。

3. Pythonでコストを織り込む

最もシンプルなのは「ポジションが変化したとき(=売買が発生したとき)に往復コストを引く」方法です。

import numpy as np

# 往復コスト(片道の2倍)。大型株なら 0.05〜0.1%、小型株はもっと大きく見積もる
cost_per_trade = 0.001  # 0.1% = 10bps

# position は 0(現金) or 1(保有) などのポジション系列とする
# 売買量 = ポジションの変化の絶対値
df["trade"] = df["position"].diff().abs()

# コストをリターンから差し引く
df["strategy_return_net"] = df["strategy_return"] - df["trade"] * cost_per_trade

# コスト込み・コスト抜きの比較
gross = (1 + df["strategy_return"]).cumprod().iloc[-1] - 1
net   = (1 + df["strategy_return_net"]).cumprod().iloc[-1] - 1
print(f"コスト抜き: {gross*100:+.1f}%")
print(f"コスト込み: {net*100:+.1f}%")

💡 保守的に見積もるのが鉄則です。「これくらいかな」より少し高めのコストを入れて、それでも勝つ戦略だけを信用します。楽観的なコスト設定は、自分を騙す行為です。

4. 回転率(売買頻度)が利益を食う仕組み

コストは売買回数に比例して効いてきます。これを実感する簡単な計算をしてみましょう。

戦略年間売買回数往復コスト年間コストドラッグ
長期保有2回0.1%0.2%
月次リバランス24回0.1%2.4%
週次100回0.1%10%
デイトレード数百回0.1%数十%

週次でリバランスする戦略は、何もしなくても年10%のハンデを背負ってスタートします。「年利12%」のつもりが、コストを引くと「実質2%」になることも珍しくありません。

回転率が高い戦略ほど、コストの検証が死活問題になります。

5. コストに強い戦略・弱い戦略

コストに強い(売買が少ない)

  • 長期のバイ&ホールド
  • 月次・四半期リバランスの時系列モメンタム
  • 大型・高流動性銘柄中心

コストに弱い(売買が多い)

  • 短期の逆張り・スキャルピング
  • 小型株・低流動性銘柄
  • シグナルが頻繁に反転する戦略

戦略を設計する段階で「この戦略は年に何回売買するのか」を意識すると、後で痛い目を見ずに済みます。

6. まとめ

  • 「手数料無料」でも、スプレッド・スリッページという実質コストは必ずかかる
  • バックテストには 保守的な往復コスト を織り込む(ポジション変化時に減算)
  • コストは売買回数に比例。高回転戦略は大きなハンデを背負う
  • 回転率の高い戦略ほど、コスト検証が結果を左右する

コストを正しく引いて初めて、バックテストは「現実的な数字」になります。良すぎる成績を見たら、まずコストを入れ忘れていないかを確認してください。

評価指標の基礎はこちら → シャープレシオと最大ドローダウンとは? 実運用前の最終検証はこちら → ペーパートレード(仮想売買)とは?


質問や感想は X (@QuantNobu) までどうぞ。

⚠️ 免責:本記事は教育目的の情報共有であり、投資助言ではありません。実際の投資判断はご自身の責任で行ってください。