取引コストとスリッページをバックテストに織り込む方法【Python】
「バックテストでは勝っていたのに、実運用ではトントンか負け」——よくある原因のひとつが 取引コストの過小評価 です。
手数料が無料の時代になっても、売買のたびに利益は少しずつ削られます。この「見えないコスト」を無視したバックテストは、机上では魔法のように勝ちます。この記事では、取引コストの正体と、Pythonでの織り込み方を解説します。
⚠️ 本記事は教育目的の情報共有です。投資は自己責任で行ってください。
目次
- 「手数料無料」でもコストはかかる
- コストの3つの正体
- Pythonでコストを織り込む
- 回転率(売買頻度)が利益を食う仕組み
- コストに強い戦略・弱い戦略
- まとめ
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) までどうぞ。
⚠️ 免責:本記事は教育目的の情報共有であり、投資助言ではありません。実際の投資判断はご自身の責任で行ってください。