プログラミングを本業としない会社員が、AIに日本語で指示を出すだけで、日本株の自動売買システムを作りました。毎朝7時に全市場・約4,400銘柄をスクリーニングし、9時15分から15時20分まで無人で売買し、夜10時には自分で反省文まで書くシステムです。30営業日の成績は、決済278回・84勝194敗・累計−175,389円。この記事では、その作り方と「なぜ負けているのか」を、数字を隠さず全部書きます。
先に大前提をひとつだけ。売買はすべてペーパートレード(仮想売買)で、実際のお金は1円も動いていません。仮想資金300万円でルールとシステムを検証している段階です。つまりこれは「儲かった話」ではなく、「AIでどこまで作れて、どこで壊れるのか」の一次記録です。
目次
- 毎朝7時、Mac miniが約4,400銘柄をふるいにかける
- 30営業日で決済278回、84勝194敗。負けの中身を分解する
- ソニー株を72秒で−14,908円。「幻の約定」が発覚した日
- コードは1行も書いていない。自動売買開発で人間がやったのは「決める」と「疑う」だけ
- 本番初日、朝の自動処理が全滅した
- これから自動売買を作る人へ、実体験からの注意点4つ
- まとめ — 30日で17万円負けて得たもの
毎朝7時、Mac miniが約4,400銘柄をふるいにかける
そもそもなぜ作ったのか。会社員の私は平日9時から15時まで仕事をしていて、物理的に板を見られません。そして裁量トレードは「ルール通りやったのか、気分でやったのか」が後から検証できず、改善のしようがない。ならば売買ルールを全部コードにして、日中はシステムに任せ、夜にログを検証するほうが現実的だと考えました。
システムはPython + FastAPI + SQLiteで作り、自宅のMac mini(M4)で24時間動かしています。データソースはYahoo FinanceとJ-Quants(日本取引所グループ公式のデータAPI)の2本柱。平日の1日は、人間が寝ている間に始まります。
朝7時、スケジューラーがJ-Quantsから全市場・約4,400銘柄の日足データを一括取得し、流動性・ボラティリティ・モメンタム・出来高増加でスコアリングして、その日の監視銘柄40をまず機械的に選びます。そこにAI(Claude)が「今日この銘柄を見る意味があるか」という観点で最優先の10銘柄をマーク。スコア上位200銘柄も場中スキャナーの母集団として保存し、選定に失敗した日は前営業日のリストに自動フォールバックする保険付きです。
9時3分から9時15分は寄り付きのギャップ検知で、前日比±2%以上のギャップが出て初動を維持している銘柄に早期エントリー(1日最大3件)。9時15分から15時20分が本番の自動売買で、ブレイクアウトとVWAP(出来高加重平均価格)を組み合わせた順張りが基本戦略です。個別のエントリー判断は8つのテクニカル指標の組み合わせで行い、指標だけでは白黒つかないグレーゾーンの局面はAI(Claude)に判定させる二段構えにしています。場中も5分ごとに監視対象外の銘柄をスキャンし、前日比±3%または15分で±1.5%動いた銘柄を監視リストに追加(総上限50銘柄)。急騰銘柄への飛び乗り、いわゆる高値掴みを防ぐため、途中追加した銘柄は「VWAPへの押し→反発確認」を待ってからしか入れないルールです。
リスク管理は全部コードで縛っています。ポジションサイズはハーフケリー基準で計算し、1銘柄の上限は大型株31%・中型20%・小型15%、総エクスポージャーは720万円まで。同一セクターは最大3銘柄、レバレッジ上限3倍、売買回数は1日最大50エントリー・50決済です。そして1日の損失が仮想資産の−3%に達したら全決済して当日停止、15時20分に全ポジション強制決済で持ち越しゼロ。「損切りラインは狭める方向にしか動かせない」という制約までシステム側に入れました。人間の意思の強さを一切あてにしない設計です。
資金は複利型で、仮想の初期資金300万円にその日の実現損益を積み上げて翌営業日に引き継ぎます。負ければ翌日の元手が減り、ポジションサイズも自動的に縮む。実資金と同じ痛みの構造を、仮想資金でも再現しているわけです。引け後は15時40分にその日の全売買をレビューし、22時に夜間サマリーを生成し、日曜の夜にはルール改善の検討まで自動で回します。
ここまで読むと、それなりに賢そうなシステムに見えると思います。では、成績を見てください。
30営業日で決済278回、84勝194敗。負けの中身を分解する
運用30営業日の結果は、決済278回・84勝194敗・累計−175,389円。勝率は30.2%、1日あたり平均9回強の決済で、日次平均にならすと約5,800円ずつ負けている計算です。繰り返しますが仮想資金なので、失ったお金はゼロ。失ったのは電気代と、私のささやかな自尊心だけです。
数字を分解すると、負け方には特徴があります。勝率3割という数字自体は、損を早く切って利を伸ばす順張り型では珍しくありません。問題は、それで収支を合わせるには勝ちトレードの利幅が負けの損失を十分に上回る必要があるのに、現状は勝ちの合計が負けの合計に17.5万円届いていないこと。つまり「損小利大」を狙った設計が、実際には「損小利小」で着地しているわけです。
一方で、安全装置は仕事をしています。日次−3%の全決済リミットと15時20分の強制決済があるため、一発退場級の大負けは30日間で一度も起きていません。複利型の資金管理なので、負けが続けば翌日の建玉サイズが自動的に小さくなり、傷が浅いうちにブレーキがかかる構造です。負けてはいるが、破綻はしない。検証段階のシステムとしては、まずこの状態を作れたことに意味があると考えています。
もうひとつ大事なのは、この278回すべてに「なぜ入ったか」「なぜ出たか」の記録が残っていることです。裁量トレードで30日負けたら、残るのは後悔だけです。システムトレードで30日負けると、278行の検証データが残ります。どのエントリー根拠が機能して、どれがしなかったかを引け後のレビューで自動集計しているので、負けはそのまま次のルール改善の材料になります。
ただ、実はこの成績、一時期は実際よりずっと良く見えていました。システムが「市場に存在しない価格」で売買していたからです。
ソニー株を72秒で−14,908円。「幻の約定」が発覚した日
ある日のログに、奇妙な取引が残っていました。ソニーグループ(6758)を3,475円で買い、わずか72秒後に3,330円で損切り、−14,908円。1分ちょっとで145円も逆行するのは、値動きとしてどう考えても不自然です。
調査して分かった事実はこうでした。その日、リアルタイムの板情報を受け取るWebSocket接続が「セッション失効」を10,418回繰り返して、ライブデータを一切受信していなかった。しかも失効したまま同じ接続先に再接続を試み続けるだけで、再ログインして新しい接続を張り直す処理が入っていませんでした。それでもシステムはエラーひとつ出さず、バックアップ経路であるYahoo Financeの5分足——15〜20分の遅延がある——を使って売買を続けていたのです。買値の3,475円は15〜20分前の価格で、注文した瞬間の実際の株価はすでに3,330円付近。つまり、市場に存在しない価格で買った直後に、現実の価格で損切りされていました。その日の16件の取引は、すべてこの状態で約定していました。皮肉なことに、可用性のために用意した「バックアップデータへのフォールバック」こそが毒だったわけです。
本当に怖いのは、逆方向のケースです。遅延した価格での約定は「実際には買えない有利な価格で買えたこと」になり、幻の利益が成績に積み上がります。エラーゼロで動き続けるシステムが、実力より良い成績を報告してくる——検証データそのものが汚染されるので、バグとしては最悪の部類です。実際、この日の取引を元に自動生成していたブログ記事は、公開を取りやめて下書きに戻しました。
修正は徹底しました。約定価格は板情報(買いは売り気配、売りは買い気配)ベースに変更し、板の鮮度が15秒より古ければエントリー自体を見送る。必要株数が板の気配数量を超える注文はブロック。WebSocketはセッション失効を検知したら自動で再ログインして接続を張り直す。「新鮮な板がなければ約定しない」を絶対条件にしたことで、幻の約定は根絶されました。冒頭の−175,389円は、この修正後の板価格ベースで刻まれた、脚色なしの数字です。
では、こういうバグを、コードを書けない人間がどうやって見つけて直しているのか。次はその話です。
コードは1行も書いていない。自動売買開発で人間がやったのは「決める」と「疑う」だけ
このシステムのコードを、私は1行も書いていません。実装はすべてClaude Code(AIコーディングエージェント)の仕事です。「朝7時にJ-Quantsで全市場をスクリーニングして40銘柄に絞りたい。セクターが偏らないように」と日本語で伝えると、Pythonのコードになって返ってきます。私は平日の夜と週末にこのやり取りを繰り返して、システムを育ててきました。
人間の仕事は2つだけ残ります。ひとつは「決める」こと。何を作るか、どのルールで売買するか、どこまでをシステムに任せるか。たとえば「損切りは狭める方向にしか動かせない」というルールは、AIが提案したものではなく、私が自分の意思の弱さを知っているから入れた仕様です。もうひとつは「疑う」こと。幻の約定バグの発見も、起点はAIではなく「この損切り、値動きとして不自然では?」という人間側の違和感でした。エラーログには何も出ていないので、疑わなければ永遠に見つからなかったはずです。
「疑う」を仕組みにしたのが、定期的な監査です。実装を任せきりにせず、「エントリー判断は本当に設計どおりのデータ経路を通っているか」「約定価格は現実に取引できる価格か」を、動いているシステムに対してAIと一緒に総点検する。幻の約定も、この監査の徹底で初めて全容がつかめました。作るときのAIは頼れる実装者ですが、監査のときのAIは自分の書いたコードの検察官にもなってくれます。
もうひとつ効いた工夫は、仕様書をAIに読ませ続けることです。設計方針・運用ルール・過去の障害と対策をMarkdownの文書にまとめ、Claude Codeが作業前に毎回読む運用にしています。これがないと、開発セッションをまたぐたびに過去の決定が忘れられ、一貫性のないコードが増えていきます。AIは書くのは速い。しかし「何が正しいか」は、使う側が文書で定義し続けるしかありません。
それでも、システムは止まります。しかも、一番嫌なタイミングで。
本番初日、朝の自動処理が全滅した
常時運用を始めた初日の朝、スクリーニングを含む自動ジョブが全滅していたことがあります。原因はコードのバグではなく、Claude CodeのCLIがアップデートで認証情報の保存先をmacOSのKeychainに変更したこと。手動で実行すれば正常に動くのに、cron(自動実行の仕組み)から起動した途端「Not logged in」で全ジョブが失敗する、という状態でした。
後日、Pythonを3.9から3.11へ更新した際にも似たことが起きます。cronから仮想環境のスクリプトを起動した場合だけ権限エラーで即死し、取引処理が丸一日止まりました。手動で叩けば何度でも成功するので、原因の切り分けはcron環境で実験を繰り返すしかなく、最終的に「cronからはスクリプト経由ではなくPythonのモジュール実行形式で直接起動する」という回避策にたどり着きました。どちらの障害も共通するのは「手動では動くのに、自動では動かない」というパターンです。自動化システムの障害は、コードの中ではなく、認証・権限・実行環境といったコードの外側からやってくる。これが30日運用しての実感です。
対策として、監視の仕組みを本体とは別に作りました。プロセスの死活を定期チェックして異常があればSlackに通知し、毎平日16時にはサーバーを自動再起動して状態をリセットする。ペーパートレードだから「止まっても笑い話」で済みますが、実資金で丸一日の停止は洒落になりません。この経験が、次の注意点につながります。
これから自動売買を作る人へ、実体験からの注意点4つ
同じことをやってみたい方へ、30日分の失敗から抽出した注意点です。一般論ではなく、全部私が実際に踏んだものです。
- データの遅延を最初から疑う。 無料で取れる株価データには遅延があるものが多く、遅延データで約定させると成績そのものが幻になります。「このデータは何分前のものか」「古いデータしかないとき、システムはどう振る舞うか」を設計の最初に決めてください。私はここを曖昧にしたまま走らせて、検証データを丸ごと汚染しました。今は「鮮度15秒以内の板がなければ取引しない」を最優先ルールにしています。取引機会を失うことより、嘘のデータで取引することのほうがはるかに高くつくからです。
- 負けるたびにルールを増やさない。 84勝194敗という結果を見ると、負けトレードを潰すルールを次々に足したくなります。しかし過去の負けにピンポイントで効くルールは、過去にだけ強いシステムを作る近道です。私はルール変更を週次のレビューでまとめて検討する運用にして、場当たり的な改造を自分に禁じています。
- 障害監視を、本体と同じ熱量で作る。 自動売買システムは「静かに壊れる」のが得意です。エラーゼロで間違い続けた幻の約定も、認証切れの朝も、監視がなければ気づくのは数日後だったはずです。死活監視と通知は、売買ロジックより先に作ってもいいくらいだと思います。
- 規約と法律の線引きを、実資金の前に確認する。 自動発注を認めるかどうか、APIの利用条件はどうなっているかは証券会社ごとに異なります。また、売買シグナルを他人に提供する行為は投資助言・代理業の登録に関わる領域です。私が実資金に移行していない理由は、システムの検証が済んでいないことに加えて、この線引きを納得いくまで確認してからにしたいからです。
そして何より、必ずペーパートレードから始めてください。検証できていないシステムに実資金を入れるのは、開発ではなくギャンブルです。
まとめ — 30日で17万円負けて得たもの
30営業日・決済278回・84勝194敗・累計−175,389円。数字だけ見れば失敗ですが、仮想資金だったおかげで、この間に「幻の約定」「認証断絶」「勝率30.2%という現実」を授業料ゼロで手に入れました。板価格ベースの正確な記録が揃った今が、ようやく本当の検証のスタートラインだと考えています。
- 非エンジニアでも、Claude Codeがあれば自動売買システムの設計・構築・常時運用まで個人で到達できます。ただしコードを書かない代わりに、仕様を決める仕事と、結果を疑う仕事は最後まで人間に残ります。
- エラーが出ていないことと、正しく動いていることは別物です。うちのシステムは、エラーゼロのまま市場に存在しない価格で16回売買しました。
- 負けの数字を公開できるのは、ペーパートレードで、かつ全売買が記録されているからです。検証しきるまで実資金には移りません。
続報も、勝っても負けてもこのブログで数字ごと公開していきます。
免責事項: 本記事は筆者個人の開発記録であり、特定の銘柄・投資手法の推奨や投資助言を目的とするものではありません。記事中の売買はすべてペーパートレード(仮想売買)であり、実際の資金は使用していません。投資に関する最終判断はご自身の責任で行ってください。


コメント