2. 板块持仓数据获取与清洗
做板块持仓与指数基准的对比,第一步不是算收益,而是把“持仓”这件事变成一张口径统一、可对齐、可复算的表。现实中我们拿到的原始数据往往来自三个完全不同的世界:基金季报披露的十大重仓股与前十大债券、指数公司公布的成分股及权重、以及行业分类标准给出的股票—行业映射。这三类数据在频率、粒度、命名和口径上都不一致,直接拼接必然出错。本节围绕“取什么、怎么对齐、怎么清洗”展开,并给出可直接套用的处理流程与示例。
一、三类常见数据源及其口径差异
基金季报是最常用的主动持仓来源,但它有两个天然限制:一是只披露前十大重仓股,属于“部分持仓”;二是披露频率为季度,且报告期末与实际持仓日之间存在时滞。指数成分股数据(如中证、申万、中信等系列指数)提供的是全样本权重,频率通常为月度或季度调整,适合作为基准。行业分类标准则决定“板块”的边界,常见的有申万行业分类、中信行业分类、证监会行业分类以及主题类自定义分类,不同标准对同一只股票的归属可能不同。
因此,在动手取数前必须先明确三个口径:持仓口径(前十大还是全部)、权重口径(市值占比还是净值占比)、分类口径(用哪套行业标准)。口径不统一,后续任何对比都失去意义。
二、数据提取:把非结构化披露变成结构化表
基金季报的持仓通常以 PDF 或网页表格形式存在,提取时建议统一整理成“基金代码、报告期、股票代码、股票名称、持仓市值、占净值比例”六列。指数成分股则整理为“指数代码、调整日期、股票代码、权重”四列。行业映射整理为“股票代码、分类标准、一级行业、二级行业、生效日期”五列。三张表都以股票代码作为主键,这是后续对齐的基础。
提取环节最容易出问题的是股票代码格式:有的源用 6 位数字,有的带交易所后缀(如 .SH、.SZ),有的用 Wind 或同花顺的内部编码。建议在提取阶段就统一为“6 位代码 + 交易所后缀”的规范格式,并保留原始代码列以便回溯。
三、对齐与清洗:四个必须处理的环节
第一,报告期对齐。基金季报的报告期是季度末,而指数权重可能是月末或调整日。对比时应把指数权重取到与基金报告期最接近的日期,并记录日期差,避免把不同时点的数据混为一谈。
第二,股票代码对齐。以基金持仓的股票代码为左表,左连接行业映射表,得到每只重仓股的行业归属;再左连接指数成分表,判断该股是否在基准指数内。连接后要检查未匹配率,若某行业映射缺失比例过高,说明分类标准版本或代码格式有问题,需回退修正。
第三,缺失值与异常值处理。常见异常包括:占净值比例为空、市值单位不一致(万元与元混用)、同一基金同一报告期出现重复股票行。处理规则应明确:比例为空且无法从市值与净值推算的,标记为缺失并剔除;单位统一换算为元;重复行按市值最大者保留并记录去重日志。
第四,权重归一化。基金前十大重仓股合计占比通常不足 100%,若直接与指数全样本权重比较会系统性低估。常见做法有两种:一是仅比较“前十大重仓股在指数中的对应权重”,保持口径一致;二是将前十大权重归一化到 100% 后再与指数同行业权重比较,但需在报告中注明这是“重仓股内部结构”而非“全部持仓结构”。两种方法不能混用。
四、实战示例:一次完整的清洗过程
假设我们要比较某主动权益基金 2024 年二季度末的行业配置与沪深 300 的行业权重。原始数据为:基金季报前十大重仓股 10 行,含股票代码、名称、持仓市值(万元)、占净值比例;沪深 300 成分股表含 300 行权重;申万一级行业映射表含全市场股票。
第一步,把持仓市值统一换算为元,并检查占净值比例合计。示例中前十大合计占比约 48%,说明这是部分持仓,后续比较必须采用“前十大口径”。第二步,以持仓股票代码左连接申万映射表,得到每只股票的行业;再左连接沪深 300 成分表,标记是否在指数内。若 10 只中有 8 只在指数内,2 只不在,则这 2 只属于“基准外持仓”,在对比时需单独说明。第三步,按行业汇总前十大持仓权重,得到基金在若干行业上的重仓占比;同时按行业汇总这 10 只股票在沪深 300 中的权重,得到基准在相同股票上的权重。两者相减即得“重仓股层面的行业超低配”。
需要强调的是,这个差值只反映前十大重仓股的结构差异,不等于基金全部持仓的行业偏离。若要做全持仓对比,需要更完整的持仓数据(如半年报、年报的全部持仓),并相应调整口径说明。
五、可复用的清洗检查清单
| 检查项 | 判断标准 | 不通过时的处理 |
|---|---|---|
| 股票代码格式 | 全部为 6 位数字 + 交易所后缀 | 统一转换,保留原始列 |
| 行业映射未匹配率 | 低于 5% | 核对分类标准版本与生效日期 |
| 占净值比例合计 | 与披露的前十大合计一致 | 检查单位与重复行 |
| 报告期日期差 | 指数权重日期与报告期差不超过 1 个月 | 改用更近日期或注明差异 |
| 权重口径 | 全文统一为前十大口径或全持仓口径 | 在结果表中标注口径 |