前回の記事では、テクニカル・ファンダメンタル・センチメントの3つのシグナルを統合するところまで実装しました。
今回はPhase 2のバックテストです。過去データを使って「このシグナルで実際に売買したらどうなっていたか」を検証します。勝率・プロフィットファクター・最大ドローダウンを計算して、戦略の実力を数字で確認します。
バックテストは「過去で儲かる戦略が未来でも儲かるとは限らない」という大前提があります。それでも実装する理由は、明らかに機能していない戦略を事前に弾くためです。過去データですら負けている戦略を本番で使うのはリスクが高すぎます。
自動売買システム開発の全体像——今どこにいるか
Phase 0:環境構築 ✅完了
Cursor・Python・GitHub・各種APIの設定
Phase 1:データ取得・分析 ✅完了
株価データ取得・テクニカル・ファンダメンタル・センチメントシグナルの統合
Phase 2:バックテスト ▶️未着手(今回)
▶️ バックテストエンジンの実装
▶️ 複数銘柄での検証
▶️ 勝率・最大ドローダウン・PFの計算
Phase 3:注文実行 ⬜未着手
kabu STATION APIで実際に注文を出します。
Phase 4:自動化 ⬜未着手
GitHub Actionsで毎日15時に自動実行。LINE Notifyでシグナルを通知します。
Phase 5:運用・改善 ⬜未着手
月次成績レポートの公開。戦略の見直しと改善を繰り返します。
バックテストの設計思想
今回実装したバックテストのルールはこちらです。
・エントリー:前日に「買い」シグナルが出たら翌日の価格で買い
・エグジット:前日に「売り」シグナルが出たら翌日の価格で売り、またはエントリー価格の3%下で損切り
・ポジションサイズ:1トレードのリスクが資金の1%になるように計算(100株単位)
・初期資金:300万円
1トレードのリスクを1%に抑える設計にしています。これは「退場しないこと」を最優先にした設計です。たとえ連続で負けても資金が一気に溶けないよう、ポジションサイズをコントロールしています。
バックテストの実装(backtest.py)
ポジションサイズの計算ロジックはこちらです。損切りラインとリスク許容額から逆算して株数を決めます。
stop_loss = price * 0.97 # エントリー価格の3%下を損切りライン risk_amount = capital * 0.01 # 資金の1% shares = int(risk_amount / (price - stop_loss)) shares = (shares // 100) * 100 # 100株単位に切り捨て
最大ドローダウンはnumpyで計算しています。
equity_array = np.array(equity_curve) peak = np.maximum.accumulate(equity_array) # 累積最高値 drawdown = (equity_array - peak) / peak * 100 max_drawdown = drawdown.min() # 最大下落率
ここで一つ落とし穴がありました。初期資金を変更したとき、run_backtest関数とcalc_performance関数の両方に同じ初期資金を渡す必要があるのに片方だけ変えてしまい、総リターンが-66%という異常な値が出ました。変数をinitial_capitalにまとめることで解決しました。
5銘柄のバックテスト結果(2025年9月〜11月)
初期資金300万円・1トレードリスク1%で5銘柄を検証した結果はこちらです。
・トヨタ(7203):+0.78% 勝率50% PF6.57 最大DD-1.85% ✅
・ソフトバンクG(9984):-2.98% 勝率0% PF0.0 最大DD-16.17% ❌
・ソニー(6758):-1.23% 勝率33% PF0.57 最大DD-2.87% ❌
・キーエンス(6861):結果なし(株価53,140円×100株=531万円 > 初期資金300万円)
・三菱UFJ(8306):+0.73% 勝率50% PF1.73 最大DD-1.46% ✅
結果を見て気づいたことを正直に書きます。
ソフトバンクGの最大ドローダウンが-16.17%と大きすぎます。株価が高いため1回のトレードで大きなポジションを取ってしまっています。ポジションサイズに上限を設ける必要があります。
キーエンスは株価が高すぎて300万円では1単元も買えません。高額株への対応が課題です。
3ヶ月という短期間のテストなのでサンプル数が少なすぎます。最低でも1〜2年分のデータで検証しなければ信頼性のある結論は出せません。これも今後の課題です。
バックテストの限界——これだけは理解しておいてほしい
バックテストで良い結果が出ても、本番で同じ結果が出るとは限りません。これをオーバーフィット(過学習)といいます。
過去データに合わせてパラメータを調整しすぎると、未来のデータには全く機能しない戦略ができあがります。「過去の株価チャートを見ながら売買ルールを作る」という行為は、テスト問題の答えを見ながら勉強するようなものです。
このブログでは正直に書くと決めているので、今回のバックテスト結果は「参考程度」として扱います。「バックテストで年利100%を達成した」という宣伝文句をよく見かけますが、そういったシステムのほとんどはオーバーフィットしています。実際に運用してみると全く機能しないケースがほとんどです。
本番での実績を積み重ねながら、戦略を継続的に改善していくことが重要です。
今回のまとめ
・✅ バックテストエンジンの実装完了
・✅ 1トレードリスク1%のポジションサイジング実装
・✅ 最大ドローダウン・プロフィットファクター計算
・✅ 5銘柄での検証完了
・✅ 課題の発見(ポジションサイズ上限・高額株対応・データ期間不足)
次回はPhase 3の注文実行に入ります。kabu STATION APIを使って実際に検証環境で注文を出してみます。
免責事項
本記事は筆者個人の体験・記録を目的としたものであり、特定の銘柄・金融商品への投資を推奨するものではありません。投資はご自身の判断と責任のもとで行ってください。過去の運用実績は将来の成果を保証するものではありません。

コメント