AI株システムを止めた理由。yfinanceの5分足をリアルタイム前提で使ったら、初日の検証が成立しなかった
前回の記事では、現在のAI株システムが「何を見て買い候補を出すのか」を書きました。
ここまで読むと、あとは市場が開いている間に自動で回せば、Paper Tradeで検証できそうに見えます。
私もそう思っていました。
でも実際に動かした初日、結果は0勝0敗ではありませんでした。
「その日の成績を付けてはいけない日」
になりました。
理由は、売買ロジックより手前にありました。
判定したい時刻に、必要な5分足がそろっていなかったからです。
前回の記事:AI株システムは何を見て「買い候補」を出す?現在の検証戦略を初心者向けに分解
システム自体は動いていた
最初に疑ったのは、そもそも自動実行が動いていなかった可能性です。
ところが記録を確認すると、そこは動いていました。
- 処理を起動する仕組み。
- 前回の状態を引き継ぐ仕組み。
- 結果を保存する経路。
こうしたインフラ側は動いていました。
それでも、その日の検証記録は成立しませんでした。
当日の予定実行は65回。
最終的には、その65回すべてが「INCOMPLETE」になっていました。
これは、
「条件に当てはまる場面が0件だった」
という意味ではありません。
「判定に必要なデータがそろわず、最後まで有効な判定ができなかった」
という意味です。
同じ0件に見えても、中身はまったく違います。
14:15のシグナルが、あとから見つかった
調査を進めると、14:15の足にはシグナル条件を満たす場面があったことが分かりました。
一瞬、
「じゃあ14:15にシステムは動いていたことにできるのでは?」
とも思いました。
でも、それはやめました。
そのシグナルを確認できたのは、あとからデータが取得できるようになった後です。
14:15の時点でシステムがそのデータを持っていなかったなら、
「14:15に判断できた」
とは言えません。
後から分かった情報を、当時も分かっていたことにすると、検証結果を都合よく作ることになります。
そこで、この日のPaper Tradeは無効扱いにしました。
1勝にも、1敗にも、0勝0敗にも入れません。
問題は「Yahoo!ファイナンスの画面」ではなく、データ取得経路だった
ここは誤解されやすいので、分けて書きます。
Pythonから株価データを取得するために使っていたのは、yfinanceというオープンソースのライブラリです。
yfinanceの公式ドキュメントにも、Yahoo, Inc.の公式製品ではなく、Yahooの公開APIを利用するオープンソースツールだと明記されています。
一方、Yahoo!ファイナンス日本版の現在のヘルプでは、東証・福証・札証の日本株について、Web上の取引値や日中足チャートはリアルタイム表示と案内されています。
つまり今回の記事で言っているのは、
「Yahoo!ファイナンスのWeb画面は20分遅れている」
という話ではありません。
私のシステムが、
yfinance経由で取得した5分足を、
判定したい時刻にRealtime用途でそのまま使える
と想定していたことが問題でした。
実際の運用では、必要な足が判定時刻にそろいませんでした。
そのため現在のシステムでは、yfinance経由の取得経路をRealtime Paper Tradeに使えるものとして扱わず、失敗時は止める設計にしています。
「遅れて届くなら待てばいい」では解決しなかった
ここで、
「遅れて届くなら、届くまで待てばいいのでは?」
と思うかもしれません。
でも、私が確認したかったのは、
「その時刻に、本当に判断できたか」
です。
あとになって14:15のデータを取得し、
「14:15に買ったことにする」
のでは、検証の意味が変わります。
コード上で未来の5分足を除外していても、
そのデータを提供元から実際にいつ取得できたのか
まで見ないと、当時は使えなかった情報を使うことになります。
この問題は、単にプログラムの時刻比較だけを見ていても気づきにくい落とし穴でした。
そこでRealtime Paper Tradeを止めた
原因を確認したあと、Realtime Paper Tradeを無理に続けるのはやめました。
現在は、
Realtime Paper Trade
→ 凍結
市場終了後のDaily Replay
→ 継続
という運用に切り替えています。
Daily Replayでは、その日の取引が終わったあとに確定した5分足をそろえて、
「この固定条件なら、どこでシグナルが出て、その後どうなったか」
を時系列に沿って再生します。
これはRealtimeで売買できた実績ではありません。
実際の注文も出していません。
あくまで、戦略そのものに検証する価値があるのかを見るための別実験です。
「データがある」と「その時に使える」は別だった
今回、一番大きかった学びはこれでした。
あとから株価データが残っている。
それだけでは、
その時刻にシステムがそのデータを使えた証拠にはならない。
自動化では、
- コードが動いたか
- データを取得できたか
- いつ取得できたか
- その時点で使ってよいデータだったか
を分けて考える必要があります。
私は最初、
「5分足を取得できる」
までしか見ていませんでした。
でもRealtimeで検証するなら、
「その5分足が、判定したい時刻までに取得できる」
ところまで確認しないといけませんでした。
AI監査を通しても、前提が間違っていれば止まる
このシステムは、コードのテストやAIによる独立監査をかなり重ねていました。
それでも初日の検証は成立しませんでした。
だからといって、監査が無意味だったわけではありません。
コード内部のルールを固めていたからこそ、
「システムそのものが動いていない」のか、
「データ取得の前提が合っていない」のか
を切り分けやすくなりました。
ただ、
「テストが通った」
「監査で承認された」
と、
「現実の環境で前提どおり動く」
は別です。
AIにコードを書かせるだけではなく、外部サービスやデータ提供元との境界まで実測しないといけない。
ここは、実際に動かして初めて分かった部分でした。
今は「正常な0件」を確認できるところまで戻した
Realtimeを止めたあとも、すぐにDaily Replayが完成したわけではありませんでした。
次に出てきたのが、
「1日に必要な5分足が本当に全部そろっているのか」
という問題です。
現在のDaily Replayでは、現行仕様で1銘柄あたり64本の5分足を期待入力とし、それがそろっていることを確認してから判定します。
データが完全で、そのうえでシグナルが0件なら、
「今日は正常に0件だった」
と言える。
逆に、データが足りないなら、
「0件」
ではなく異常として止める。
最初の運用で起きた「記録ゼロ」の失敗から、
正常な0件と、異常な0件を分ける
という考え方が、今のシステムにも残っています。
まとめ:止める判断もシステムの一部だった
AIで株のシステムを作ると聞くと、
どうやって勝つか
に目が行きます。
私も最初はそうでした。
でも実際に作っていると、
「この結果を成績として数えていいのか」
を決める方が難しい場面があります。
今回の初日は、無理に1勝や1敗へ変換せず、
無効な1日
として残しました。
そしてRealtime Paper Tradeも止めました。
結果だけを見ると、前進していないように見えます。
でも、
使えないデータで勝率を作らない
というルールを残せたことは、この実験ではかなり大きな成果だと思っています。
次は、Realtimeを止めたあとに始めたDaily Replayで、
「本当に正常な0件」
をどう確認しているのかを書きます。
参考
※この記事は2026年8月27日時点の実験記録です。実際の売買は行っていません。特定銘柄の推奨、投資助言、利益の保証を目的としたものではありません。
※Yahoo!ファイナンスのWeb表示と、yfinance経由で取得するデータの性質は同一ではありません。本記事では、実際にこのシステムで使った取得経路の検証結果について記録しています。