3. 流动性数据获取与清洗

做ETF流动性过滤,第一步不是写筛选规则,而是把“流动性”变成一张干净、对齐、可复算的数据表。现实中我们拿到的原始数据往往来自两三个渠道:交易所披露的成交与份额数据、行情数据商的逐日行情、以及基金公司或指数公司提供的规模与持仓信息。这些数据在字段口径、时间戳、复权方式和缺失模式上都不一致,直接拿来算换手率或成交额排名,很容易得出错误结论。本节围绕“取数—清洗—对齐”三个环节,讲清楚每一步实际怎么做、做到什么程度算合格。

一、数据来源与字段口径

交易所层面最核心的是每日成交数据:成交金额、成交量、收盘价、流通份额。成交金额是流动性过滤最常用的主指标,因为它同时反映了价格和交易活跃度;成交量单独使用会被低价ETF放大。数据商层面通常提供逐日行情(开高低收、成交额、换手率)以及复权因子。基金层面提供份额变动、规模、跟踪指数。三类数据各有用途:成交额用于计算流动性水平,份额与规模用于计算换手率和判断规模门槛,复权因子用于处理分红拆分导致的价格跳变。

需要特别注意的是口径统一。同样是“成交额”,有的数据商统计的是二级市场竞价成交,有的包含大宗交易;同样是“流通份额”,有的按份额登记日,有的按交易日日终。教学示例中我们约定:成交额取二级市场竞价成交金额,份额取交易日日终流通份额,价格取不复权收盘价并单独保留复权因子。这个约定必须在整条流水线中保持一致,否则后续换手率会失真。

二、缺失值处理:先判断类型,再决定动作

缺失不是一律填补。ETF数据的缺失大致分三类:第一类是“非交易日缺失”,周末和节假日没有行情是正常的,不应填补,只需按交易日历对齐;第二类是“停牌或暂停交易导致的缺失”,此时成交额应为0而非缺失,需要区分“没有交易”和“没有记录”;第三类是“数据源漏报”,即当天确实有交易但数据商没给,这类才需要处理。

实操中先用交易日历做左连接,把非交易日排除,再检查剩余缺失。对停牌日,用交易所公告或成交量为0的记录标记为“零成交日”,成交额补0、换手率补0,但保留标记列以便后续识别。对漏报,若缺失连续不超过2个交易日,可用前后交易日均值做短期插补并打上“插补”标记;若连续缺失超过3个交易日,不建议插补,直接将该ETF在该区间标记为“数据不可用”,在流动性打分时降权或剔除。关键是所有填补动作都要留痕,新增“数据质量标记”列,记录原始值、填补值和填补方法。

判断缺失类型的一个实用技巧:同时看成交量和收盘价。若两者都缺失,多为非交易日或整行漏报;若成交量有值而成交额为0,多为停牌或数据字段异常;若价格有值而成交额缺失,优先怀疑数据商字段漏报。

三、异常值检测:三类典型问题

ETF流动性数据的异常值主要有三种。第一种是价格跳变,多由分红、拆分、份额折算引起,表现为单日收益率极端但成交正常。处理方式是结合复权因子判断:若复权因子当日发生变化,则用复权价计算收益率,原始价保留。第二种是成交额脉冲,某日成交额突然放大数十倍,常见于指数调整、ETF纳入互联互通或大额申赎。这类值本身是真实的,不应简单删除,但会扭曲均值,建议在计算流动性水平时改用滚动中位数或截尾均值。第三种是份额突变,单日份额大幅增减,可能来自大额申购赎回,需与规模数据交叉验证,确认后再决定是否影响换手率计算。

检测方法上,价格跳变可用“单日收益率绝对值超过阈值且复权因子未变”作为初筛条件;成交额脉冲可用“当日成交额 / 过去20日成交额中位数”的比值,比值超过10倍时人工复核;份额突变用“份额日变动率”排序后检查前后各5个交易日的连续性。异常值处理的原则是“标记优先、修正谨慎”,能解释的保留并标记,不能解释的才修正或剔除。

ETF流动性数据:多源获取 → 清洗 → 对齐 交易所成交数据 成交额 / 成交量 / 收盘价 数据商行情 逐日行情 / 复权因子 基金份额与规模 流通份额 / 规模 / 跟踪指数 清洗与校验 缺失分类 非交易日 / 停牌 / 漏报 异常检测 价格跳变 / 成交脉冲 / 份额突变 留痕标记 原始值 / 填补值 / 方法 数据对齐 交易日历左连接 剔除非交易日 主键统一 ETF代码 + 交易日 口径复核 成交额 / 份额 / 复权 干净 面板 可复算 关键原则:缺失先分类再处理,异常先标记再修正,对齐以“ETF代码 + 交易日”为主键并统一口径 所有填补与修正动作保留原始值、处理方法和质量标记,保证流动性打分可追溯、可复算

四、数据对齐:主键、频率与口径三件事

对齐的第一步是确定主键。ETF流动性面板的标准主键是“ETF代码 + 交易日”,所有来源的数据都向这个主键收敛。交易所数据通常按代码和日期给出,数据商行情也是,但基金份额数据可能按周或按月披露,这时需要做频率对齐:把低频数据向前填充到日频,但必须限制填充长度,例如份额数据最多向前填充5个交易日,超过则标记为“份额数据滞后”。

第二步是交易日历对齐。用交易所公布的交易日历作为基准,对每个ETF做左连接,确保面板中每个ETF在每个交易日都有一行。非交易日不进入面板;停牌日保留行但成交额补0并标记。这样后续计算滚动20日成交额中位数时,不会因为缺行导致窗口错位。

第三步是口径复核。对齐完成后抽查若干ETF的换手率:用成交额除以流通份额对应的市值,与数据商提供的换手率对比,偏差超过10%的要回查成交额口径和份额口径。这一步是很多流水线容易省略但最值得做的质检,因为口径错误往往不会报错,只会让筛选结果悄悄偏移。

五、一份可执行的数据质量检查清单

把上述动作固化成检查项,每次更新数据后跑一遍,能显著降低返工。以下清单可直接作为数据交付前的验收依据:

检查项判断条件处理动作
主键唯一性“代码+交易日”无重复重复则保留最新来源并记录
交易日覆盖率每个ETF行数等于区间交易日数缺行则补行并标记缺失类型
停牌日标记成交量为0且无成交额成交额补0,标记“零成交”
价格跳变单日收益率绝对值>15%且复权因子未变人工复核,确认后修正或标记
成交额脉冲当日/20日中位数>10倍保留原值,计算时用截尾均值
份额滞后向前填充超过5个交易日标记“份额滞后”,打分时降权
换手率口径与数据商换手率偏差>10%回查成交额与份额口径

完成以上步骤后,得到的是一张带质量标记的日频面板:每行是一个ETF在一个交易日的成交额、成交量、收盘价、复权因子、流通份额、换手率以及若干质量标记列。这张面板是后续流动性打分和样本筛选的唯一输入,任何筛选规则的调整都应基于它重新计算,而不是回到原始多源数据上临时拼接。数据清洗的价值不在于把数据“修得好看”,而在于让每一个后续判断都有可追溯的依据。