4. 持仓数据准备与清洗

板块切换期的仓位暴露测算,最终精度并不取决于模型多复杂,而取决于底表是否干净。券商导出的持仓明细往往带着大量"脏数据":同一只股票在不同账户里行业名称写法不一、除权后价格跳空、部分持仓市值缺失、个别记录数量为负。如果直接把这些数据丢进暴露计算,得到的行业权重会出现系统性偏差。本节围绕四个环节展开:持仓明细获取、证券行业分类映射、复权处理、缺失值与异常值处理,目标是产出一张"每行一个证券、字段完整、口径统一"的可计算底表。

一、持仓明细获取:先明确取数口径

持仓明细通常来自三个渠道:券商交易系统导出、托管行估值表、内部投资管理系统(OMS/IMS)接口。无论哪种渠道,取数前必须先锁定四个口径,否则后续清洗无从对齐。

  • 时点口径:取日终持仓还是盘中实时持仓。板块切换测算一般用日终持仓,需明确是T日收盘后还是T+1日清算后,两者在途交易处理不同。
  • 范围口径:是否包含融券卖出、转融通出借、质押冻结、新股申购在途。这些持仓在暴露计算中是否计入,需在取数阶段就标注,而不是清洗时再猜。
  • 字段口径:至少需要证券代码、证券名称、市场(沪/深/北/港/美)、持仓数量、持仓市值、成本价、账户号、币种。市值字段若缺失,需保留数量与收盘价以便回算。
  • 单位口径:数量是股还是手,市值是元还是万元,港股是否已按汇率折算。单位错位是最隐蔽的错误,10倍偏差往往源于此。

实际操作中,建议保留原始导出文件不做修改,另存一份工作副本,并在副本中增加"数据来源""取数时点""口径备注"三列,便于回溯。示例参数:某组合T日导出明细共1,842行,覆盖3个账户、沪深北三个市场,其中港股通持仓86行,币种为港币,需按当日中间价折算为人民币后再参与暴露计算。

二、证券行业分类映射:把"名称"变成"标准行业码"

持仓明细里的行业字段通常是券商自定义的行业名称,颗粒度和标准都不统一。暴露测算需要的是统一行业分类体系,常见选择有申万一级/二级、中信一级、证监会行业、GICS等。映射的核心是建立"证券代码 → 标准行业码"的对照表,而不是依赖名称模糊匹配。

映射流程分三步。第一步,以证券代码为主键,与内部证券主数据表关联,取得标准行业码;第二步,对关联不上的记录(新股、退市整理、代码变更)建立人工映射清单,逐条确认;第三步,对同一代码在不同账户出现不同行业名称的情况,以主数据为准强制统一,并记录差异原因。需要特别注意的是,行业分类会随指数公司调整而变更,映射表必须带"生效日期"字段,避免用新分类回算历史持仓。

映射覆盖率是必须检查的指标:未映射记录数 / 总记录数。一般要求覆盖率不低于99.5%,剩余未映射记录若市值占比很小,可归入"其他"并在报告中披露;若占比超过1%,应暂停测算,先补齐映射。

三、复权处理:让价格与数量在同一口径下可比

复权处理针对的是"持仓成本价"和"收盘价"两个字段。当持仓期间发生分红送转、配股、拆股时,未复权的价格序列会出现跳空,导致成本价与现价不可比,进而使浮盈、权重计算失真。处理原则是:成本价与收盘价必须使用同一复权口径。

常用做法是采用后复权价格计算收益率,或用前复权价格计算当前市值权重。具体到持仓底表,若原始成本价为除权前价格,需按复权因子调整为可比价格。复权因子可从行情数据源获取,按"证券代码 + 除权日期"匹配。示例:某股票10送3,除权前成本价13.00元,复权因子1.3,调整后可比成本价为10.00元;若直接用13.00元与除权后收盘价10.20元比较,会误判为浮亏,实际为浮盈2%。

需要提醒的是,复权只调整价格,不调整持仓数量。送转导致的股数变化应已在持仓数量中体现,若数量未更新而价格已复权,会造成市值重复计算。因此复权处理必须与数量核对同步进行。

四、缺失值与异常值处理:建立可执行的判断规则

清洗的最后一步是把"不能直接计算"的记录处理成"可计算或可排除"的记录。缺失值常见于市值字段、行业字段、价格字段;异常值常见于数量为负、市值为零、单只证券权重畸高、价格明显偏离行情。

处理规则建议按"可回算优先、可修正次之、排除兜底"的顺序执行:市值缺失但有数量和收盘价的,回算补齐;行业缺失但代码可识别的,补映射;数量为负且属于融券业务的,单独标记为负向暴露而非删除;价格与行情偏离超过阈值的,先核对是否复权口径错误,确认无法修正的再排除并记录。所有被修正或排除的记录,都应在底表中保留"处理标记"和"处理说明"两列,确保测算结果可解释、可复核。

持仓数据准备与清洗流程 原始明细 → 口径统一 → 行业映射 → 复权对齐 → 缺失/异常处理 → 可计算底表 ① 持仓明细获取 券商导出 / 托管估值表 锁定:时点·范围·字段·单位 保留原始文件 + 工作副本 示例:1,842行 / 3账户 ② 行业分类映射 代码为主键关联主数据 人工映射清单补漏 映射表带"生效日期" 覆盖率 ≥ 99.5% ③ 复权处理 成本价与收盘价同口径 按代码+除权日匹配因子 复权只调价、不调量 示例:10送3,因子1.3 ④ 缺失/异常处理 可回算 → 可修正 → 排除 负数量标记为负向暴露 保留处理标记与说明 确保可解释可复核 可计算持仓底表 每行一个证券 · 字段完整 · 口径统一 · 处理可追溯 底表关键字段示例(节选) 证券代码 标准行业码 持仓数量 复权后成本价 收盘价 市值(元) 处理标记 600XXX 申万一级-电子 13,000 10.00 10.20 132,600 已复权 007XX.HK 申万一级-传媒 2,000 — 折算后价 回算补齐 市值回算

完成上述四步后,底表应满足三个验收条件:一是行业映射覆盖率达标,未映射记录市值占比可披露;二是成本价与收盘价复权口径一致,数量与价格变动匹配;三是所有修正和排除记录都有标记与说明。只有这样的底表,才能支撑后续的行业暴露汇总与板块切换测算,避免"垃圾进、垃圾出"。

常见陷阱:用证券名称做行业映射的主键。名称会因简称变更、ST标记、港股中文名差异而失配,务必以代码为主键,名称为辅助校验。另一个陷阱是复权后忘记同步更新数量,导致市值被重复放大,测算前应做一次"数量×价格≈市值"的抽样核对。