調整済み株価の落とし穴|100万円のバックテストで「買えない株」を買っていた

AIツール

AIを使いながら、日本株の売買判断を自動化するツールを作っています。

これまでの開発経緯は日本株AI自動売買ツール開発記録にまとめています。

前回は、初期資金100万円・100株単位・現物取引という条件を入れ、実際の資金を意識したポートフォリオバックテストを行いました。

その結果、100万円・最大2銘柄保有では、最終資産が約228.5万円になる結果が出ました。

ただし、検証をさらに進める中で新しい問題が見つかりました。

「100株を買うために必要な資金」の計算に、調整済み株価をそのまま使っていたのです。

調べてみると、バックテスト上では100万円以内で買えると判定されていても、当時の実際の株価では100万円では買えなかったケースが大量にありました。

そこで今回は、

売買判断に使う株価と、実際の購入資金を計算する株価を分離

して、100万円ポートフォリオをもう一度検証します。


前回は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%
トレーリングF213.8万円+113.83%-12.87%
Combined F212.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株
DISCO2022/1/24約97.9万円約314.5万円
SCREEN2022/1/26約24.5万円約110.7万円
任天堂2022/1/14約46.6万円約524.6万円
ソニーG2022/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万円
トレーリングF213.8万円238.8万円+25.0万円
Combined F212.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旧方式 最大DDrealistic 最大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%
トレーリングF238.8万円+138.81%78.00%-23.70%
Combined F224.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銘柄程度へ対象を広げるため、ユニバース管理の仕組みを作っていきます。

そして、バックテストを続けること自体を目的にせず、少額での実運用開始をゴールに開発を進めます。

コメント

タイトルとURLをコピーしました