3. 数据采集与预处理实战
归因分析的质量上限,在数据准备阶段就已经被决定了。多题材共振归因需要回答的是“某只股票在某段时间的涨跌,有多少可以由它所属题材的共振来解释”,因此基础数据集必须同时具备三样东西:可追溯的题材归属关系、对齐到同一时间轴的行情序列、带时间戳的舆情事件。本节按“股票池 → 行情 → 舆情 → 清洗对齐 → 基础数据集”的顺序,把这条数据流水线落到可执行的字段与代码层面。
一、多题材股票池:把“归属”建成带时效的关系表
题材归属不是静态属性。一只股票可能在上半年属于“机器人”概念,下半年因主业变更被调入“电力设备”,若用一张当前快照表回溯历史,就会产生前视偏差。因此股票池应设计为关系表而非宽表,核心字段包括:股票代码、题材名称、题材层级(一级行业/二级概念/事件驱动)、纳入日期、剔除日期、来源渠道、置信度。同一股票在同一题材下允许多条时间不重叠的记录。
实操中可先用交易所行业分类打底,再叠加概念板块数据,最后人工补充事件驱动题材。示例(合理假设数据):
code theme level in_date out_date source conf
600XXX 人形机器人 概念 2024-03-11 2024-09-30 concept_db 0.9
600XXX 减速器 概念 2024-03-11 None concept_db 0.8
002YYY 电力设备 行业 2023-01-01 None industry 1.0
300ZZZ 人形机器人 概念 2024-05-06 2024-08-15 news_tag 0.6
注意 out_date 为空表示当前仍有效;conf 低于 0.7 的新闻打标题材建议单独存放,归因时作为敏感性检验而非主口径。
二、行情数据:复权口径与频率必须一次定死
行情采集的关键不是“拿到数据”,而是口径统一。归因计算收益率时,若个股用不复权价、题材指数用复权价,除权日会出现虚假的负收益,直接污染归因结果。建议统一采用后复权收盘价计算区间收益,同时保留原始收盘价与复权因子以便核对。频率上,日频用于中期归因,分钟频仅在事件窗口研究时引入,且必须与舆情时间戳对齐到同一时区(统一为北京时间)。
采集后立即做三项体检:交易日历是否与基准指数一致、停牌日是否被错误填充为前收盘、涨跌幅是否超出当日涨跌停限制。任何一项异常都应回查数据源,而不是在后续步骤“修补”。
三、舆情数据:从原始文本到可对齐的事件表
舆情数据的价值在于时间戳的准确性。一条新闻的“发布时间”和“入库时间”可能相差数小时,归因必须使用发布时间。清洗流程为:去重(按标题+正文指纹)→ 剔除广告与行情播报类模板文本 → 情感打分(-1 到 +1)→ 题材打标(关键词+分类模型,保留置信度)→ 生成事件表。事件表字段建议为:event_id、publish_time、stock_code、theme、sentiment、conf、source。
对于盘中发布的舆情,需明确约定:发布时间早于当日 15:00 的事件计入当日,晚于 15:00 的计入下一交易日,避免用收盘后信息解释当日涨幅。
四、清洗与对齐:把三张表压到同一时间轴
对齐的核心是构造一张交易日 × 股票的主键网格,再把行情、题材归属、舆情事件左连接到网格上。题材归属按“事件日是否落在 in_date 与 out_date 之间”匹配;舆情按“事件日 = 交易日”聚合为当日情感均值与事件条数。缺失值处理原则:行情缺失(停牌)标记为 NaN 而非 0,舆情无事件填 0 条、情感填 0(中性),二者语义不同,不可混用。
五、基础数据集的字段与一次完整校验
最终宽表建议至少包含:trade_date、code、theme、ret_stock、ret_theme、senti_mean、news_cnt、theme_conf、is_suspend。其中 ret_theme 为该股票当日所属题材的等权或市值加权收益,theme_conf 用于后续加权或剔除低置信题材。
交付前做一次闭环校验,示例(合理假设):取 2024-06-14 某股票,后复权收盘价由 12.40 涨至 12.90,ret_stock = 12.90/12.40 - 1 ≈ 4.03%;其所属“人形机器人”题材当日等权收益 3.10%,另一题材“减速器”收益 1.85%;当日该股相关舆情 5 条,情感均值 0.42。若宽表中 ret_stock 与手工复算不一致,或 news_cnt 与事件表按日计数不符,说明对齐环节存在重复连接或时区错位,必须回退修正。只有通过这类逐行抽查,基础数据集才具备进入归因建模的资格。