3. 流动性数据获取与清洗
做ETF流动性过滤,第一步不是写筛选规则,而是把“流动性”变成一张干净、对齐、可复算的数据表。现实中我们拿到的原始数据往往来自两三个渠道:交易所披露的成交与份额数据、行情数据商的逐日行情、以及基金公司或指数公司提供的规模与持仓信息。这些数据在字段口径、时间戳、复权方式和缺失模式上都不一致,直接拿来算换手率或成交额排名,很容易得出错误结论。本节围绕“取数—清洗—对齐”三个环节,讲清楚每一步实际怎么做、做到什么程度算合格。
一、数据来源与字段口径
交易所层面最核心的是每日成交数据:成交金额、成交量、收盘价、流通份额。成交金额是流动性过滤最常用的主指标,因为它同时反映了价格和交易活跃度;成交量单独使用会被低价ETF放大。数据商层面通常提供逐日行情(开高低收、成交额、换手率)以及复权因子。基金层面提供份额变动、规模、跟踪指数。三类数据各有用途:成交额用于计算流动性水平,份额与规模用于计算换手率和判断规模门槛,复权因子用于处理分红拆分导致的价格跳变。
需要特别注意的是口径统一。同样是“成交额”,有的数据商统计的是二级市场竞价成交,有的包含大宗交易;同样是“流通份额”,有的按份额登记日,有的按交易日日终。教学示例中我们约定:成交额取二级市场竞价成交金额,份额取交易日日终流通份额,价格取不复权收盘价并单独保留复权因子。这个约定必须在整条流水线中保持一致,否则后续换手率会失真。
二、缺失值处理:先判断类型,再决定动作
缺失不是一律填补。ETF数据的缺失大致分三类:第一类是“非交易日缺失”,周末和节假日没有行情是正常的,不应填补,只需按交易日历对齐;第二类是“停牌或暂停交易导致的缺失”,此时成交额应为0而非缺失,需要区分“没有交易”和“没有记录”;第三类是“数据源漏报”,即当天确实有交易但数据商没给,这类才需要处理。
实操中先用交易日历做左连接,把非交易日排除,再检查剩余缺失。对停牌日,用交易所公告或成交量为0的记录标记为“零成交日”,成交额补0、换手率补0,但保留标记列以便后续识别。对漏报,若缺失连续不超过2个交易日,可用前后交易日均值做短期插补并打上“插补”标记;若连续缺失超过3个交易日,不建议插补,直接将该ETF在该区间标记为“数据不可用”,在流动性打分时降权或剔除。关键是所有填补动作都要留痕,新增“数据质量标记”列,记录原始值、填补值和填补方法。
三、异常值检测:三类典型问题
ETF流动性数据的异常值主要有三种。第一种是价格跳变,多由分红、拆分、份额折算引起,表现为单日收益率极端但成交正常。处理方式是结合复权因子判断:若复权因子当日发生变化,则用复权价计算收益率,原始价保留。第二种是成交额脉冲,某日成交额突然放大数十倍,常见于指数调整、ETF纳入互联互通或大额申赎。这类值本身是真实的,不应简单删除,但会扭曲均值,建议在计算流动性水平时改用滚动中位数或截尾均值。第三种是份额突变,单日份额大幅增减,可能来自大额申购赎回,需与规模数据交叉验证,确认后再决定是否影响换手率计算。
检测方法上,价格跳变可用“单日收益率绝对值超过阈值且复权因子未变”作为初筛条件;成交额脉冲可用“当日成交额 / 过去20日成交额中位数”的比值,比值超过10倍时人工复核;份额突变用“份额日变动率”排序后检查前后各5个交易日的连续性。异常值处理的原则是“标记优先、修正谨慎”,能解释的保留并标记,不能解释的才修正或剔除。
四、数据对齐:主键、频率与口径三件事
对齐的第一步是确定主键。ETF流动性面板的标准主键是“ETF代码 + 交易日”,所有来源的数据都向这个主键收敛。交易所数据通常按代码和日期给出,数据商行情也是,但基金份额数据可能按周或按月披露,这时需要做频率对齐:把低频数据向前填充到日频,但必须限制填充长度,例如份额数据最多向前填充5个交易日,超过则标记为“份额数据滞后”。
第二步是交易日历对齐。用交易所公布的交易日历作为基准,对每个ETF做左连接,确保面板中每个ETF在每个交易日都有一行。非交易日不进入面板;停牌日保留行但成交额补0并标记。这样后续计算滚动20日成交额中位数时,不会因为缺行导致窗口错位。
第三步是口径复核。对齐完成后抽查若干ETF的换手率:用成交额除以流通份额对应的市值,与数据商提供的换手率对比,偏差超过10%的要回查成交额口径和份额口径。这一步是很多流水线容易省略但最值得做的质检,因为口径错误往往不会报错,只会让筛选结果悄悄偏移。
五、一份可执行的数据质量检查清单
把上述动作固化成检查项,每次更新数据后跑一遍,能显著降低返工。以下清单可直接作为数据交付前的验收依据:
| 检查项 | 判断条件 | 处理动作 |
|---|---|---|
| 主键唯一性 | “代码+交易日”无重复 | 重复则保留最新来源并记录 |
| 交易日覆盖率 | 每个ETF行数等于区间交易日数 | 缺行则补行并标记缺失类型 |
| 停牌日标记 | 成交量为0且无成交额 | 成交额补0,标记“零成交” |
| 价格跳变 | 单日收益率绝对值>15%且复权因子未变 | 人工复核,确认后修正或标记 |
| 成交额脉冲 | 当日/20日中位数>10倍 | 保留原值,计算时用截尾均值 |
| 份额滞后 | 向前填充超过5个交易日 | 标记“份额滞后”,打分时降权 |
| 换手率口径 | 与数据商换手率偏差>10% | 回查成交额与份额口径 |
完成以上步骤后,得到的是一张带质量标记的日频面板:每行是一个ETF在一个交易日的成交额、成交量、收盘价、复权因子、流通份额、换手率以及若干质量标记列。这张面板是后续流动性打分和样本筛选的唯一输入,任何筛选规则的调整都应基于它重新计算,而不是回到原始多源数据上临时拼接。数据清洗的价值不在于把数据“修得好看”,而在于让每一个后续判断都有可追溯的依据。