4. 板块划分与成分股映射

板块上涨家数看起来只是一个简单计数,但真正决定这个数字是否可信的,是它背后的“股票—板块”映射关系。同一只股票可能同时属于申万一级行业、申万二级行业、中信行业、概念板块、地域板块和自定义主题板块;如果映射表没有明确“一只股票在某个板块口径下算一次还是多次”,那么统计出来的上涨家数就可能重复计数或漏计。本节要解决的核心问题,就是先确定板块口径,再建立可维护、可校验的成分股映射表,最后让上涨家数的计算有明确的数据来源和边界条件。

一、先定口径:板块不是唯一标签,而是分层标签体系

行业分类标准通常采用多级结构。以申万分类为例,常见层级包括一级行业、二级行业和三级行业;中信分类也有类似的分层逻辑。层级越高,板块数量越少、成分股越多;层级越低,板块越细、成分股越少。对于“板块上涨家数”这个指标,必须先声明统计层级,否则同一个市场在不同软件里会得到不同结果。例如,某只银行股在申万一级行业“银行”中算一次,在二级行业“国有大型银行”中又算一次,如果同时把两个层级混在一起统计,就会把同一只股票重复计入不同板块。

因此,映射表的第一列不应直接写股票代码,而应先写“板块口径”。建议在映射表中至少保留以下字段:板块体系(申万/中信/自定义)、板块层级(一级/二级/三级/概念)、板块代码、板块名称、股票代码、股票名称、纳入日期、剔除日期、权重或是否等权、数据来源。这样做的目的不是增加字段,而是让每一次统计都能回答三个问题:这只股票属于哪个体系、属于该体系的哪一层、在统计日是否仍然有效。

二、建立映射表:从“静态名单”到“带生效区间的记录”

很多初学者会直接把某天的成分股名单复制成一张静态表,然后每天用它计算上涨家数。这种做法在短期内可用,但一旦遇到成分股调整、股票更名、行业分类变更或新股上市,就会产生偏差。更稳妥的做法是把映射表设计成“带生效区间的记录”:每条记录表示某只股票在某个板块口径下,从纳入日期到剔除日期之间有效。统计某日上涨家数时,只取“纳入日期 ≤ 统计日 且(剔除日期为空 或 剔除日期 > 统计日)”的记录。

下面给出一个简化的映射表示例,字段和取值均为教学示例,不代表真实市场数据:

板块体系 层级 板块代码 板块名称 股票代码 纳入日期 剔除日期
申万 一级 801780 银行 600000 2024-01-02
申万 二级 801782 国有大型银行 600000 2024-01-02
自定义 主题 TH001 高股息主题 600000 2024-03-01 2024-12-31

这张表的关键在于:同一只股票可以在不同板块体系中出现多次,但在同一个“板块体系 + 层级 + 板块代码”下,同一统计日只能有一条有效记录。如果出现两条有效记录,就说明映射表存在重复,需要先清洗再计算。

三、上涨家数的计算逻辑与边界条件

有了映射表之后,上涨家数的计算可以拆成三步。第一步,确定统计日 T 和板块口径 P(例如“申万一级行业”)。第二步,从映射表中筛出统计日有效的股票集合 S。第三步,将 S 与当日行情表按股票代码关联,统计收盘价高于前收盘价的股票数量,得到上涨家数;同时可统计下跌家数、平盘家数和停牌家数。这里要特别注意停牌股票的处理:停牌股票没有有效涨跌幅,不应计入上涨或下跌家数,但应在“总家数”中单独说明,否则上涨家数占比会被高估或低估。

另一个常见边界是新股。新股上市首日涨跌幅规则与老股不同,且部分新股在上市初期尚未纳入某些行业分类。如果映射表中已经纳入该新股,但行情表中缺少前收盘价,计算时会出现空值。建议在计算前统一做一次数据质量检查:股票代码是否在行情表中存在、前收盘价是否为正数、当日是否停牌、涨跌幅是否超出合理范围。只有通过检查的记录才进入计数。

板块口径 → 成分股映射 → 上涨家数计算 板块口径 申万一级行业 31 个板块(示例) 申万二级行业 更细粒度,成分更少 中信行业分类 另一套分层体系 自定义主题板块 高股息 / 人工智能等 统计层级声明 同一层级内不重复计数 股票—板块映射表 板块体系 + 层级 + 板块代码 股票代码 + 股票名称 纳入日期 / 剔除日期 权重或等权标记 数据来源与版本号 有效性过滤条件: 纳入日期 ≤ 统计日 且(剔除日期为空 或 剔除日期 > 统计日) 同一口径下仅保留一条有效记录 上涨家数计算 ① 取统计日有效成分股 得到集合 S ② 关联当日行情表 收盘价 / 前收盘价 / 停牌标记 ③ 分类计数 上涨 / 下跌 / 平盘 / 停牌 ④ 计算上涨占比 上涨家数 ÷ 有效交易家数 结果校验 上涨 + 下跌 + 平盘 + 停牌 = 总家数 异常值需回查映射表与行情表 选定口径 有效记录

四、用示例走一遍计算过程

假设统计日为 2025 年 6 月 10 日,口径为“申万一级行业”。从映射表中筛出该日有效的银行板块成分股,假设共 42 只;与当日行情表关联后,发现 1 只停牌、1 只平盘、26 只上涨、14 只下跌。则上涨家数为 26,有效交易家数为 41(42 减去停牌 1 只),上涨占比约为 63.4%。这个结果与“上涨家数 26 除以总家数 42”得到的 61.9% 不同,差异就来自停牌股票是否计入分母。教学中必须明确采用哪一种口径,并在图表和报告中保持一致。

如果同一只股票在映射表中出现了两条有效记录,例如因行业分类调整导致旧记录未及时关闭,那么该股票可能被重复计数,上涨家数会虚增。排查方法是按“板块代码 + 股票代码 + 统计日”做唯一性检查,发现重复后回查纳入日期和剔除日期,关闭旧记录或补充剔除日期。另一个常见问题是股票代码变更或退市:退市股票如果未在映射表中设置剔除日期,仍会被计入总家数,导致上涨占比被低估。因此,映射表维护应和行情表更新同步进行,至少在每个交易日计算前做一次有效性校验。

建议把映射表版本号写入每日计算结果。这样当板块上涨家数出现异常时,可以快速定位是行情数据问题、映射表版本问题,还是统计口径变化问题。

五、可执行的最小检查清单

在正式计算前,按以下顺序检查,可以避免大多数口径错误:第一,确认统计层级唯一,不混用一级和二级;第二,确认同一板块口径下同一股票只有一条有效记录;第三,确认行情表覆盖映射表中的全部有效股票;第四,确认停牌、平盘、新股和退市股票的处理规则已明确;第五,确认上涨家数、下跌家数、平盘家数和停牌家数之和等于有效总家数。完成这五项检查后,板块上涨家数才具备可复现性和可比性,后续的市场宽度分析也才有可靠基础。