江临把那张写着【下一执行目标】的audit_log关掉,新建了一个空白的python文件。
nil_leak_de.py
距离对方要求的24小时窗口期,还剩二十三个小时四十一分。
时间够用,但他没有任何懈怠的意思。
构造一个最小复现实验,听起来简单,做起来却是一桩挺讲究分寸的活。
第一,不能用平台提供的那3.4Gb原始数据集的任何一个字节。
否则对方可以反咬一口,说他是利用了数据集本身的某种特殊结构在断章取义。
第二,不能太复杂。
如果脚本写得花里胡哨,依赖了一堆奇形怪状的库,对方的工程师在复核时光是配环境就要折腾半天,复核流程一拖,事情就容易被冷处理。
第三,必须锁死随机种子。
任何一个浮点数的微小波动,都可能被对方技术组归因于环境差异,进而拖慢复核流程。
江临盯着空白的代码窗口,思考了两分钟,然后开始动手,用nuy生成了一段由两个不同分布拼接而成的随机时间序列。
前八十个数据点,服从均值为零、标准差为一的正态分布,用来模拟训练窗口里平稳的市场行情。
后二十个数据点,被他人为地注入了几个三倍标准差以上的极端值,用来模拟测试窗口里突然出现的异常事件。
整个数据构造过程,不超过十行代码。
随机种子被锁定为42。
为了避免随机数生成器版本差异,他干脆删除了随机生成过程,直接把一组最小合成序列硬编码进脚本。
数字没有任何金融含义,只用于证明一个数学事实。
测试窗参与标准化,会系统性压低测试窗内极端值的异常分数。
数据准备好后,他在下方写了两个对照函数。
第一个函数叫leaked_scaler,完全照搬baseline第六十七行的逻辑。
把训练窗和测试窗合并,计算全局均值和全局标准差,然后做标准化。
第二个函数叫causal_scaler,严格遵守时间因果律。
只用训练窗的均值和标准差,去标准化测试窗。
然后,他让两个函数分别对同一份合成数据进行处理,把标准化之后的异常分数打印出来。
最后再加一行tplotlib画图代码,把两组结果叠在同一张图上。
代码总长不到四十行。
江临点击运行。
不到一秒钟,屏幕上跳出了那张对照图。
跟之前用真实数据跑出来的结果几乎一模一样。
leaked_scaler处理后的异常分数曲线,比causal_scaler矮了将近一截。
那些本该刺破天际的尖峰,被未来信息悄悄地按了下去。
干净,纯粹,无可辩驳。
江临把这张对照图截下来,存进文件夹。
接着,他做了一件更狠的事情。
给这个最小复现实验,写了一份像一份实验室设备校准记录的REAd说明文档。
文档第一节,是脚本的目的陈述。
“本脚本旨在使用纯合成数据,复现真实数据集中观测到的预处理阶段未来信息泄漏现象。本脚本完全不依赖主办方提供的任何原始数据,所使用的所有随机数均由锁定种子42生成,理论上可在任意支持nuy1.24以上版本的python环境中得到完全一致的输出。“
文档第二节,是逐行代码注释。
文档第三节,是预期输出的精确数值。
江临把两组异常分数序列、每一个时间点的具体数值,都以表格形式打印在了REAd里。
任何人只要运行一次脚本,就能用diff命令逐字节比对自己的输出和他的输出是否一致。
文档第四节,是数学推导。
他用三页纸的篇幅,从最基础的标准化公式出发,一步一步推导了当测试集样本参与计算时,为什么会导致测试窗内的极端值在标准化后被系统性低估。
每一个推导步骤都有编号,每一个公式都有引用来源。
文档第五节,是工程建议。
他冷静地列出了三种正确的预处理方案,并标注了各自的适用场景和计算开销。
最后一节,是免责声明。
“本实验的所有代码、数据和推导过程,均不涉及主办方提供的任何脱敏数据集的内部信息。本实验旨在通过最小化的方式独立验证一个数学事实,与主办方平台的具体实现细节无关。“
这份REAd一旦发出去,对方就彻底失去了所有可以模糊处理的空间。
他用的是合成数据,对方没办法说他在恶意攻击平台。
他锁了种子还附了精确数值,对方没办法说他不可复现。
他给了三页的数学推导,对方没办法说他没有理论依据。
他给出的是建议,不是指责,对方没办法说他在指手画脚。
这就像在物理实验里搭出一个最小闭环的对照装置。
输入固定,处理流程固定,输出差异固定。
你可以不喜欢结论,但不能说它没有发生。
江临扫了一眼右下角的时间,把整个文件夹打包成一个命名为reproduce_leakage_v1.0.zip的文件。
然后切回浏览器,打开那封站内信,点击补充材料上传按钮。
页面提示:补充材料已提交,等待评审组复核。
江临关掉浏览器,从椅子上站起来,走到窗边把窗帘拉开了一道缝。
外面的阳光刺眼得让他眯起了眼睛。
他这才意识到,自己已经连续在屋子里待了将近五天。
转身去洗了个澡。
热水冲在后颈上的那一刻,他脑子里那根紧绷了四天的弦,终于稍微松开了一点。
用毛巾擦头发的时候,他听到客厅里母亲在跟父亲低声说着什么。
“都关在屋里五天了,连饭都是我端进去的。”
“年轻人有事情忙是好事,别去打扰他。”
“我就是担心。”
“孩子能吃能喝的,状态好得很,你少瞎操心。”
江临擦头发的动作停了一下。
他想了想,把毛巾搭在脖子上,推门走了出去。
“妈,下午我想出去走走。”
母亲从沙发上回头看他,脸上瞬间堆起笑容:“哎,去吧去吧,妈给你转点零花钱。”
……
与此同时,上海,浦东某写字楼的二十三层。
平台技术组的内部会议室里坐着六个人,没有人大声说话。
单越是这种声音越低的时候,事情反而越重。
长条会议桌的主位坐着的是一个四十多岁,戴着金丝眼镜的男人,是这次挑战赛的技术负责人,姓沈。
他的笔记本电脑屏幕上,正显示着一份pdF的第十八页。
页眉的位置印着两行小字。
“《分钟级行情数据异常检测与回测前置审计报告》”
“提交者:1453号。”
沈工的右手食指无意识地敲着桌面,节奏越来越快。
“这个1453号,背景查到了吗?”
坐在他左手边的一个戴着耳机的年轻工程师立刻摇头:“注册信息只有一个手机号和一个邮箱,我们只能看到注册时主动留的手机号归属地和邮箱域名,更深的身份核查不能做,用户协议卡得很死。”
“你们说,对方会是什么身份,某个高校的研究生?”沈工皱了皱眉。
“不像。”另一个年纪稍长的女工程师摇头,“研究生写报告习惯用Latex,遣词造句也有学术八股的味道。但这份报告的写法非常……”
她犹豫了一下,找了个合适的形容词。
“非常工程化。”
“工程化?”
“就是那种在一线干过活的人才写得出来的语气。你看他第二页画的那张污染链路拓扑图,他根本不是从金融的角度在看这份数据,而是从测量系统的角度在看的。”
“他可能根本不关心市场,只关心从交易所到平台之间的每一层数据传输环节,哪一层最有可能掉包、漂移、错位。”
女工程师翻到报告的第八页,把屏幕转向沈工。
“真正麻烦的不是他指出了横向缺失。横向缺失只要画热力图,细心一点的人都能看见。麻烦的是,他把这些缺失带、价格尺度跳变和source_flag的分组变化放在了一张图里。”
沈工低头看屏幕。
报告第八页上有一张三层对齐图。
最上面是按 nute_id展开的缺失热力图,中间是若干个脱敏标的在相邻date_id边界处的价格尺度变化。
最下面是一条被离散化后的source_flag分组序列。
三条图之间,被江临用细灰线拉出了几组对应关系。
在图下方,他只写了一句很冷的判断。
【source_flag的真实业务含义未知,本文不对其作确定解释。但该字段分组变化与若干横向缺失带、尺度突变边界存在统计相关,建议主办方按source_flag分层复核底层数据源、清洗批次或供应商接口切换记录。】
会议室里安静了几秒。
年轻工程师低声说:“他没有说source_flag是供应商编号。”
nil_leak_de.py
距离对方要求的24小时窗口期,还剩二十三个小时四十一分。
时间够用,但他没有任何懈怠的意思。
构造一个最小复现实验,听起来简单,做起来却是一桩挺讲究分寸的活。
第一,不能用平台提供的那3.4Gb原始数据集的任何一个字节。
否则对方可以反咬一口,说他是利用了数据集本身的某种特殊结构在断章取义。
第二,不能太复杂。
如果脚本写得花里胡哨,依赖了一堆奇形怪状的库,对方的工程师在复核时光是配环境就要折腾半天,复核流程一拖,事情就容易被冷处理。
第三,必须锁死随机种子。
任何一个浮点数的微小波动,都可能被对方技术组归因于环境差异,进而拖慢复核流程。
江临盯着空白的代码窗口,思考了两分钟,然后开始动手,用nuy生成了一段由两个不同分布拼接而成的随机时间序列。
前八十个数据点,服从均值为零、标准差为一的正态分布,用来模拟训练窗口里平稳的市场行情。
后二十个数据点,被他人为地注入了几个三倍标准差以上的极端值,用来模拟测试窗口里突然出现的异常事件。
整个数据构造过程,不超过十行代码。
随机种子被锁定为42。
为了避免随机数生成器版本差异,他干脆删除了随机生成过程,直接把一组最小合成序列硬编码进脚本。
数字没有任何金融含义,只用于证明一个数学事实。
测试窗参与标准化,会系统性压低测试窗内极端值的异常分数。
数据准备好后,他在下方写了两个对照函数。
第一个函数叫leaked_scaler,完全照搬baseline第六十七行的逻辑。
把训练窗和测试窗合并,计算全局均值和全局标准差,然后做标准化。
第二个函数叫causal_scaler,严格遵守时间因果律。
只用训练窗的均值和标准差,去标准化测试窗。
然后,他让两个函数分别对同一份合成数据进行处理,把标准化之后的异常分数打印出来。
最后再加一行tplotlib画图代码,把两组结果叠在同一张图上。
代码总长不到四十行。
江临点击运行。
不到一秒钟,屏幕上跳出了那张对照图。
跟之前用真实数据跑出来的结果几乎一模一样。
leaked_scaler处理后的异常分数曲线,比causal_scaler矮了将近一截。
那些本该刺破天际的尖峰,被未来信息悄悄地按了下去。
干净,纯粹,无可辩驳。
江临把这张对照图截下来,存进文件夹。
接着,他做了一件更狠的事情。
给这个最小复现实验,写了一份像一份实验室设备校准记录的REAd说明文档。
文档第一节,是脚本的目的陈述。
“本脚本旨在使用纯合成数据,复现真实数据集中观测到的预处理阶段未来信息泄漏现象。本脚本完全不依赖主办方提供的任何原始数据,所使用的所有随机数均由锁定种子42生成,理论上可在任意支持nuy1.24以上版本的python环境中得到完全一致的输出。“
文档第二节,是逐行代码注释。
文档第三节,是预期输出的精确数值。
江临把两组异常分数序列、每一个时间点的具体数值,都以表格形式打印在了REAd里。
任何人只要运行一次脚本,就能用diff命令逐字节比对自己的输出和他的输出是否一致。
文档第四节,是数学推导。
他用三页纸的篇幅,从最基础的标准化公式出发,一步一步推导了当测试集样本参与计算时,为什么会导致测试窗内的极端值在标准化后被系统性低估。
每一个推导步骤都有编号,每一个公式都有引用来源。
文档第五节,是工程建议。
他冷静地列出了三种正确的预处理方案,并标注了各自的适用场景和计算开销。
最后一节,是免责声明。
“本实验的所有代码、数据和推导过程,均不涉及主办方提供的任何脱敏数据集的内部信息。本实验旨在通过最小化的方式独立验证一个数学事实,与主办方平台的具体实现细节无关。“
这份REAd一旦发出去,对方就彻底失去了所有可以模糊处理的空间。
他用的是合成数据,对方没办法说他在恶意攻击平台。
他锁了种子还附了精确数值,对方没办法说他不可复现。
他给了三页的数学推导,对方没办法说他没有理论依据。
他给出的是建议,不是指责,对方没办法说他在指手画脚。
这就像在物理实验里搭出一个最小闭环的对照装置。
输入固定,处理流程固定,输出差异固定。
你可以不喜欢结论,但不能说它没有发生。
江临扫了一眼右下角的时间,把整个文件夹打包成一个命名为reproduce_leakage_v1.0.zip的文件。
然后切回浏览器,打开那封站内信,点击补充材料上传按钮。
页面提示:补充材料已提交,等待评审组复核。
江临关掉浏览器,从椅子上站起来,走到窗边把窗帘拉开了一道缝。
外面的阳光刺眼得让他眯起了眼睛。
他这才意识到,自己已经连续在屋子里待了将近五天。
转身去洗了个澡。
热水冲在后颈上的那一刻,他脑子里那根紧绷了四天的弦,终于稍微松开了一点。
用毛巾擦头发的时候,他听到客厅里母亲在跟父亲低声说着什么。
“都关在屋里五天了,连饭都是我端进去的。”
“年轻人有事情忙是好事,别去打扰他。”
“我就是担心。”
“孩子能吃能喝的,状态好得很,你少瞎操心。”
江临擦头发的动作停了一下。
他想了想,把毛巾搭在脖子上,推门走了出去。
“妈,下午我想出去走走。”
母亲从沙发上回头看他,脸上瞬间堆起笑容:“哎,去吧去吧,妈给你转点零花钱。”
……
与此同时,上海,浦东某写字楼的二十三层。
平台技术组的内部会议室里坐着六个人,没有人大声说话。
单越是这种声音越低的时候,事情反而越重。
长条会议桌的主位坐着的是一个四十多岁,戴着金丝眼镜的男人,是这次挑战赛的技术负责人,姓沈。
他的笔记本电脑屏幕上,正显示着一份pdF的第十八页。
页眉的位置印着两行小字。
“《分钟级行情数据异常检测与回测前置审计报告》”
“提交者:1453号。”
沈工的右手食指无意识地敲着桌面,节奏越来越快。
“这个1453号,背景查到了吗?”
坐在他左手边的一个戴着耳机的年轻工程师立刻摇头:“注册信息只有一个手机号和一个邮箱,我们只能看到注册时主动留的手机号归属地和邮箱域名,更深的身份核查不能做,用户协议卡得很死。”
“你们说,对方会是什么身份,某个高校的研究生?”沈工皱了皱眉。
“不像。”另一个年纪稍长的女工程师摇头,“研究生写报告习惯用Latex,遣词造句也有学术八股的味道。但这份报告的写法非常……”
她犹豫了一下,找了个合适的形容词。
“非常工程化。”
“工程化?”
“就是那种在一线干过活的人才写得出来的语气。你看他第二页画的那张污染链路拓扑图,他根本不是从金融的角度在看这份数据,而是从测量系统的角度在看的。”
“他可能根本不关心市场,只关心从交易所到平台之间的每一层数据传输环节,哪一层最有可能掉包、漂移、错位。”
女工程师翻到报告的第八页,把屏幕转向沈工。
“真正麻烦的不是他指出了横向缺失。横向缺失只要画热力图,细心一点的人都能看见。麻烦的是,他把这些缺失带、价格尺度跳变和source_flag的分组变化放在了一张图里。”
沈工低头看屏幕。
报告第八页上有一张三层对齐图。
最上面是按 nute_id展开的缺失热力图,中间是若干个脱敏标的在相邻date_id边界处的价格尺度变化。
最下面是一条被离散化后的source_flag分组序列。
三条图之间,被江临用细灰线拉出了几组对应关系。
在图下方,他只写了一句很冷的判断。
【source_flag的真实业务含义未知,本文不对其作确定解释。但该字段分组变化与若干横向缺失带、尺度突变边界存在统计相关,建议主办方按source_flag分层复核底层数据源、清洗批次或供应商接口切换记录。】
会议室里安静了几秒。
年轻工程师低声说:“他没有说source_flag是供应商编号。”