部分約定で理論値と実測値に差異が発生⇒原因を検証

本日の稼働状況と約定結果

  • 買約定: 1件 (21,720円)
  • 売約定: 0件 (利確 0円)

【参考:記録開始からの累計と保有状況】

  • 買約定: 91件 (1,067,208円)
  • 売約定: 33件 (477,624円 / 累計利確 10,254円)
  • 保有数(理論値): 321 (株/口) / 投資元本 617,220円 (評価損益 -37,173円)
  • 保有数(実測値): 328 (株/口) / 評価額 592,696円

状態チェック: ⚠️ 【警告】証券口座(328株/口)とズレがあります!手動売買や通信障害による約定見逃しの可能性があります。

⚠️ 状態チェック警告の発生と原因究明

本日(2026年9月11日)の稼働終了処理において、本検証システム稼働後初となる「理論値(プログラム上の記憶)と実測値(証券口座の実際の保有数)の差異」を検知しました。実測値が328であるのに対し、理論値が321となっており、システムの状態管理と実際の保有数に7口分の不整合が生じた状態です。

ログと約定履歴を照合した結果、原因は通信障害やAPIエラーではなく、1476(J-REIT ETF)の「部分約定」による状態遷移の不整合であることが判明しました。

具体的には、ピラミッディング(下落に伴いロットを増やすロジック)によって「1,805円で12口」の買い指値注文を出していましたが、市場の引けにかけて12口中「7口」だけが約定し、残り5口が未約定のまま取引終了時間を迎えてしまったことが直接の原因です。

なぜ「部分約定」が不整合を引き起こしたのか

この7口の不整合が発生した背景には、本システムの現在の仕様(ロジック)の隙間が関係しています。

  1. 当日限りの注文仕様: 本システムは、注文の有効期限を最長期日(GTCなど)にはせず、毎日「当日限り(FAS)」で指値を出し直すコードになっています。
  2. 全数約定をトリガーとする利確設計: 買い注文が「設定した枚数(今回は12口)すべて約定したこと」を条件として、セットとなる反対売買(利益確定の売り注文)を生成する仕様としています。

この2つの仕様が組み合わさった結果、「7口だけ約定した状態」では利確注文の生成トリガーが引かれず、さらに注文自体は「当日限り」で失効したため、翌日以降、この7口が完全にシステムの監視対象から外れた状態となったというわけです。

つまり、「部分約定そのもの」が問題ではなく、「当日失効する注文」と「全数約定を前提とした状態管理」が組み合わさったことで、不整合が発生したと考えています。

今後のシステム設計における改善案

システムトレードにおいて、大口注文(ピラミッディングによるロット増大)を扱う場合、部分約定は市場の流動性や注文状況によって発生し得る事象です。今回、この課題が表面化したことは検証として、改善すべき課題を確認できた結果となりました。

システム設計上の手当てとして、今後は以下のいずれか(あるいは複合)のアプローチでコードを改修する必要があります。

  • 改善案A(ロジックの非同期化): 「全数約定」を待たず、部分約定が発生した時点で、その「約定した枚数分だけ」の反対売買注文を独立して生成するように状態管理を変更する。
  • 改善案B(残注文の繰り越し処理): 翌日の注文生成処理において、「前日に部分約定し、監視対象から外れたロット」をAPI経由で取得・計算し、残りのロット(今回は5口)と合わせて再構築する処理を追加する。

当面は、この不整合が生じた7口に対して手動での個別手当て(ポジションの相殺等)を行いつつ、恒久的なシステム改修に向けたロジックの検証を進めていきます。実環境で発生した事象として、今後のシステム改修に向けた検証記録として残しておきます。


【免責事項および用語の定義について】
※本記事における「確定利益」はグリッドトレードの決済による実現損益を指し、「評価損益(含み損益)」は保有ポジションの平均取得単価と現在値(時価)の差額を表しています。
※本記事の内容は、プログラムの稼働状況を記録した「検証ログ」であり、特定の投資手法、システム、証券会社等の推奨や投資助言を行うものではありません。自動売買およびシステムトレードには元本割れのリスクがあります。過去の成績は将来の利益を保証するものではありません。当システムは相場変動に伴いポジションを蓄積する仕様上、急激なトレンド発生時には想定外の損失を被るリスクが伴います。最終的な投資判断は必ずご自身の責任で行ってください。