花了一个周末,把整个系统从数据接口到策略引擎完整审计了一遍。结果比预想的严重——5个高危Bug正在悄无声息地让系统空转。
系统上线三周,策略引擎越写越多,但总觉得哪里不对劲。
有些策略跑了一天什么结果都没有。有些标的分时数据完全对不上。偶尔看到一个信号推上来,追踪几小时又消失了。
与其猜,不如查。一个周末,开始审计全部42,144行代码。
七星剑阵——调用了7个经典策略的调度器——有一个我犯的错误:用.get()方法读取Futu API返回的行情数据。但在API的接口格式下,.get()对于pandas Series是无效的。
后果是什么?行情快照解析返回Price=0,全部标的被过滤掉。
这不是报错——没有报错——它只是默默地返回了空结果。连续几天的扫描,用户看到的是「无信号」,以为市场在震荡,其实是接口层已经断了。
yfinance是港美股的数据源之一。它在多线程场景下会共享session,导致多个标的请求互相污染——你看到的某只标的价格,实际上是上一只标的的数据。
这个bug最难追查的地方在于:数据看起来是真的,偶尔还会对,但大多数时间是错的。只有在对账单、查数据序列时才能发现「为什么这几只标的的走势一模一样」。
TickDB是一个备用数据源,它的免费计划有8-10秒/次的限流。但代码里对所有标的强制启用了这个后备,意味着扫描20只以上标的时,系统会在后备环节被卡住。
从用户角度看——又是「没有信号」的一天。
修复bug之后,我做了另一件重要的事:调整了策略引擎的门槛参数。
之前的设计思路是「等信号变得非常明确才标记」,阈值设得太高,导致在震荡行情中几乎没有信号输出。
新的思路是「只要发现异常迹象就标记,多个迹象叠加说明置信度高」:
目的不是制造更多虚假信号,而是让系统在行情启动早期就能标记异动,再通过交叉验证来确认置信度。
还写了一个新的先导预警模块,专门捕捉「价格还没动之前」的信号:
这三个信号在价格还未启动时就已经存在,比纯价格分析提前数小时到数天。
全库42,144行代码,覆盖42个Python文件。审计了9个核心文件(约占总体代码量的15%),发现了2个功能中断级Bug、2个数据污染级Bug、1个连接泄漏Bug,以及若干代码质量问题。
修复了5个文件,调整了6个策略的阈值参数,新增了1个先导预警模块。
周末的一天,换来了下周一可以放心启动的系统。
不构成任何投资建议。以上内容仅为技术工作日志。
💬 留言