TT Lab
开始
学习 学习路径 课程

资本市场与清结算

二十条超量成交告警里,真的有几条

在 TT Lab 中继续学习

目标

从成交报告数据流中,分别找出被禁止的状态转移、数量等式违反、累计量倒退、超额成交和平均价格不一致,再把其中可以用重复报告和顺序颠倒来解释的剔除,只留下真正的缺陷。

为什么重要

订单数据的规模,不是人用眼睛读就能找出异常的大小。幸好这个领域里有规则,可以做出过滤网。有状态转移表,数量里有等式,平均价格可以重新计算。困难的不是检查本身,而是解释过滤出来的东西。重复报告会使合计膨胀,看起来像超额成交,颠倒的到达顺序,会让完好的订单变成被禁止的转移。如果不把这三者分开,只交出“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。

参考

生成状态转移表和十二个订单的成交报告

用 python3 在 /root/orders/data 中生成 transitions.json、orders.csv 和 reports.csv。请原样使用不使用随机数的生成脚本。

不能直接拿来客户数据,所以要做出形态相同的合成数据。不使用随机数,是为了无论谁运行多少次都得到同样的数据,才能互相对照判定。评分器会把数据转换成标准形式来核对指纹,所以如果手工修改,后面的步骤就会全部被堵住。

读取状态转移表,找出表自身的矛盾

在 /root/orders/reachable.json 中写入按状态列出的下一个状态列表,在 /root/orders/terminal.txt 中每行写一个终态,在 /root/orders/graph_defects.txt 中写出被声明为终态、却仍留有出去的转移的状态。

终态必须无处可去。如果表里被声明为终态的状态的下一个状态列表不为空,这张表就是自相矛盾的,经过这个状态的错误报告会被检查器放行。把列表排好序,对照起来会更容易。

按收到的顺序读取,找出被禁止的转移

在 /root/orders/illegal.csv 中,首行写 order_id,from_seq,from_status,to_status,写出每个订单按 seq 顺序读取时,表里没有的转移。

按订单分开,按 seq 升序读取,比较相邻的两条报告。如果前一个状态的下一个状态列表里没有后一个状态,就是被禁止的转移。终态的列表是空的,所以在它之后出现的所有报告都会被抓住。

找出数量等式被破坏的报告

在 /root/orders/qty_break.csv 中,首行写 report_id,order_id,ord_status,expected_leaves,leaves_qty,写出存活订单中等式被破坏、或者在终态下余量不是 0 的报告。

在存活的订单里,期望的余量是订单数量减去累计成交所得的值,在终态下是 0。终态列表请从数据里读取。如果把以撤销结束的订单全部报成违反,就说明没有看状态。

找出累计成交数量倒退的位置

在 /root/orders/cum_back.csv 中,首行写 order_id,seq,prev_cum,cum,写出按 seq 顺序读取时,累计成交比紧挨着的前一条报告变小的位置。

累计成交不会减少。相同的值接连出现不是问题,只找变小的。seq 请写倒退的那一条报告的。

找出超过订单数量的订单

在 /root/orders/overfill.csv 中,首行写 order_id,order_qty,max_cum,sum_last,写出累计成交的最大值,或成交数量之和超过订单数量的订单。

两种情况都要看。累计成交超过订单数量的情形,以及把成交数量全部相加后超过的情形。后一种情况,同一条报告进来两次时也会出现,所以这一步不要删除重复,请原样数出来。区分的工作在第 8 步做。

重新计算平均价格并对照

在 /root/orders/avgpx_break.csv 中,首行写 report_id,order_id,reported_avg,recomputed_avg,写出报告中的平均价格与到那时为止的加权平均不同的报告。

把到这条报告为止的成交数量和金额累计起来相除,并在小数点后第四位舍入。请使用 decimal,并用 ROUND_HALF_UP 对齐。一笔成交都没有的报告,平均值是 0。值写到小数点后第四位。

剔除重复和顺序问题,只留下真正的缺陷

在 /root/orders/verdict.csv 中,首行写 order_id,cause,defects,为每个看得出缺陷的订单各写一行,并在 /root/orders/summary.json 中汇总 orders、clean、중복보고、순서뒤바뀜、진짜결함 和 defects(三个韩文键依次意为“重复报告”“顺序颠倒”“真正的缺陷”)。

判定按顺序进行。删除重复报告之后,如果所有检查都安静了,就是 중복보고,在此基础上再按交易所时间排序之后安静了,就是 순서뒤바뀜,这样仍然留下来的,就是 진짜결함。去重以报告标识符为准,排序以交易所时间和 seq 的顺序为准。defects 列只写最后仍然留下的检查名称。