仮想注文は本当に約定した?日本株Paper Tradingに約定判定を実装

AIツール

日本株の自動売買ツールを開発しています。

前回は、

株価データを取得 → AIが売買判断 → 人間が最終確認 → 安全チェック → 仮想注文

までをつなぎました。(前回記事:AIの売買判断から仮想注文まで。日本株Paper Tradingの仕組みをつないでみた)

ただし、ここで一つ大きな問題が残っていました。

「注文を出した」と「約定した」は別です。

今回は、出した仮想注文を実際の市場データに照らし合わせて、

本当に約定条件を満たしたときだけ、仮想口座に反映する仕組み

を実装しました。


前回までは「注文を出した」ところまで

前回の記事では、AIが買いと判断しても、そのまま注文しない仕組みを作りました。

人間が最終確認したあと、注文直前にもう一度、

  • 株価
  • 資金
  • 1銘柄あたりの投資上限
  • 総投資額
  • 1日の損失上限

などをチェック。

問題がなければ、Paper Trading上で仮想注文を出します。

ここまでで「注文を出す仕組み」はできました。

しかし、その注文を出した瞬間に「買えた」とするのは不自然です。


指値を出しても、必ず買えるわけではない

例えば、

1,000円で100株買う

という指値注文を出したとします。

その後も株価が1,050円や1,030円で推移しているなら、本来その注文は約定しません。

ところがPaper Trading側で、

注文を出したから1,000円で買えたことにしよう

としてしまえば、実際より都合のいい取引結果になってしまいます。

これではPaper Tradingの意味が薄くなります。

そこで今回は、

実際に観測した市場価格を根拠に、注文が約定できる状態だったかを確認する

仕組みを追加しました。


好きな価格で「買えたこと」にしない

今回特に重視したのが、約定価格です。

AIが分析するときに使う株価と、注文を約定させるための株価は分けています。

仮想約定では、その時点で実際に観測した市場価格を、約定可否を判断する根拠として使います。

プログラム側の都合で、

「この価格なら利益が出るから、この価格で買えたことにする」

という処理はしません。

ただし、実際の板や注文の優先順位まで再現しているわけではないため、

「その価格が観測された=実売買でも必ず約定した」

という意味ではありません。

例えば1,000円の買い指値なら、

  • 市場価格995円 → 条件を満たす
  • 市場価格1,010円 → 条件を満たさない

という形で判定します。

売り指値なら逆で、指値以上の市場価格を確認できた場合に条件を満たします。


200株注文なら100株ずつ約定することもある

もう一つ追加したのが、一部約定です。

現在のツールでは、日本株の通常の単元株取引に合わせて100株単位を基本にしています。

100株の注文なら、条件を満たせば100株を仮想約定。

200株注文した場合は、

200株注文
↓
まず100株約定
↓
残り100株
↓
別の市場データで条件を満たせば残りも約定

という処理ができます。

つまり、注文した200株を必ず一度に全部買えたことにはしません。

ただし、現在の仕組みは実際の板の順番や出来高まで完全に再現しているわけではありません。

あくまでPaper Tradingとして、実際の市場価格を根拠にしながら簡易的に一部約定を表現する仕組みです。


同じデータで2回約定しないようにする

Paper Tradingでは、意外と重要なのが二重処理への対策です。

例えば、

市場データを確認
↓
100株約定
↓
プログラム停止
↓
再起動
↓
同じ市場データをもう一度処理

となったとします。

ここで同じ注文をもう一度約定させてしまうと、本当は100株しか買っていないはずなのに、仮想口座では200株保有していることになります。

そこで、

「この注文では、この市場データをすでに処理した」

という情報を保存するようにしました。

プログラムを再起動して同じデータが入ってきても、同じ約定を二重に反映しません。

さらに、約定処理の途中でエラーが発生した場合にも、

株数だけ増えたのに現金が減っていない

といった中途半端な状態を残さないようにしています。


約定すると仮想口座も更新される

今回の実装では、「約定した」という表示を出すだけではありません。

100株の買い注文が約定すると、

  • 現金が減る
  • 保有株数が100株増える
  • 平均取得単価が更新される
  • 注文時に確保していた資金が精算される

ところまでつながっています。

売却した場合には、保有株数の減少や実現損益の計算にもつながります。

これで、

AIの売買判断
↓
人間の最終確認
↓
安全チェック
↓
仮想注文
↓
市場データによる約定判定
↓
仮想口座への反映

という一連の流れができました。


株式分割などは、分からなければ止める

株式分割などへの対応は、まだ完全には実装していません。

例えば株式分割が発生すると、株価だけでなく保有株数や取得単価などにも影響します。

この処理を間違えたまま約定を続ける方が危険です。

そのため現在は、

株式分割などの影響を安全に処理できると確認できない場合は、約定処理を止める

設計にしています。

自動調整まで完成したわけではありません。

「分からない状態なら動かさない」という安全側の処理を優先しています。


テストは880件通過

今回の市場データを使った約定処理まで実装した段階で、プロジェクト全体のテストを実行しました。

結果は、

880 passed
536 subtests passed
failed 0

でした。

通常の100株約定だけでなく、

  • 200株注文の一部約定
  • 同じ市場データの再処理
  • プログラム再起動後の再処理
  • 古い市場データ
  • 指値条件を満たさないケース
  • 株式分割などの状態が不明なケース
  • 処理途中でエラーが発生したケース

なども確認しています。


それでも、まだPaper Trading開始ではない

ここまで来るとかなりPaper Tradingらしくなってきました。

ただし、まだ

「Paper Tradingシステムが完成した」

とは考えていません。

今回完成したのは、

仮想注文を、市場データを根拠に仮想約定させ、口座へ反映する仕組み

です。

今後は、実際の運用を想定して市場データを継続的に供給する仕組みや、注文・約定・安全チェックが正しく行われたことを記録・検証する仕組みを整える必要があります。

また、現在の約定モデルは実際の取引所の板や注文の順番、出来高、市場インパクトなどを完全に再現するものではありません。

そのため、テストが通ったからすぐ実売買へ進むのではなく、段階的に検証していきます。


次は「正しく動いたこと」を確認できる仕組みへ

前回までは、

AIが判断して仮想注文を出す

ところまででした。

今回は、

その注文を市場データで確認し、条件を満たした場合だけ仮想約定する

ところまで進みました。

次に必要なのは、

その一連の処理が、本当に想定どおり動いたのかを後から確認できること

です。

注文、安全チェック、約定、資金更新などの記録を残し、

「Paper Tradingを本当に開始していい状態なのか」

を判断できる仕組みを作っていきます。

まだ実売買には進みません。

まずはPaper Tradingを安全に回せる状態まで持っていきます。


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

バックテスト
↓
証券会社・市場データとの接続基盤
↓
資金管理・損失制限・緊急停止
↓
AI判断 → 人間確認 → 仮想注文
↓
市場データを使った仮想約定 ← 今ここ
↓
記録・監査・最終チェック
↓
正式なPaper Trading
↓
少額・人間確認ありの実売買
↓
段階的な自動化

引き続き、実際に開発しながら結果を記録していきます。

コメント

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