1. 课程导入与数据准备

在开始任何对比分析之前,我们需要先想清楚一件事:这门课要回答的核心问题不是“哪个板块涨得多”,而是“某个板块相对基准到底多赚了还是少赚了”。前者只需要一条涨跌幅数据,后者必须同时具备板块收益与基准收益两条序列,并在同一时间轴、同一口径下相减。因此,本节的目标是搭建一个可复用的数据底座:明确对比对象、选好数据源、统一字段口径、完成导入与初步校验,为后续的超额收益计算和可视化打好基础。

一、先定义清楚三个角色:板块、基准、区间

板块涨跌幅与超额收益对比,本质上是一个“相对强弱”问题。我们至少需要三类数据:板块指数(如申万一级行业指数、中证行业指数、概念板块指数)、基准指数(常用沪深300、中证800、中证全指,也可用万得全A),以及时间区间(起止交易日)。超额收益的常用定义是:

区间超额收益 = 板块区间涨跌幅 − 基准区间涨跌幅
单日超额收益 = 板块日涨跌幅 − 基准日涨跌幅

这里要先约定方向:本文所有“超额”均指板块减基准,正值代表跑赢,负值代表跑输。区间涨跌幅建议用复权后的收盘价计算,即 (期末收盘 / 期初前一日收盘 − 1) × 100%,避免把区间首日涨跌幅漏掉或重复计入。这个约定会在后续所有图表和计算中保持一致。

二、常用数据源与字段选择

实战中数据来源主要有三类:一是行情终端(Wind、Choice、同花顺iFinD),字段规范、覆盖全,适合教学与正式研究;二是交易所与指数公司官网(中证指数、国证指数),可免费下载指数历史行情;三是开源接口(如AKShare、Tushare),适合快速搭建练习环境。无论用哪种,导入后我们关心的核心字段基本一致:

字段含义示例用途
trade_date交易日期2024-03-01对齐时间轴
index_code指数代码801010.SI / 000300.SH区分板块与基准
index_name指数名称农林牧渔 / 沪深300可读性标识
close收盘点位3256.41计算区间收益
pct_chg日涨跌幅(%)1.27计算单日超额

需要特别提醒:不同数据源的pct_chg可能保留两位或四位小数,且部分接口的涨跌幅是“百分数数值”而非小数,导入后必须统一量纲,否则超额收益会出现100倍误差。建议在数据表中额外增加一列ret,统一存为小数形式(如1.27%存为0.0127),后续计算全部基于ret进行。

三、实战环境搭建与数据导入

下面给出一个可直接运行的最小环境示例,使用Python + pandas,数据以本地CSV模拟(示例数据为合理假设,非真实行情)。目录结构建议为data/raw存放原始文件、data/clean存放清洗结果、notebooks存放分析脚本。

import pandas as pd

# 读取板块与基准数据(示例:两个行业板块 + 沪深300)
sector = pd.read_csv("data/raw/sector_index.csv", parse_dates=["trade_date"])
bench  = pd.read_csv("data/raw/benchmark_index.csv", parse_dates=["trade_date"])

# 统一量纲:百分数转小数
for df in (sector, bench):
    df["ret"] = df["pct_chg"] / 100.0

# 合并为长表,便于按指数分组
all_df = pd.concat([sector, bench], ignore_index=True)
all_df = all_df.sort_values(["index_code", "trade_date"]).reset_index(drop=True)

# 透视成宽表:每列一个指数,行是交易日
wide = all_df.pivot(index="trade_date", columns="index_code", values="ret")
wide = wide.dropna(how="any")   # 只保留所有指数都有数据的交易日
print(wide.tail(3))

导入完成后不要急着算收益,先做三项校验:一是日期对齐,确认板块与基准的交易日完全一致,停牌或缺失日要明确剔除而不是简单填零;二是量纲检查,随机抽几天看ret是否落在合理区间(A股单日一般在±10%以内,指数更小);三是区间完整性,确认起止日期内没有大段缺口。下面的SVG把本节的数据准备流程与关键校验点串成一条数据流,便于对照操作。

板块与基准数据准备流程 目标:同一时间轴、同一量纲、可相减的两条收益序列 数据源 行业/板块指数 基准指数(沪深300等) 核心字段 日期 / 代码 / 收盘 / 涨跌幅 统一转为小数 ret 导入与合并 长表拼接 → 宽表透视 按交易日对齐 三项校验 日期对齐 / 量纲 / 区间完整 剔除缺失,不填零 超额收益计算(板块 − 基准) 单日超额 = 板块日收益 − 基准日收益 区间超额 = 板块区间涨跌幅 − 基准区间涨跌幅(复权收盘计算) 输出:超额收益序列 逐日 / 逐区间,正负可判 输出:对比宽表 板块列 + 基准列 + 超额列 输出:校验记录 缺失日、量纲、区间说明

四、一个可复用的数据准备清单

为了让每次分析都能复现,建议把本节的操作固化成一份简短清单,随数据一起保存:

  • 对比对象:板块指数代码与名称、基准指数代码与名称,各写清楚。
  • 时间区间:起止交易日,注明区间收益是否包含首日。
  • 量纲约定:ret统一为小数,展示时再乘100加百分号。
  • 缺失处理:记录被剔除的交易日及原因(停牌、接口缺失等)。
  • 数据版本:原始文件名、下载日期,便于回溯。
教学示例中常把区间设为“近一年”或“近60个交易日”。区间越短,单日噪声对超额收益的影响越大;区间越长,越能反映板块相对基准的中期强弱。建议同时保留日频序列和区间汇总两套结果,后续章节会分别用到。
常见错误:直接把板块涨跌幅和基准涨跌幅按“百分比数值”相减,却忘了两者小数位不同;或者用不复权收盘价计算区间收益,遇到分红除权时会把收益算错。导入后先做量纲与复权检查,比事后返工省事得多。

完成以上步骤后,你手里应该有一张按交易日对齐的宽表:每一行是一个交易日,列中包含至少一个板块收益列、一个基准收益列,以及由两者相减得到的超额收益列。这张表就是后续所有对比分析、排序、可视化和归因的起点。数据准备做得扎实,后面的结论才站得住。