Pythonで株の自動売買システムを自作中|実運用に向けて注文管理と安全対策を実装

AIツール

これまで、AIやPythonを使って日本株の自動売買ツールを作ってきました。

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

そして前回、約5年間のバックテストを期間別に分解して安定性を検証したところで、バックテストはいったん一区切りとしました。

開発を始めた当初は、

「どの銘柄を買うか」
「いつ買って、いつ売るか」

といった売買判断を作ることが中心でした。

その後、過去5年ほどの株価データを使って、

  • 損切りを何%にするか
  • 利益が出たときにどう守るか
  • 100万円なら何銘柄まで持てるか
  • 実際にその株を100株買えるのか
  • 売買時の価格差を考慮しても利益が残るのか
  • 検証する期間を変えても結果が大きく崩れないか

などを順番に検証してきました。

そして前回、期間を変えた検証まで終えたところで、バックテストはいったん一区切りとしました。

今回から、開発は次の段階に進みます。

過去のデータで売買を検証するプログラムから、実際の証券口座で売買することを想定したシステムへ進めます。

今回作ったのは、そのための土台となる仕組みです。

開発してみて分かったのは、

バックテストでは「いつ買うか」を考えていましたが、実運用では「その注文を本当に出して大丈夫か」を考える必要がある

ということでした。

「買い」と判定しただけでは注文できない

バックテストなら、条件を満たした日に「買い」と判定し、その後の株価から損益を計算できます。

ところが実際のお金を使う場合は、そう簡単ではありません。

仮にシステムが「買い」と判断しても、

  • 100株買えるだけの資金があるか
  • すでにその銘柄を保有していないか
  • 同じ銘柄の注文をすでに出していないか
  • 使っている株価データが古くないか
  • 異常な価格が入っていないか
  • 注文してよい時間なのか
  • 最終的に自分が注文を承認したか

などを確認する必要があります。

そこで今回は、

売買判断 → 安全確認 → 注文候補 → 人間による承認 → 再確認 → 注文 → 注文状況の管理

という流れを作りました。

初期の実運用では、システムが勝手に注文するのではなく、最後は自分で確認してから注文する方式にする予定です。

一番怖いのは、同じ注文を二度出すこと

今回の開発で特に重要だったのが、二重発注を防ぐ仕組みです。

例えば、100株の買い注文を証券会社へ送った直後に通信が途切れ、システム側に結果が返ってこなかったとします。

このとき、

「返事がないから注文は失敗した」

と判断して、もう一度100株の注文を送るのは危険です。

実際には、証券会社側では最初の注文を受け付けていて、返事だけが届いていない可能性があるからです。

その状態でもう一度注文すると、

100株買うつもりが、200株の注文になってしまう可能性があります。

そこで今回は、

  • 同じ注文かどうかを識別する
  • 注文を送る前に状態を保存する
  • 注文が通ったか分からない場合は「確認できない状態」として止める
  • 分からないまま自動で再注文しない

という仕組みにしました。

「エラーが起きたらもう一度実行する」という考え方が、株の注文では逆に事故につながる可能性があります。

これはバックテストをしているだけでは気づきにくかった部分でした。

注文した後の状態も管理する

注文は、送信したら終わりではありません。

注文が受け付けられたのか、約定したのか、キャンセルされたのかなど、その後の状態も把握する必要があります。

そこで今回、注文受付・約定・一部約定・キャンセルなどを管理できるようにしました。

一部約定については、注文管理の仕組みそのものを確認するための人工的なテストも行っています。

ただし、最初に予定している実運用は日本株の現物を100株単位で売買するため、実際のお金を使わない運用テストへ進む際には、日本株の売買単位に合わせた条件で確認する予定です。

また、売り注文を出しただけで、その売却代金を次の買い注文に使えるものとして扱わないようにもしています。

実際に売却が成立するまでは、その資金を先取りしないためです。

PCを再起動しても、注文状況を忘れないようにした

もう一つ重要だったのが、プログラムを途中で終了した場合です。

例えば、

「買い候補が出て、自分の承認を待っている」

という状態でPCを再起動したとします。

再起動後にその状態を忘れてしまうと、同じ注文候補を新しく作ってしまう可能性があります。

そこで、注文候補や承認状況、注文の状態などをPCに保存し、再起動後も引き継げるようにしました。

実際のテストでは、再起動した際に必要な情報の一部が消えてしまう問題も見つかりました。

その問題を修正し、再起動後も同じ注文を重複して作らないことまで確認しています。

おかしな注文は出す前に止める

実運用では、正常に注文できることだけではなく、

おかしな状態なら注文しないこと

も重要です。

現在は、

  • 100株を買う資金が足りない
  • すでに同じ銘柄を保有している
  • 同じ銘柄の注文が残っている
  • 株価が0以下になっている
  • 数値として扱えないデータが入っている
  • 参照している価格から大きく離れている
  • 株価データが古すぎる

といった場合に、注文を止める仕組みを入れています。

つまり、

「問題があるかもしれない状態なら、とりあえず注文しない」

という方向で作っています。

利益を取り逃すことより、意図しない注文を出すことの方が実運用では危険だからです。

182個のテストをすべてクリア

今回の仕組みを作ったあと、さまざまな状況を想定してテストしました。

最終結果は、

182テスト中、182テストPASS

でした。

確認したのは、正常に買いや売りの候補を作れることだけではありません。

資金不足、重複注文、古い株価データ、異常な価格、再起動、注文のキャンセル、注文結果が確認できない場合など、失敗するケースも含めて確認しています。

また、今回の変更によって、これまで作ってきたバックテストの結果が変わっていないことも確認しました。

それでも、まだ本物の注文は出せない

182個のテストが通ったからといって、すぐに実際のお金を使えるわけではありません。

現時点では、まだ証券会社のAPIには接続していません。

今は実際の証券口座へ注文を送る代わりに、模擬的な注文環境を使って動作を確認している段階です。

さらに、

  • 実運用での損切り
  • 1日の損失が一定額を超えた場合の停止
  • 緊急停止
  • 注文をまとめてキャンセルする機能
  • 東証の休日や取引時間の正確な判定
  • 株価データを取得できなくなった場合の対応

なども残っています。

そのため、今回完成したのは、

「自動売買システムそのもの」ではなく、「実運用に進むための売買システムの土台」

という位置づけです。

実運用が近づいて、今度はセキュリティが気になってきた

ここまで作ったことで、いよいよ実運用が近づいてきたという感覚があります。

一方で、新しく気になってきたのがセキュリティです。

少し前には証券口座の乗っ取り被害も話題になっていました。

自分で作ったツールを証券口座につなぐ以上、認証情報の管理やPCのセキュリティに問題があれば、売買ロジックとはまったく別のところからリスクが生まれる可能性があります。

そのため、実際のお金を動かす前に、

  • 証券会社へ接続するための認証情報を安全に管理できているか
  • プログラムやGitHubなどにパスワード類が残っていないか
  • ログに重要な認証情報が記録されていないか
  • PCやネットワーク側に問題がないか
  • 万が一問題が起きたときにすぐ停止できるか

といった部分も確認することにしました。

売買システムを作ればそのまま実運用へ進めると思っていましたが、実際のお金を扱うところまで来ると、確認しなければならないことはまだありそうです。

次は証券会社との接続へ

次の大きな工程は、三菱UFJ eスマート証券のAPIとの接続です。

ただし、接続できたらすぐに自動売買を始めるわけではありません。

まずは、

  • 口座情報
  • 買付余力
  • 保有株
  • 注文状況
  • 株価
  • 出来高
  • 板情報

など、実際に何を取得できるのかを確認します。

取得できる市場データが分かったら、それらをまとめて確認できる機能も作る予定です。

この機能は自動売買だけでなく、普段行っている銘柄分析や、ChatGPTに株の相談をするときにも使える形を考えています。

その後、安全対策とセキュリティを改めて確認し、実際のお金を使わない運用テストへ進みます。

そこで問題がなければ、最初は50万円程度から、注文前に自分で最終確認する形で実運用を始める予定です。

いきなり完全自動にはせず、実際に動かして問題を確認しながら、少しずつ自動化する範囲を広げていきます。

自動売買ツール開発の現在地

現在の開発ロードマップは次のようになっています。

バックテスト・売買ルールの検証
✓ 完了

↓

実運用に向けた売買システムの土台
✓ 今回ここまで

↓

三菱UFJ eスマート証券とのAPI接続

↓

取得できる株価・出来高・板などの確認

↓

市場データをまとめて確認できる機能の追加

↓

誤発注対策・損失制限・セキュリティの確認

↓

実際のお金を使わない運用テスト

↓

50万円程度から、注文前に自分で確認する実運用

↓

実運用の結果を確認しながら段階的に自動化

今回で、バックテスト中心だった開発から、

実際のお金を動かすことを想定した開発

へ進みました。

ここから先は、利益を出せるかだけではなく、

「想定外のことが起きたときに、勝手に注文せず止まれるか」

も同じくらい重要になります。

まずは証券会社との接続から、一つずつ確認していきます。

コメント

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