江临没有急着去看那些价格数字,而是盯着这最后三个字段看几眼,评价为。
【凡是平台方称作内部质量分组的字段,先不要当特征使用,先当潜在污染分层变量审计。】
接下来,他开始对这一百万行切片做最基础的侦查审计。
江临把脑子里的几个基础常识翻译成几行干净利落的聚合代码,点击运行。
笔记本计算机发出低沉的轰鸣,CPU风扇开始高速转动,象是在抗议这种压榨。
第一轮审计脚本跑了足足二十多分钟。
终端里,一行行统计结果慢慢跳了出来。
和江临预想的一样,大部分记录看起来非常平滑正常,但也有一小撮记录脏得让人没眼看。
毕竟这个比赛的任务就是找脏数据,有异常是在预料之内的。
江临平静地写了几行画图脚本,把那些被筛出来的异常样本随机抽了几个,画成走势图。
这些异常都太浅了。
写几个if-else的条件过滤就能抓得一清二楚。
江临心里盘算着,如果只靠这些表层的业务逻辑去提交,应该能稳定拿到一个中等偏上的分数,拿不到奖金,但至少能及格。
如果任务只停留在这些表层逻辑错误上,就不值得平台设置人工报告评分。
江临揉了揉有些发酸的眼睛,喝了一口水,继续往下看第四个问题的统计结果。
凌晨一点二十,当缺失值的分布矩阵喧染在屏幕上时,他终于发现了第一处让他皱起眉头的异常现象。
数据里的缺失值,不是均匀出现的。
如果是一般的低流动性标的,出现偶尔的数据缺失是很正常的。
又或者,是某一只股票的交易所接口突然卡顿,造成几分钟的断档,这也说得通。
但现在屏幕上显示的问
为了看清楚,江临把这百万行数据的缺失分布状态画成了一张二维热力图。
横轴是时间,纵轴是标的代码,有数据的地方是深蓝色,缺失的地方是刺眼的亮黄色。
屏幕上赫然出现了几条横贯全图的亮黄色条带,就象一整块深蓝色的布料上,被人用刀残忍地划出了几道并行的巨大伤口。
这不是某一只股票的交易出了问题,不是标的自身的市场行为!
这更象是在那个特定的时间段,负责收集市场数据的某一台内核服务器突然宕机了,或者是底层供应商的某根专线断了,导致整个市场在这一段切片上的数据,经历了全链路的集体丢包。
【异常类型 A:横向时间截面级缺失。】
【推断:此异常不属于市场本身的交易特征,极大概率是数据供应商底层接口故障,或平台拼接多源数据时发生的时间轴对齐失误。】
他顺着这个思路往下查,试图把所有出现过横向断层的时间段全部圈出来。
接着,他犯了一个非常小但足以致命的常识性错误。
他在热力图上框选时,发现不仅是某些
江临毫不尤豫地把这段规则的空白也标记成了异常缺失。
但在按下保存键的那一瞬间,他的手指悬停在了半空。
“等等,所有标的,每一天,在中间完全相同的位置,准时切断,又准时恢复?
江临忽然意识到什么,快速切出代码界面,打开流览器,在搜寻引擎里输入了A股交易时间。
页面立刻跳出结果:上午 9:30 - 11:30,下午 13:00 - 15:00。
中午有一个半小时的休市。
江临拍了一下自己的脑门。
自己把这部分规则的空白当成了数据丢失。
他打开数据字
平台虽然对具
江临立刻把那部分标记全部撤掉,回到日志本,坦然地记录下自己的失误:
【误判 001:将正常的午间休市造成的物理时间断点,误识别为系统级数据缺失。】
【原因分析:过于迷信数据表象,未在建模前创建现实市场的物理约束前提。】
【修正方案:后续所
写完这一段,他感到一阵轻松。
这就是纠错的快感。
承认无知,排除干扰,把系统的边界再一次收紧。
时间已经推移到了凌晨两点半。。
这是一个用Jupyter Notebook写的演示级基准代码。
平台方写得很简陋,主要是演示如何读入数据、构造特征、跑通提交流程。
后面的模型部分他暂时没有执行,只顺着预处理代码往下看。
江临一行一行地往下扫,目光快速解析着这些代码背后的逻辑。
看到第