1000株買うつもりで注文したのに、400株だけ成立して残りが消えた。これは必ずしも不具合ではない。IOCという条件を付けていたなら、即時に成立する分だけ約定し、残りが取り消されることは想定された動作である。
一方、FOKは全量を即時に成立させられなければ注文全体を取り消す条件だ。「すぐに買う」という印象は似ていても、部分約定を許すかどうかが違う。この差は単一銘柄の売買だけでなく、二つの銘柄を組み合わせる取引で特に重要になる。
価格条件と有効時間の条件を分ける
指値は、買いなら支払える上限、売りなら受け取る下限を指定する価格条件である。IOCやFOKは、その注文をどう成立させ、成立しない分をどう扱うかという条件だ。注文画面で隣に並んでいても、同じ役割ではない。
IOCはImmediate or Cancel、FOKはFill or Killの略である。Interactive Brokersの説明では、IOCは即時に成立しない部分を取消し、FOKは直ちに全量成立しない場合に全体を取消す。ただし利用できる商品・市場・接続方式は異なるため、どの画面でも選べる機能ではない。
400株しかない板へ1000株を出す
架空の売り板として、100円に400株、101円に500株、102円に600株が並んでいるとする。買い指値100円で1000株のIOCを送り、到着時もこの状態なら、100円の400株が成立し、残り600株は取消しになるという基本形が考えられる。
同じ指値100円・1000株でもFOKなら、全量1000株を100円以下で買えないため、全部が取消しとなる。部分的に400株だけ残すことを避けられる一方、一株も取得できない可能性を受け入れる注文になる。

FOKは成行で何でも買う命令ではない
FOKを使えば希望数量が必ず手に入るわけではない。全量成立という数量条件に加えて、指定した価格条件も満たす必要がある。指値を100円から102円へ広げれば利用可能な売り数量は増えるが、許容する支払額も増える。
全量取得したいからといって、価格上限を際限なく広げると、注文機能が守っているものを失う。数量を優先するのか、価格を優先するのか、両方を満たさなければ見送るのかを先に決める。FOKは最後の選択肢を機械的に表現する方法として使える。
指値を上げたときの平均約定価格
先ほどの板で1000株を102円以下で買えると仮定すると、100円で400株、101円で500株、102円で100株になる。合計代金は10万700円、平均価格は100.7円だ。最後に取った102円を全株の価格とする計算も、最良売り気配100円を全株へ適用する計算も正しくない。
一つのFOK注文が全量成立しても、複数価格・複数約定へ分かれることはあり得る。「全量かゼロか」という条件と、「一件の約定として表示される」という条件は同じではない。約定履歴を数量加重で集計し、手数料を別に確認する。
画面に見えた数量は予約されていない
注文を送る前に板へ1000株あっても、通信中に別の注文が先に消費すれば、到着時には不足している可能性がある。取消しで板が減ることもある。逆に表示されていない流動性や新規注文で、見えていた数量以上が成立する場合もある。
そのためバックテストで「板に必要数量が見えたからFOKは必ず成立」と判定すると、成功率を高く見積もるおそれがある。判断時点と市場到着時点を分け、実際の拒否・取消し・部分約定を記録してモデルを点検する必要がある。
二つのFOKを送っても同時成立は保証されない
Aを100株買い、Bを100株売るペア取引を考える。両方にFOKを付けても、それぞれが独立した注文なら、Aだけ全量成立してBは全量取消しとなり得る。FOKは一注文の内部条件であって、別々の市場へ送った二注文を一つの取引に変える機能ではない。
この場合、残るのはAの100株買いであり、予定した相対価格の取引ではなく方向性のある建玉になる。後からBを成行で追いかければ、最初に狙った価格差が消えている可能性もある。「両方FOKだから片側だけ残らない」という設計は危険だ。

部分約定を許すなら残ったリスクを計算する
IOCでAを100株買い、Bは40株だけ売れたなら、ヘッジ比率が一対一という仮定でも60株相当の差が残る。実際には株価や感応度が違うため、単純な株数差だけで管理できない場合もある。
片側成立後に許容する金額、時間、価格変化を決めておく。追加執行でそろえる、成立した側を閉じる、一定量まで残すなどの対応は、それぞれ費用とリスクが違う。異常が起きた後に初めて方針を考えると、相場を見ながら都合よく例外を増やしてしまう。
複合注文とバスケット注文も区別する
業者が複数銘柄を一括送信する画面を用意していても、全ての脚が同時成立するとは限らない。単なるバスケット送信なのか、取引所のスプレッド注文なのか、業者が脚を順番に執行する方式なのかで性質は異なる。
確認するのは、全体の価格条件、各脚の数量比、部分成立の扱い、未成立時の取消し、保証対象の範囲である。複雑な名称だけで判断せず、片側しか成立しないシナリオを仕様書へ照らす。対応していない市場に便利な保証を期待してはいけない。
未約定は損失ゼロとは限らない
新規投資なら見送りで終わることもあるが、リスクを減らす決済注文が不成立なら、元の建玉は残る。100株の売りFOKが取消しになったとき、ポジションまで消えたわけではない。注文が終わったこととリスクが終わったことを区別する。
特に損失拡大中に全量条件へこだわると、一部でも決済できたはずの機会を失う可能性がある。一方、IOCなら望まない小口建玉が残ることもある。注文条件の善し悪しは、取得目的か撤退目的か、残量を持つことの意味によって変わる。
再送は新しい判断として扱う
FOKが取消しになった後、同じ価格で何度も送ればいつか成立するかもしれない。しかし、価格が動いている間に最初のシグナルが失効することもある。取消しを確認できないまま再送すれば、通信障害時の二重発注問題も加わる。
再試行には回数・時間・価格の上限を設け、最終約定量を確定してから次の数量を決める。毎回同じ1000株を出すのではなく、目的数量から累計約定を引いた残量で考える。注文番号を変えることと売買の目的が新しくなることは同じではない。
1,000株の予算は注文ごとではなく売買意図ごとに管理する
最初のIOCで400株が成立した後、もう一度1,000株を送れば、合計1,400株まで買う可能性がある。目標が1,000株なら、次の候補数量はまず600株である。注文が終了したことと、売買の目的が達成されたことを別々に管理する。
架空の買い予算を10万2,000円、上限価格を102円とする。400株が100円で成立したら、使用済みの約定代金は4万円。残り600株を102円で買う場合の代金は6万1,200円で、合計10万1,200円となる。ここへ費用も加えて予算内か確認する。
一方、前回の約定通知が遅れているときに残数量を推測して送ると、二重発注につながる。注文IDに対応する成立数量と取消数量を照会し、状態が確定するまでは同じ目的の追加数量を保守的に管理する。IOCだから通信上も瞬時に最終結果が届く、という意味ではない。
再送を続けると価格上限以外の条件も変わる
1回あたりのIOCが正しくても、何十回も繰り返せば、最初に判断した時点とは相場が変わっている。価格上限に加えて、再試行回数、経過時間、累計成立数量、累計費用の上限を置く。時間切れなら未成立部分を残して終了するのか、別の注文へ変えるのかも先に決める。
特に二つの資産を組み合わせる取引では、片方を待つ間にもう片方の価格が動く。最初に魅力的だった価格差が消えた後まで、目標数量を達成するためだけに注文を続けない。数量をそろえることより、成立済みのリスクをどう閉じるかが優先になる場面もある。
本番前に三種類の結果を通す
検証では、全量成立、400株だけの部分成立、全量不成立という三つの応答を用意する。IOCの部分成立で残数量が正しく600になるか、FOK不成立で保有が増えないか、いずれの場合も不要な再送が発生しないかを確認する。
さらに約定報告と注文終了報告の到着順が入れ替わった場合を試す。受信順だけでポジションを決めるのではなく、約定IDの重複を排除して累計数量を作る。注文機能の選択と、システムが結果を正しく受け取ることの両方がそろって初めて、想定した動作になる。
取引場所によって対応する条件や制約が違うため、未対応の指定が別の注文へ黙って変換されないかも確認したい。注文受付時の応答に、要求した有効期間と数量条件が残っているかを照合する。画面で選べたという事実だけで、執行先の条件を判断しない。
評価は約定率と費用と残余を一緒に見る
比較表には成立しなかった回も一行を残し、その時点の価格上限と必要数量を記録する。後から都合のよい注文だけ拾うことを防げる。数量が違う注文同士は単純な件数平均だけで比較せず、実際に必要だった数量のうち何割を取得できたかも確認したい。
IOCの約定率が高くても、少量しか成立していなければ目的を達成していない場合がある。注文件数ベースと数量ベースの完了率を分け、平均価格、手数料、成立までの時間、残余建玉の最大額も記録する。
FOKは成立した取引だけを見ると価格が良く見えやすいが、不成立で逃した取引を除外すると比較が偏る。同じ売買意図の集合に対して、全量成立・部分成立・不成立の結果を残す。注文機能は利益を生む魔法ではなく、どの失敗を許容するかを明確にするための道具である。


コメント