ODB Microstructure Forensics 是一个针对 Open Deviation Bar(ODB)异常的取证排查技能,提供从 ClickHouse 缓存回到原始 Parquet 成交数据的系统性方法论,用于区分算法正确性问题与市场微观结构现象(如清算级联、订单簿扫单、撮合引擎批处理效应)。
【用途与适用场景】 当出现以下情况时使用:ODB K 线在视觉上比同阈值相邻 K 线更大(更高或更宽);K 线持续时间为零或接近零但价格区间极端;abs_dev_dbps 超过阈值(例如在 100 dbps 的 K 线上出现 22 dbps);同一时间戳出现微 K 线簇;需要判断异常是数据缺陷还是市场微观结构;调查 Flowsurface 图表界面标记的特定时间窗口。
【数据源】
- ClickHouse 缓存:opendeviationbar_cache.open_deviation_bars,位于 gpu-host-1,76 列。访问方式:ssh gpu-host-1 后通过 curl 请求本地 8123 端口。
- Parquet 逐笔缓存:/home/tca/.cache/opendeviationbar/ticks/{SYMBOL}/{YYYY-MM-DD}.parquet,位于 gpu-host-1,字段包括 agg_trade_id、price、quantity、first_trade_id、last_trade_id、timestamp、is_buyer_maker。访问方式:ssh gpu-host-1 后 cd /home/tca 并使用 uv run --python 3.14 配合 Polars。 访问模式:始终通过 SSH 直连 gpu-host-1 查询;SSH 隧道(localhost:18123)仅供 Flowsurface 应用运行时使用,取证查询走直连。
【调查方法论:三层下钻】 整体流程为:ClickHouse 总览 → 单根 K 线异常检测 → Parquet 交易级根因。
第一层:ClickHouse K 线总览。在可疑时间窗口内查询 K 线,观察结果集中的异常信号。需标记的信号包括:阈值超调(abs_dev_dbps 远大于 threshold/10,表示单笔交易跨越阈值之外)、零持续时间(dur_s=0,表示整根 K 线在一个撮合引擎周期内形成)、极端区间(range_dbps > 2*threshold/10,价格扫过远超阈值)、微成交量(n_agg<10 但区间很大,大额单笔成交吃穿订单簿)、爆发聚集(同一秒出现多根 K 线,流动性扫单被拆分到多根 K 线中)。
第二层:异常隔离。筛选出异常 K 线,获取其 agg_trade_id 范围,作为 Parquet 下钻的查询键。筛选条件例如 dur_s<1.0 或 abs_dev_dbps 超过 threshold/10 的 1.5 倍。记录 first_agg_trade_id 与 last_agg_trade_id 范围。
第三层:Parquet 交易级根因。在 gpu-host-1 上用 Polars 分析原始成交,依次执行三项分析: (3a)时间戳爆发检测:按 timestamp 分组成交,查找撮合引擎批处理(数百笔成交共享精确到微秒的同一时间戳)。关键诊断:若单个时间戳下有数百笔成交横跨完整价格区间,则为撮合引擎批处理(单个大单扫穿订单簿)。 (3b)订单流分析:区分主动买与主动卖。清算级联通常 95% 以上为单边(全为主动卖或全为主动买)。 (3c)价格跳空分析:查找存在大额价格跳变的单笔成交,这些是阈值超调的直接原因。若个别交易之间的价格跳空超过阈值,则 ODB 算法无法在单笔 agg_trade 内部拆分,超调是固有且正确的。
【根因分类】 完成三层分析后,将发现归类:
- 清算级联:95% 以上单边、50-100+BTC、同一微秒时间戳、扫过 200 美元以上 → Oracle 位精确,无需修复,记录事件。
- 薄盘扫单:成交笔数较少但价位间价格跳空大 → Oracle 位精确,当时订单簿稀薄。
- 孤儿 K 线:ClickHouse 中 is_orphan=1 → 已知现象,写入边界伪影,分析中跳过。
- 算法缺陷:成交呈正态分布、无爆发,但 K 线仍超调 → 向 opendeviationbar-py 提交上游问题。
- 数据缺口:相邻 K 线之间 agg_trade_id 不连续 → Parquet 数据缺失,检查采集管线。
【阈值超调机制】 ODB 算法顺序处理 agg_trade。当第一笔交易相对 K 线开盘价的偏差超过阈值时,K 线关闭。超调机制:K 线以价格 P₀ 开盘,阈值 T(例如 100 dbps=0.1%);算法扫描 P₁、P₂……Pₙ;在交易 Pₖ 处 |Pₖ-P₀|/P₀≥T,K 线于 Pₖ 关闭;若 Pₖ₋₁ 仍在阈值内而 Pₖ 跳变远超,则超调=|Pₖ-P₀|/P₀-T。阈值越低超调越大,因为:BPR10 阈值在 7 万美元 BTC 上为 70 美元,150 美元的订单簿跳空即造成 2 倍超调;BPR50 阈值在 7 万美元 BTC 上为 350 美元,同样的 150 美元跳空则远在阈值之内。这是离散交易数据的固有特性,并非缺陷。
【相关技能】 opendeviation-eval-metrics 评估 ODB 信号质量(输出指标),本技能调查输入数据质量。exchange-session-detector 提供 ClickHouse 中的会话标记,级联常聚集在会话边界(纽约开盘/收盘)。
【自演进与执行后反思】 该技能通过使用不断改进:若指令错误、参数漂移或需要变通,应立即修正文件而非推迟,仅针对真实、可复现的问题更新。技能完成后检查:查询是否成功(若 ClickHouse schema 变更需更新第一层 SQL 模板);Parquet schema 是否变更(若逐笔缓存列变化需更新 Polars 片段);是否发现新的根因模式(加入根因分类表);阈值超调机制解释是否成立。仅在问题真实且可复现时更新,不做推测。
【限制】 资料未提供收费、价格、平台支持范围等信息。该技能依赖特定的私有基础设施(gpu-host-1、ClickHouse 表、Parquet 缓存路径)与 Python 3.14、Polars 环境;缺少这些环境时无法直接执行。