3. 数据源准备:高频行情数据表结构、坏账标签表结构、时间分区与快照设计

高频行情坏账率 PSI 漂移监控的基石是高质量、可回溯的数据源。本章将详细定义两类核心数据表的结构设计、时间分区策略以及快照机制,确保后续的 PSI 计算与漂移检测具备准确、高效且可复现的数据基础。

3.1 高频行情数据表结构

高频行情数据是 PSI 计算的“特征输入”。表结构需兼顾存储效率与查询性能,通常采用列式存储(如 Parquet)并配合合理的数据类型。

字段名 数据类型 字段说明 分区键
symbol STRING 交易标的代码(如 BTCUSDT) 是
trade_time TIMESTAMP 撮合时间(毫秒精度) 是
price DOUBLE 成交价格 否
volume DOUBLE 成交量(基础货币单位) 否
side STRING 主动成交方向(BUY/SELL) 否
trade_id BIGINT 全局唯一成交编号 否
dt STRING 日期分区(格式:yyyy-MM-dd) 是
设计要点:高频行情表通常以 symbol 和 dt 作为联合分区键,避免全表扫描。对于日内查询,可进一步按 trade_time 进行桶排序(bucketing),加速时间窗口聚合。

3.2 坏账标签表结构

坏账标签是 PSI 计算的“目标变量”。该表记录每笔订单最终是否演变为坏账,以及坏账发生的具体时间点,用于与行情数据关联生成“坏账率”指标。

字段名 数据类型 字段说明 分区键
order_id STRING 订单唯一标识 否
symbol STRING 交易标的代码 是
open_time TIMESTAMP 开仓时间 否
close_time TIMESTAMP 平仓/强平时间 否
is_bad_debt BOOLEAN 是否标记为坏账 否
bad_debt_amount DOUBLE 坏账金额(若为坏账) 否
bad_debt_time TIMESTAMP 坏账确认时间 否
dt STRING 日期分区(基于 close_time) 是
关键约束:坏账标签表必须与行情表使用相同的 symbol 编码规则,且 dt 分区需对齐。若坏账确认时间晚于平仓时间,需以 bad_debt_time 所在日期作为分区依据,确保数据时效性。

3.3 时间分区与快照设计

PSI 监控要求在不同时间窗口(如日、周、月)上对比特征分布。合理的时间分区与快照设计是高效执行对比查询的关键。

3.3.1 时间分区策略

  • 日期分区(dt):所有表统一使用 dt 作为一级分区,格式为 yyyy-MM-dd。查询时通过 WHERE dt = '2025-03-01' 快速裁剪数据。
  • 小时/分钟子分区(可选):对于日内高频监控,可在 dt 下增加 hour 或 minute 子分区,进一步加速细粒度聚合。
  • 快照表(Snapshot Table):为支持历史回溯,每日生成一张“全量快照表”,包含当日所有活跃订单的最终状态。快照表以 snapshot_dt 为分区键,保留最近 90 天数据。

3.3.2 快照设计示例

-- 创建每日快照表
CREATE TABLE risk.snapshot_daily (
    snapshot_dt STRING,
    symbol STRING,
    order_id STRING,
    open_time TIMESTAMP,
    close_time TIMESTAMP,
    is_bad_debt BOOLEAN,
    bad_debt_amount DOUBLE,
    -- 衍生特征:坏账率标签
    bad_debt_flag INT
)
PARTITIONED BY (dt STRING)
STORED AS PARQUET;

-- 插入当日快照数据
INSERT OVERWRITE TABLE risk.snapshot_daily PARTITION (dt = '2025-03-01')
SELECT
    '2025-03-01' AS snapshot_dt,
    symbol,
    order_id,
    open_time,
    close_time,
    is_bad_debt,
    bad_debt_amount,
    CASE WHEN is_bad_debt THEN 1 ELSE 0 END AS bad_debt_flag
FROM risk.order_labels
WHERE dt = '2025-03-01';
快照优势:快照表将“当日订单状态”固化,避免后续因数据回溯导致的 PSI 计算结果漂移。PSI 计算时,只需读取对应日期的快照分区,无需关联多张原始表。

3.4 数据源架构总览

下图展示了高频行情数据、坏账标签数据与快照表之间的流转关系,以及时间分区如何支撑 PSI 监控的对比查询。

数据源架构与时间分区设计 数据源架构与时间分区设计 高频行情数据表 分区: symbol + dt 坏账标签数据表 分区: symbol + dt 每日快照表 分区: snapshot_dt PSI 漂移计算 对比: T日 vs T-7日 时间分区策略 dt 分区 + 快照回溯 快照保留策略 保留近 90 天快照

3.5 数据源准备清单

在实际落地时,请按以下步骤完成数据源准备,避免遗漏关键环节:

  1. 确认行情数据粒度:确保高频行情表包含毫秒级 trade_time,且 price 和 volume 无空值。
  2. 对齐坏账标签时间:坏账标签的 close_time 或 bad_debt_time 必须能与行情表的 trade_time 窗口关联。
  3. 创建快照表并初始化:运行示例 SQL 创建 snapshot_daily 表,并回填最近 30 天数据。
  4. 验证分区裁剪:执行 EXPLAIN SELECT ... WHERE dt = '2025-03-01' 确认查询只扫描对应分区。
  5. 设置数据保留策略:原始行情表保留 7 天,快照表保留 90 天,坏账标签表永久保留。
实操建议:在开发环境中,先使用 3 天的行情与标签数据构建快照,验证 PSI 计算逻辑无误后,再扩展至全量数据。快照表建议使用列式存储(Parquet)并启用压缩,可减少 60% 以上的存储空间。