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

資本市場と決済

過大約定の警報 20 件、本物は何件か

TT Labで続きを見る

目標

約定報告のストリームから、禁止された状態遷移・数量の等式違反・累計の逆行・過約定・平均約定価格の不一致を、それぞれ見つけ出し、その中から、重複報告と順序の入れ替わりで説明できるものを取り除いて、本当の欠陥だけを残します。

なぜ重要なのか

注文データは、人が目で読んで異常を探せる大きさではありません。幸い、このドメインには規則があるので、ふるいを作れます。状態の遷移表があり、数量には等式があり、平均約定価格は再計算できます。難しいのは検査自体ではなく、ふるいにかけたものを説明することです。重複報告は合計を膨らませて過約定のように見せ、入れ替わった到着順は、正常な注文を禁止遷移にします。この3つを分けずに「異常30件」として渡すと、受け取った人は何もできません。

ステップ

  1. python3で/root/orders/dataに、transitions.json・orders.csv・reports.csvを作成してください。
  2. 遷移表を/root/orders/reachable.jsonに整理し、終端状態を/root/orders/terminal.txtに、表自身の矛盾を/root/orders/graph_defects.txtに書いてください。
  3. 受け取った順に読んだときの禁止遷移を、/root/orders/illegal.csvに書いてください。
  4. 数量の等式が崩れた報告を、/root/orders/qty_break.csvに書いてください。
  5. 累計約定数量が戻った箇所を、/root/orders/cum_back.csvに書いてください。
  6. 注文数量を超えた注文を、/root/orders/overfill.csvに書いてください。
  7. 平均約定価格が加重平均と異なる報告を、/root/orders/avgpx_break.csvに書いてください。
  8. 注文ごとに原因を分けて/root/orders/verdict.csvに書き、原因別の数を/root/orders/summary.jsonに要約してください。

参考

遷移表と12個の注文の約定報告を作る

python3で/root/orders/dataに、transitions.json・orders.csv・reports.csvを作成してください。乱数を使わない生成スクリプトを、そのまま使ってください。

顧客のデータをそのまま持ってこられないので、同じ形の合成データを作ります。乱数を使わなければ、誰が何回回しても同じデータが出て、お互いの判定を突き合わせられます。採点ツールは、データを標準形に変換してフィンガープリントを突き合わせるので、手で直すと、あとのステップがすべて行き詰まります。

遷移表を読んで表自身の矛盾を探す

/root/orders/reachable.jsonに状態ごとの次の状態の一覧を、/root/orders/terminal.txtに終端状態を1行に1つずつ、/root/orders/graph_defects.txtに、終端と宣言されているのに出ていく遷移が残っている状態を書いてください。

終端状態は、これ以上行く先がないはずです。表で終端と宣言した状態の次の状態の一覧が空でなければ、その表は自己矛盾であり、その状態を通る誤った報告を、検査器が通過させます。一覧は並べ替えておくと、突き合わせが楽です。

受け取った順に読んで禁止遷移を探す

/root/orders/illegal.csvに、1行目にorder_id,from_seq,from_status,to_statusを置き、注文ごとにseqの順に読んだときに表にない遷移を書いてください。

注文ごとに分けてseqの昇順に読み、隣り合う2つの報告を比べます。前の状態の次の状態の一覧に、後ろの状態がなければ、禁止遷移です。終端状態は一覧が空なので、そのあとに来るすべての報告が引っかかります。

数量の等式が崩れた報告を探す

/root/orders/qty_break.csvに、1行目にreport_id,order_id,ord_status,expected_leaves,leaves_qtyを置き、生きている注文で等式が崩れた報告、または終端状態で残数量が0でない報告を書いてください。

生きている注文での期待残数量は、注文数量から累計約定を引いた値で、終端状態では0です。終端状態の一覧は、データから読んでください。取消で終わった注文をすべて違反として上げているなら、状態を見ていないということです。

累計約定数量が戻った箇所を探す

/root/orders/cum_back.csvに、1行目にorder_id,seq,prev_cum,cumを置き、seqの順に読んだとき、直前の報告より累計約定が小さくなった地点を書いてください。

累計約定は減りません。同じ値が続くのは問題ではなく、小さくなるものだけを探します。seqは、戻ったほうの報告のものを書いてください。

注文数量を超えた注文を探す

/root/orders/overfill.csvに、1行目にorder_id,order_qty,max_cum,sum_lastを置き、累計約定の最大値または約定数量の合計が注文数量を超えた注文を書いてください。

両方を見ます。累計約定が注文数量を超えた場合と、約定数量をすべて足すと超える場合です。後者は、同じ報告が2回入ってきても生じるので、このステップでは重複を消さずに、あるがままに数えてください。分ける作業は、ステップ8で行います。

平均約定価格を再計算して突き合わせる

/root/orders/avgpx_break.csvに、1行目にreport_id,order_id,reported_avg,recomputed_avgを置き、報告の平均約定価格が、そこまでの加重平均と異なる報告を書いてください。

その報告までの約定数量と金額を累計して割り、小数第4位で丸めます。decimalを使い、ROUND_HALF_UPに揃えてください。約定が1つもない報告の平均は、0です。値は小数第4位まで書きます。

重複と順序の問題を取り除いて、本物だけを残す

/root/orders/verdict.csvに、1行目にorder_id,cause,defectsを置いて、欠陥が見える注文ごとに1行ずつ書き、/root/orders/summary.jsonにorders・clean・중복보고・순서뒤바뀜・진짜결함・defectsを要約してください(韓国語の3つの語は、順に「重複報告」「順序の入れ替わり」「本当の欠陥」を意味します)。

判定は順番に行います。重複報告を消したときにすべての検査が静かになれば중복보고、それに加えて取引所時刻で並べ替えたときに静かになれば순서뒤바뀜、それでも残れば진짜결함です(3つの韓国語の語は、順に「重複報告」「順序の入れ替わり」「本当の欠陥」を意味します)。重複の除外は報告識別子を基準にし、並べ替えは取引所時刻とseqの順です。defects欄には、最後まで残った検査名だけを書きます。