AIを使いながら、日本株の売買判断を自動化するツールを作っています。
これまでの開発経緯は日本株AI自動売買ツール開発記録にまとめています。
前回は、初期資金100万円・100株単位・現物取引という条件を入れ、実際の資金を意識したポートフォリオバックテストを行いました。
その結果、100万円・最大2銘柄保有では、最終資産が約228.5万円になる結果が出ました。
ただし、検証をさらに進める中で新しい問題が見つかりました。
「100株を買うために必要な資金」の計算に、調整済み株価をそのまま使っていたのです。
調べてみると、バックテスト上では100万円以内で買えると判定されていても、当時の実際の株価では100万円では買えなかったケースが大量にありました。
そこで今回は、
売買判断に使う株価と、実際の購入資金を計算する株価を分離
して、100万円ポートフォリオをもう一度検証します。
- 前回は100万円の資金制約まで実装した
- 「100万円で買える」の判定がおかしい
- フジクラでは45万円で買えるはずが、実際は約275万円必要だった
- 100万円以下と誤判定されるBUY候補が172件あった
- 売買判断用と約定用の株価を分ける
- 株式分割を保有中に跨いでも資産が飛ばないようにした
- 100万円ポートフォリオをもう一度検証
- 修正したら最終資産はむしろ増えた
- 「利益を過大評価していた」わけではなかった
- 最終資産は増えたが、最大DDはかなり悪化した
- それでも現時点では最終資産を重視したい
- 100万円では「どの株を買えるか」が戦略そのものになる
- Yahooの過去データが後から変わる問題も見つかった
- realistic方式でのSTOP比較
- そろそろ「いつ実運用するのか」を決めたい
- バックテスト中心の開発は、あと3テーマ
- その次は発注システムを作る
- 完成してから使うのではなく、小額で使いながら改善する
- まとめ
前回は100万円の資金制約まで実装した
これまでの開発では、
- 翌営業日始値での約定
- 固定STOP
- MFE・MAE分析
- トレーリングSTOP
- 固定STOP+トレーリングSTOP
- 100株単位
- 初期資金50万円・100万円
- 最大保有数
- 現物のみ
- cash管理
と、少しずつ実運用に近い条件を追加してきました。
前回の記事では、100万円・最大2銘柄という条件でSTOPを比較しました。
| STOP | 最終資産 | リターン | 最大DD |
|---|---|---|---|
| STOPなし | 228.5万円 | +128.53% | -12.80% |
| 固定STOP -15% | 203.8万円 | +103.83% | -16.23% |
| トレーリングF | 213.8万円 | +113.83% | -12.87% |
| Combined F | 212.0万円 | +112.04% | -12.41% |
この段階では、STOPなしが最終資産トップでした。
ただし、これはあくまで当時使っていた価格データを前提とした結果です。
今回、その前提に問題が見つかりました。
「100万円で買える」の判定がおかしい
今回まず疑問に思ったのが、
「なぜ100万円では買えないはずの銘柄を、バックテストでは買えているのか?」
という点でした。
原因を調べると、これまで使用していた株価データに行き着きました。
バックテストでは、yfinanceから取得した調整済み株価を使っています。
調整済み株価は、株式分割などがあった場合に過去の株価を調整し、長期間のチャートやテクニカル指標を連続的に扱いやすくしたものです。
これは移動平均線やRSIなどを計算するには便利です。
しかし、
調整済み株価 × 100株
をそのまま「当時100株を買うために必要だった金額」として使うと問題が起きます。
フジクラでは45万円で買えるはずが、実際は約275万円必要だった
分かりやすかったのがフジクラです。
フジクラでは2026年3月30日に6対1の株式分割がありました。
分割前日の2026年3月27日の価格を比較すると、大きな違いがありました。
| 価格基準 | 1株あたり | 100株の必要資金 |
|---|---|---|
| 調整済み価格 | 約4,562円 | 約45.6万円 |
| 当時の名目価格 | 約27,500円 | 約275万円 |
旧方式では、
「45.6万円あれば100株買える」
と判定されます。
100万円の資金があれば、当然BUY可能です。
しかし、当時実際に100株を買おうとすれば必要だったのは約275万円。
100万円では買えません。

売買シグナルを見るだけなら問題になりにくかった部分が、「100万円・100株」という資金制約を入れたことで大きな問題になりました。
100万円以下と誤判定されるBUY候補が172件あった
20銘柄のBUY候補を調べると、
旧方式では100万円以内なのに、当時の実際の価格では100万円を超える候補が172件
ありました。
一例です。
| 銘柄 | BUY日 | 旧方式100株 | realistic 100株 |
|---|---|---|---|
| DISCO | 2022/1/24 | 約97.9万円 | 約314.5万円 |
| SCREEN | 2022/1/26 | 約24.5万円 | 約110.7万円 |
| 任天堂 | 2022/1/14 | 約46.6万円 | 約524.6万円 |
| ソニーG | 2022/1/20 | 約25.3万円 | 約130.1万円 |
| 三菱重工 | 2023/2/6 | 約4.8万円 | 約50.45万円 |
銘柄によっては差がかなり大きくなっています。
つまり旧バックテストでは、
実際には資金不足で買えなかった銘柄を購入できるものとして扱っていた
ことになります。
売買判断用と約定用の株価を分ける
そこで今回、株価を2種類に分けました。
ADJ価格
調整済み株価です。
こちらは、
- 移動平均
- RSI
- MACD
- ボリンジャーバンド
- ADX
- SIGNAL
- Score
など、売買判断・テクニカル分析に使います。
EXEC価格
こちらは当時の名目価格を再現した価格です。
- BUY約定
- SELL約定
- 100株の購入必要資金
- cash
- equity
- 固定STOP
- トレーリングSTOP
など、実際のお金が動く処理に使います。
考え方としてはシンプルです。
売買判断 → 調整済み価格
実際の約定・資金管理 → 当時の名目価格
と役割を分離しました。
株式分割を保有中に跨いでも資産が飛ばないようにした
価格だけ戻せば終わりではありません。
株を保有している途中で株式分割が発生するケースもあります。
例えば2対1の株式分割なら、
100株を持っていた場合は200株になります。
同時に、取得単価やSTOP価格なども半分にする必要があります。
今回の実装では、
- 保有株数
- 取得単価
- 固定STOP
- 最高値
- トレーリングSTOP
も株式分割に合わせて変換するようにしました。
実際にSCREENの取引で確認しています。
100株を14,350円で購入し、その後2対1の株式分割を跨いだケースでは、
100株 × 14,350円 = 143.5万円
から、
200株 × 7,175円 = 143.5万円
へ変化します。
株数と単価は変わりますが、投資した経済価値そのものは変わりません。
分割前後でポートフォリオ資産が不自然に急増・急減しないことも確認しました。
100万円ポートフォリオをもう一度検証
realistic価格への修正後、前回と同じ100万円ポートフォリオを再検証しました。
主な条件は、
- 初期資金100万円
- 100株単位
- 最大2銘柄保有
- 現物のみ
- 既存20銘柄
- 約5年間
- 同日のBUY候補はScore順
- cash不足なら次の候補へ
です。
STOPについても前回と同じ4パターンを比較しました。
修正したら最終資産はむしろ増えた
結果は予想外でした。
| STOP | 旧方式 | realistic | 差 |
|---|---|---|---|
| STOPなし | 228.5万円 | 250.2万円 | +21.7万円 |
| 固定STOP -15% | 203.8万円 | 244.8万円 | +41.0万円 |
| トレーリングF | 213.8万円 | 238.8万円 | +25.0万円 |
| Combined F | 212.0万円 | 224.0万円 | +12.0万円 |
4パターンすべてで、realistic方式の最終資産が増えました。
最初は、
「今まで買えていた銘柄が買えなくなるなら、成績は悪くなるのでは?」
とも考えました。
ところが逆でした。
ただし、これはrealistic方式に変えたことで戦略性能が向上したという意味ではありません。
「利益を過大評価していた」わけではなかった
今回の結果で重要なのはここです。
高価格の銘柄が買えなくなると、その分cashが残ります。
すると、
高価格銘柄を見送り
↓
cashと保有枠が残る
↓
その後に出た別銘柄のBUYシグナルを採用
↓
ポートフォリオの中身が変わる
ということが起きます。
実際、STOPなしでは旧方式で購入していた取引のうち17件がrealistic方式では購入されませんでした。
その代わり、旧方式では購入していなかった別の12件が新たに購入されています。
SCREENは6回から3回へ減少。
ソニーGは7回から3回へ減少。
一方で、
アドバンテストは2回から4回。
IHIは4回から6回。
ホンダは5回から6回。
など、別の銘柄へ資金が回りました。
したがって、
「旧方式では利益を過大評価していた」
と単純には言えません。
正確には、
購入可能かどうかの判定が間違っていたため、現実とは別のポートフォリオをシミュレーションしていた
ということです。
最終資産は増えたが、最大DDはかなり悪化した
さらに面白かったのが最大ドローダウンです。
| STOP | 旧方式 最大DD | realistic 最大DD |
|---|---|---|
| STOPなし | -12.80% | -23.70% |
| 固定STOP -15% | -16.23% | -21.17% |
| トレーリングF | -12.87% | -23.70% |
| Combined F | -12.41% | -25.02% |
最終資産は4方式すべて増えました。
しかし最大DDは、すべて悪化しています。
STOPなしでは、
-12.80% → -23.70%
と、ほぼ倍です。
最終資産だけを見ていたら、
「realistic方式にしたら成績が良くなった」
と判断してしまうところでした。
実際には、利益だけでなくリスクの出方まで大きく変わっています。
それでも現時点では最終資産を重視したい
個人的には、realistic方式へ修正した結果、最終資産が減らず、むしろ増えていたことにはまず安心しました。
最大DDが-12.80%から-23.70%まで悪化した点は、もちろん改善できるなら改善したいです。
ただ、現時点ではDDを小さくすること自体を最優先にはしていません。
多少DDが大きくなったとしても、最終的に資産を増やせることの方を重視したいと考えています。
もちろん、同程度の利益を維持したままDDを下げられるのであれば、その方が理想です。
今回のrealistic方式では、STOPなしの最終資産が約250.2万円。
固定STOP -15%では約244.8万円でした。
差は約5.3万円まで縮まっています。
最終資産とリスクのバランスについては、今後も検証する価値がありそうです。
100万円では「どの株を買えるか」が戦略そのものになる
今回の検証で改めて分かったのは、
50万円・100万円程度の資金で100株単位の運用をする場合、銘柄単価そのものが戦略結果を大きく左右する
ということです。
売買シグナルがどれだけ優秀でも、必要資金が200万円なら100万円の口座では買えません。
そして買えない銘柄が1つ発生すると、その後のcash、保有枠、次のBUY候補まで変わります。
つまり資金制約付きのバックテストでは、
「どの銘柄が上がるか」だけでなく「その資金で実際に買えるか」
まで再現しないと、実運用とは違う結果になってしまいます。
Yahooの過去データが後から変わる問題も見つかった
今回、もう1つ気になる問題も見つかりました。
DISCOの2026年9月4日の過去データを再取得したところ、以前保存していたデータと最新のYahooデータで終値が異なっていました。
以前のデータでは55,070円。
再取得したデータでは54,460円。
610円の差があり、その影響で売買SIGNALもHOLDからBUYへ変化しました。
取得期間全体では終値が異なる日が563件ありましたが、SIGNALまで変化したのは1日でした。
バックテストを再実行するたびに過去データまで変わってしまうと、以前の検証結果を正確に再現できなくなる可能性があります。
そこで既存20銘柄については、これまで使用した調整済みデータを基準として固定できる仕組みも追加しました。
バックテストでは売買ロジックだけでなく、元になるデータをどう保存し、再現性を確保するかも重要だと分かりました。
realistic方式でのSTOP比較
修正後の4方式だけを比較すると、結果は次の通りです。
| STOP | 最終資産 | リターン | 勝率 | 最大DD |
|---|---|---|---|---|
| STOPなし | 250.2万円 | +150.19% | 73.91% | -23.70% |
| 固定STOP -15% | 244.8万円 | +144.85% | 66.67% | -21.17% |
| トレーリングF | 238.8万円 | +138.81% | 78.00% | -23.70% |
| Combined F | 224.0万円 | +124.03% | 71.62% | -25.02% |
最終資産ではSTOPなし。
最大DDでは固定STOP -15%が最も良い結果でした。
ただし、まだ20銘柄だけの結果です。
「STOPなしが最適」と結論づける段階ではありません。
そろそろ「いつ実運用するのか」を決めたい
ここまで開発を続けてきて、最近もう1つ気になっていることがあります。
「バックテストは、あとどれくらいやればいいのか?」
ということです。
検証を進めるたびに、
STOP。
トレーリングSTOP。
資金制約。
今回のrealistic価格。
と、新しい課題が見つかってきました。
もちろん実際のお金を使う以上、必要な検証は続けるべきです。
一方で、最終目標はバックテストを永遠に続けることではありません。
実際に自動売買ツールとして使うことです。
そこで今回、実運用開始までに残す検証を一度整理しました。
バックテスト中心の開発は、あと3テーマ
現時点では、実運用前に残す大きなバックテストテーマを3つに絞る予定です。
1. 実運用向けユニバース
現在の20銘柄は値嵩株も多く、50万〜100万円で100株運用するには偏りがあります。
100銘柄へ一気に増やすのではなく、まずは実際に購入可能で流動性もある40〜50銘柄程度へ広げる予定です。
2. 手数料・スリッページ
現在のバックテストには、まだ実際の売買コストが十分反映されていません。
手数料と、想定価格と実際の約定価格との差であるスリッページを入れて、それでも利益が残るか確認します。
3. 期間ごとの安定性
約5年間トータルで利益が出ただけでは不十分です。
前半・後半・直近期間などに分けて、一部の相場環境だけで利益を稼いでいないか確認します。
この3つを通過したら、バックテスト中心の開発はいったん区切る予定です。
その次は発注システムを作る
バックテストが一区切りしたら、
研究を続けるためのバックテスト
から、
小額で実運用するための開発
へ移ります。
予定しているのは、
実運用エンジン
↓
証券会社との発注連携
↓
二重注文や異常発注を防ぐ安全機構
↓
ペーパートレード
↓
50万円程度から人間承認付きで実運用
という流れです。
最初から完全自動売買にするつもりはありません。
まずはツールが注文内容を作り、人間が確認してから発注する半自動方式。
そこでバックテストと実際の約定の差を確認しながら、問題がなければ自動化を進める予定です。
完成してから使うのではなく、小額で使いながら改善する
自動売買ツールに「完全な完成」があるのかは分かりません。
実運用を始めた後も、
- 対象銘柄の拡大
- 信用取引
- 空売り
- 配当
- 税金
- 可変ロット
- セクター制約
- 売買ロジックの改善
など、やりたいことはいくらでもあります。
ただ、それらをすべて実装してから実運用を始めようとすると、いつまで経っても実際の取引データが得られません。
そのため、
必要最低限の安全性と現実性を確保したら、まず50万円程度から人間承認付きで実運用する。
その後、実際の取引結果を見ながら改良していく方向で進めます。
まとめ
今回の検証では、100万円ポートフォリオバックテストの価格処理を見直しました。
重要だったのは次の点です。
- 調整済み株価をそのまま100株の必要資金に使っていた
- 実際には100万円を超えるBUY候補が172件あった
- 売買判断用のADJ価格と、約定・資金管理用のEXEC価格を分離
- 株式分割を保有中に跨ぐ処理にも対応
- realistic化するとポートフォリオの中身そのものが変化した
- STOPなしの最終資産は約228.5万円→約250.2万円へ増加
- 一方、最大DDは-12.80%→-23.70%へ悪化
- 「旧方式が利益を過大評価していた」のではなく、別のポートフォリオをシミュレーションしていた
- 過去の株価データが後から変更される問題も確認
- バックテスト中心の開発は、あと3テーマで一区切りする方針にした
今回の検証で感じたのは、バックテストは売買ルールだけ正しくても十分ではないということです。
その時の資金で本当にその株を買えたのか。
ここまで再現して初めて、実運用に近いシミュレーションになります。
次は、現在の20銘柄から実運用を想定した40〜50銘柄程度へ対象を広げるため、ユニバース管理の仕組みを作っていきます。
そして、バックテストを続けること自体を目的にせず、少額での実運用開始をゴールに開発を進めます。



コメント