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把本节的数据准备流程与关键校验点串成一条数据流,便于对照操作。
四、一个可复用的数据准备清单
为了让每次分析都能复现,建议把本节的操作固化成一份简短清单,随数据一起保存:
- 对比对象:板块指数代码与名称、基准指数代码与名称,各写清楚。
- 时间区间:起止交易日,注明区间收益是否包含首日。
- 量纲约定:
ret统一为小数,展示时再乘100加百分号。 - 缺失处理:记录被剔除的交易日及原因(停牌、接口缺失等)。
- 数据版本:原始文件名、下载日期,便于回溯。
完成以上步骤后,你手里应该有一张按交易日对齐的宽表:每一行是一个交易日,列中包含至少一个板块收益列、一个基准收益列,以及由两者相减得到的超额收益列。这张表就是后续所有对比分析、排序、可视化和归因的起点。数据准备做得扎实,后面的结论才站得住。