二十条超量成交告警里,真的有几条
目标
从成交报告数据流中,分别找出被禁止的状态转移、数量等式违反、累计量倒退、超额成交和平均价格不一致,再把其中可以用重复报告和顺序颠倒来解释的剔除,只留下真正的缺陷。
为什么重要
订单数据的规模,不是人用眼睛读就能找出异常的大小。幸好这个领域里有规则,可以做出过滤网。有状态转移表,数量里有等式,平均价格可以重新计算。困难的不是检查本身,而是解释过滤出来的东西。重复报告会使合计膨胀,看起来像超额成交,颠倒的到达顺序,会让完好的订单变成被禁止的转移。如果不把这三者分开,只交出“30 处异常”,接收的人就什么也做不了。
步骤
- 用
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。 - 把数量等式被破坏的报告,写入
/root/orders/qty_break.csv。 - 把累计成交数量倒退的位置,写入
/root/orders/cum_back.csv。 - 把超过订单数量的订单,写入
/root/orders/overfill.csv。 - 把平均价格与加权平均不同的报告,写入
/root/orders/avgpx_break.csv。 - 为每个订单区分原因,写入
/root/orders/verdict.csv,并把按原因统计的数量汇总到/root/orders/summary.json。
参考
- 从第 3 步到第 7 步,都按收到的顺序(seq)读取。修正顺序是在第 8 步做的。
- 数量等式只应用于存活的订单。在终态下,余量必须是 0。终态列表在
transitions.json里。 - 平均价格用
decimal计算,在小数点后第四位用ROUND_HALF_UP舍入。如果用float,完好的数据会看起来像有偏差。 - 第 8 步的原因按顺序判定。去重之后异常消失,就是
중복보고,在此基础上再按交易所时间排序之后消失,就是순서뒤바뀜,这样仍然留下来的,就是진짜결함,并把留下的检查名称用|连起来写入defects列(중복보고和순서뒤바뀜的该列是없음)。这四个韩文值依次意为“重复报告”“顺序颠倒”“真正的缺陷”“无”。 - 常见错误 1:不管状态,一律应用等式,把正常的撤销全部报为异常。
- 常见错误 2:不去除重复报告,就判定超额成交。
- 公开文档:FIX Standards、Fiximate、decimal。状态转移表和十二个订单是本实验的合成数据。
生成状态转移表和十二个订单的成交报告
用 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 列只写最后仍然留下的检查名称。