TT Lab
はじめる
学ぶ 学習パス コース

資本市場と決済

帳簿は消して直すものではない

TT Labで続きを見る

一言でいうと

すでに出ていった約定は、間違っていたからと消すのではなく、元に戻す記録を加えて直します。場所はより多く食いますが、数か月後に誰が尋ねても、「なぜこの数字になったのか」を読み取れます。

なぜ必要なのか

約定は終わりではありません。価格を間違えて入れたり、相手方の確認が取れなかったりすると、その約定は取消され、値が少し違うだけなら訂正されます。問題はその次です。約定元帳は、すでに複数の場所に流れ出ています。ポジション報告が出て、リスク限度の計算が回り、損益が記録されました。その状態で、元帳の1行を黙って書き換えると、昨日出た報告と今日見る元帳がずれますが、ずれた理由が元帳のどこにもありません。

そのため、金融の帳簿はあとに書きます。取消は、元の記録を残したまま、符号が反対の相殺記録(反対仕訳)を1行加えることで、訂正は、元の記録を相殺したあと、直した値でもう1行書き直すことです。会計で古くから使われてきた方式で、FIXプロトコルの約定報告にも、取消・訂正を知らせる場所が別にあります。フィールドの意味はFiximateで確認できます。取消を何分以内に申請しなければならないかのような具体的な手続きは、市場ごとに違うので、このラボでは、データとして与えるルールファイルを、このラボの前提とします。

どう動くのか

まず、通知が何を指しているのかを確認します。取消・訂正の通知には、元の約定の識別子が入っており、その識別子が元帳になければ、何もしてはいけません。ここで「似た約定を探して適用」する実装が、最も危険です。見当違いの約定を元に戻すと、間違った1件が2件になります。

次は、同じ通知を2回受け取る場合です。再送は正常なことです。通知IDを記憶せずに、受け取ったとおりに相殺すると、一度取り消された約定が2回相殺され、ポジションが反対に傾きます。同じ入力を何回入れても結果が同じでなければならないこと。それが冪等です。

3つ目は、すでに取り消された約定に、再び来る通知です。再取消も、取り消された約定に対する価格訂正も、受け入れてはいけません。そのためには、処理器が「今までに何を取り消したか」を持っている必要があります。

訂正は、取消より手間がかかります。価格だけが変わることも、数量だけが変わることもあるので、通知にない値は元の値をそのまま使う必要があり、変わった値に応じて、約定金額・平均約定価格・ポジションが一緒に動きます。金額はdecimalで扱い、丸め方式を決めておきます。浮動小数点数で行うと、訂正1回で最後の桁が揺らぎ、直した箇所ではない場所が、ずれたように見えます。

最後が、遅れて来た取消です。ポジション報告が出たあとに届いた通知は、帳簿だけを直して終わりではありません。すでに出た報告が間違いになるので、再報告の対象になります。ところが、すべての遅れた通知がポジションを動かすわけでもありません。価格だけを変える訂正は、数量に触れないので、ポジションはそのままで、金額だけが変わります。この2つを分けておかないと、再報告の一覧が無駄に長くなり、長くなった一覧は、誰も見なくなります。

現場での姿

あるとき、夜間に届いた取消通知をバッチが2回読んで、ポジションが1日中、反対の符号で記録されたことがあります。原因は、通知IDを記録しなかったことの1つだけでした。さらに悪かったのは、そのバッチが元の記録を上書きしていたので、何がいつ消えたかを突き止めるのに、2日かかったことです。

もう1つは、ポジションの突合でした。再計算したポジションと、すでに出た報告が、銘柄ごとに少しずつ違っていましたが、差の大部分は遅れて来た取消で説明され、1銘柄だけが説明されませんでした。説明されないその1銘柄が、本当の欠陥でした。差をひとまとめにして「突合の不一致」と書いていたら、その1件は埋もれていたでしょう。

3つ目によく出会うのは、追跡できない帳簿です。相殺と再記帳を正しく行っても、その行がどの通知から出たのかを書いておかなければ、数週間後に、誰も説明できません。そのとき出てくる質問は、いつも同じです。この銘柄の数量は、なぜこうなったのか。帳簿の行ごとに、その行を作った通知のIDと理由を付けておけば、その質問は、1回の照会で終わります。理由を付けるときに、1つ注意することがあります。再送されたコピーにも理由が付いていますが、帳簿に残すべきものは、実際に適用された通知の理由です。通知ストリームから最後のものを拾ってくる実装は、ここで静かに間違えます。

そして、これらすべての処理は順序に頼らないようにする必要があります。通知は、元の順序どおりに来るとは限らず、バッチが2回回ることもあります。今までに何を適用したかを状態として持って判定すれば、同じ入力をどんな順序で何回入れても、同じ帳簿が出てきます。この性質は、言葉で主張するのではなく、同じ入力を2回流し込んで、結果ファイルを比べる方式でテストする必要があります。そのテストがなければ、冪等であるという文は、希望にすぎません。

次のラボですること

約定元帳と取消・訂正の通知ストリーム、そしてすでに出たポジション報告を作ります。通知を元の約定につなげて、適用するものと捨てるものを分けたあと、元の記録をそのまま残して反対仕訳を加え、新しい帳簿を作ります。訂正を反映して約定金額と平均約定価格を出し直し、ポジションを再計算して既存の報告と突き合わせます。同じ通知ストリームを2回流し込んでも帳簿が同じかをファイルで確認し、報告時刻のあとに届いた通知を集めて、再報告の対象一覧と訂正レポートを出します。