AIに相談しながら改善している株式投資ツールに、バックテスト機能を追加しました。
これまで、カップウィズハンドルの買いタイミング判定を直したり、エリオット波動の買い候補を追加したりしてきました。
ただ、買い候補が画面に出るようになると、次に気になったのは「この条件は本当に役に立つのか」という部分です。
画面上でそれらしい候補が出ると、つい「この条件は良さそう」と思ってしまいます。逆に、候補が少ないと「もう少し条件をゆるめたほうがよいのでは」と感じます。
でも、その場の印象だけで条件を変えていくと、自分に都合のよいチャートだけを拾う道具になってしまう怖さがあります。
今回は、買い条件を感覚で直し続けないために、過去データで検証できるバックテスト機能をAI株式投資ツールへ追加した記録です。
- 2015年から2024年までの10年間で、買い条件を検証できるバックテスト機能を実装
- CLIだけでなく、Web UIから実行して結果を見られる画面も追加
- 総トレード数ゼロの原因を調べ、データ取得や流動性フィルターの前提も見直した
バックテスト画面で確認できること
今回追加したバックテスト機能では、過去の株価データを使って、今の買い条件がどのような結果になりそうかを確認できるようにしました。
簡単に言うと、「もし過去にこのルールで売買していたら、どんな結果になっていたか」を試す機能です。
今回できるようにしたことは、主に以下です。
- 2015年から2024年までの10年間で、買い条件を検証できるようにした
- コマンド操作だけでなく、Web画面から実行して結果を見られるようにした
- 結果がゼロ件になった原因を調べ、データ取得や対象銘柄の前提も見直した
バックテストを入れたからといって、すぐに勝てるルールが見つかるわけではありません。
ただ、少なくとも「なんとなく良さそうだから条件を採用する」という状態からは一歩進めます。
買い条件を感覚で直し続ける怖さが出てきた
AI株式投資ツールでは、これまでに買い候補を出すための条件を少しずつ増やしてきました。最初はテクニカル指標を見える化し、その後でカップウィズハンドルの判定を整え、さらにエリオット波動の買いシグナルも追加しました。
ここまで進むと、ツール上では候補が出るようになります。候補が多すぎると「もう少し厳しくしたい」と思いますし、候補が少なすぎると「条件を緩めたほうがよいのでは」と感じます。
ただ、画面に出てきた数件の印象だけで条件を変えると、検証ではなく好みに近づいてしまいます。最近見たチャートが強ければ強い条件が正しそうに見えますし、たまたま候補が少ない日を見れば条件が厳しすぎるように見えます。
私が作りたいのは、AIが自動で買う銘柄を決める道具ではありません。自分が確認するべき候補を絞り、判断材料を残し、あとから振り返れる道具です。そのためには、買い条件を思いつきで動かすのではなく、過去データでどのくらい機能したのかを見られる状態が必要でした。
バックテスト画面だけを見る前に、投資ツール全体で何を確認したかったのかを押さえておくと、候補を出す段階から条件を検証する段階へ進めた理由が分かりやすくなります。

今回はその続きとして、候補を出す段階から、候補の条件を検証する段階へ進めた感覚です。
バックテスト期間と対象銘柄は、都合のよい相場だけに寄せないよう決めた
バックテストで最初に決めたのは、どの期間と銘柄を対象にするかです。今回は、メイン評価期間を2015年1月1日から2024年12月31日までの10年間にしました。
短い期間だけを見ると、たまたまその相場に合った条件がよく見えてしまいます。たとえば最近の強い相場だけで見れば、上昇中の銘柄を拾う条件がかなり良く見えるかもしれません。でも、2020年のコロナショック、2021年の成長株バブル、2022年の成長株崩壊のように、相場の雰囲気が変わると同じ条件でも見え方は変わります。
だから今回は、複数の相場局面を含む10年間で見て、条件がどこで効き、どこで崩れるのかを確認できるようにしました。この時点で、勝てる条件を見つけたという話ではありません。まずは、検証の土台を偏らせすぎないための設計です。
対象ユニバースはTOPIX500を基本にし、流動性フィルターも入れました。
平均日次売買代金が1,000万円以上で、データ欠損率が5%以下という条件です。
流動性が低すぎる銘柄や、データが欠けすぎている銘柄まで含めると、数字だけは出ても実際に使いにくい結果になりやすいからです。
AIには売買ルールを壊さず、検証用の部品を分けて作ってもらった
実装で大事にしたのは、既存の売買ルールとバックテスト用の処理を混ぜすぎないことでした。
今のツールには、買い候補を評価するための判定ロジックがあります。そこへバックテスト固有の資産推移やトレードログの処理まで入れてしまうと、あとから何を直したのか分かりにくくなります。
そこで、バックテスト専用のロジックは新しいパッケージとして分けました。既存の判定ロジックはそのまま使い、検証側ではローソク足データを1日ずつ進めながら、シグナル、エントリー、決済、日次資産の推移を記録する形です。
特に注意したのは、未来の情報を使ってしまうルックアヘッドバイアスの実装になってしまっていないかです。シグナル判定には、その日までに見えているデータだけを渡し、エントリーはシグナルが出た当日ではなく翌営業日の始値にしました。さらに、初期値として0.1%のスリッページも入れています。
決済条件は、既存のルールに合わせました。エントリー価格から12%下落したら損切り、20%上昇したら半分利確、最高値から12%下落したらトレーリングストップ、保有期間は最大60日という考え方です。
AIには、モデル、指標計算、ポートフォリオ処理、データ読み込み、シミュレーター、CSV出力、テストを実装してもらいました。
画面で候補を確認する流れは、以前に買いタイミング表示を作ったときから続いています。今回のバックテスト画面は、その候補表示を「見て終わり」にしないための続きです。

買いタイミングを見る画面があるからこそ、その条件を後で検証できる場所も必要だと感じました。
実装結果
今回の実装で、バックテスト専用パッケージ、Web UI実行、進捗表示、結果確認、CSV出力まで一通りできました。これでようやく、買い条件を感覚だけで直すのではなく、結果を見ながら考えられる場所ができました。
ただし、バックテスト機能ができたことと、売買条件の有効性が確認できたことは別です。ここを混ぜないようにしたいです。今回できたのは、検証するための道具です。実際にカップウィズハンドルやエリオット波動の条件が、自分の運用に合うかはこれから見ていく段階です。
現時点では、カップウィズハンドル、エリオット波動の両方でのエントリーになります。
結果は、全然ダメですね。

まとめ
今回は、AI株式投資ツールにバックテスト機能を追加しました。
これまで買い候補を出す機能は作ってきましたが、候補が出るだけでは、その条件が本当に使えるのかは分かりません。そこで、過去データを使って、今の買い条件を検証できるようにしました。
次に見るべきなのは、総リターンだけではありません。総トレード数が少なすぎないか、勝率と平均損益のバランスはどうか、最大ドローダウンが自分の許容範囲に収まるか、利益が一部のトレードに偏りすぎていないか。そうした数字を見ながら、条件を育てる必要があります。
- カップウィズハンドル単独とエリオット波動単独で、結果がどう違うか。
- 候補数を増やしたとき、最大ドローダウンも増えすぎないか。
- 条件を変えたとき、最近の相場だけに過剰適合していないか。
投資ツールを作っていると、機能が増えるほど前に進んだ気になります。でも本当に大事なのは、機能を増やすことではなく、自分の判断が少しでも雑にならないようにすることです。
今回のバックテスト機能は、そのための足場です。候補が出たから買うのではなく、条件が良さそうに見えたから信じるのでもなく、数字を見て、失敗も見て、必要なら戻って直す。AIと一緒に投資ツールを作るなら、この「戻って直せる場所」を持っておくことがかなり大事だと感じました。

