02

研究对象:股票 × 时间的面板

核心问题为什么机器学习选股通常比较“谁比谁好”,而不是预测大盘涨跌?

视频 约 9 分钟图解 12 张

第一单元 · 第 2 / 3 节010203

视频

学习目标

  1. 读懂面板:每行是一只股票在一个月末的状态,列是当时可知的信息,外加一列答案。
  2. 区分时间序列预测和截面预测,理解截面相对收益为什么更适合机器学习。
  3. 记住一条原则:面板里每一格都必须是当时就能知道的数字。课程面板已经处理了这件事,做法属于数据处理课程。

图解讲义

一行,是一只股票的一个月
01每行是一只股票在某个月月底的样子:300 只 × 192 个月,这就是面板数据。按月,因为大多数选股信号变得慢。
表里有哪些列
02列大致分三类:价格和交易、规模和估值、财务报表。能不能交易的那几列,回测时用来排除买不进的股票。
每个月,用当时的名单
03每个月用当时的成分股,不用今天的名单。拿今天的名单往回算,等于只挑了活下来的公司。
每一列,什么时候能知道
04每一列都要问:这个数什么时候能知道?每行左边的数,必须是那个月月底已经知道的。
同一个月,股票之间差多少
05同一个月里,股票之间的差别比市场整体的涨跌大得多。
十六年里,都是这样
06十六年里每个月都是这样:股票之间的差别,平均是市场涨跌幅度的两倍左右。
市场只占三分之一
07把所有涨跌放在一起,市场整体只解释约三分之一,剩下的是股票之间的差别。
相对收益
08相对收益 = 这只股票的收益 − 当月所有股票的平均收益。市场涨跌被减掉,留下股票之间的差别。
为什么不去猜大盘
09猜大盘,十六年只有 192 个答案;比较股票,有五万多个。样本多,才看得出很弱的规律。
把表和学习任务对上
10每一行是一个样本:左边当时已知的列是特征,最右边的相对收益是标签。
练习:让 AI 带你做
11练习:让 AI 生成同样形状的模拟数据,算相对收益,检查每个月加起来是否等于零。
这一节,记住三件事
12研究对象是一张面板;每行左边的数必须当时已知;我们猜的是相对收益,不是大盘。

交互演示合成数据

制作中

时间序列与截面:切换“预测大盘”与“比较个股”,看样本数量和相对收益

让 AI 带你做模拟数据

把下面的提示词整段复制给任意一个 AI 助手。它会先生成一份模拟的股票月度数据(设定对每一节都一样),再带你把这一节的分析做一遍。数据是模拟的,具体数字会和视频不同,但应该看到同样的规律。

任务(第 02 节):认识这张“股票 × 月份”的表。
1. 数一数:总行数、月份数、每个月的股票数。
2. 每个月算每只股票的相对收益 = ret_next − 当月 300 只的平均。检查:每个月的相对收益加起来是不是 0。
3. 挑一个月,画出 300 只股票 ret_next 的直方图,标出当月的平均。
4. 每个月算 300 只股票 ret_next 的标准差,取 192 个月的平均;再算等权基准每个月涨跌的绝对值,取平均。比一比这两个数。
提示词开头的模拟数据设定
请用 Python(numpy、pandas,需要时用 scikit-learn)带我做一个量化入门练习。先生成一份模拟的股票月度数据,随机种子用 42:

1. 300 只股票,192 个月(月份编号 0–191,相当于 16 年)。
2. 每只股票有一个固定的波动 sigma,从 0.05 到 0.13 均匀抽取;它的 beta = 0.5 + 5 × sigma。
3. 每个月有五个特征:mom(动量)、val(估值,越大越便宜)、size(规模)、lowvol(低波动)、prof(盈利)。
   - mom、val、size、prof:第 0 个月取标准正态;之后每个月,新值 = 0.9 × 上月值 + 0.44 × 标准正态。
   - lowvol = −sigma + 0.02 × 标准正态。
   - 每个月把五个特征各自在 300 只股票之间标准化(减平均、除以标准差)。
4. 每个月抽一个下个月的大盘收益 mkt_next ~ 正态(0.005, 0.05);再给五个特征各抽一个当月系数 = 基础系数 + 0.01 × 标准正态,基础系数依次是 0.004、0.003、0、0.005、0.002。
5. 下个月收益 ret_next = beta × mkt_next + Σ(当月系数 × 特征) + sigma × 标准正态。
6. 整理成一张长表:每行是一只股票的一个月,列为 month、stock、sigma、五个特征、mkt_next、ret_next。打印前几行和总行数。

后面统一的口径:
- IC:每个月,某一列和 ret_next 在 300 只股票之间的 Spearman 秩相关。
- 年化收益:把每月收益连乘,再按 12 / 月数 开方后减 1。
- 等权基准:每个月 300 只股票 ret_next 的平均。
- 第 m 个月这一行的特征在第 m 个月月底已知,标签 ret_next 是第 m+1 个月的收益。训练模型时,在第 s 个月月底打分,训练只用月份 ≤ s−2 的行(中间隔开一个月)。

接下来按我的要求一步一步做。每一步先用一两句话说明在做什么,再给代码和结果。

应该看到

  • 57,600 行、192 个月、每个月 300 只。
  • 每个月相对收益加起来都是 0。电脑上可能显示成 1e-15 这样极小的数,那是计算误差。
  • 同一个月里股票之间收益的标准差,平均大约 9%–10%;等权基准每个月涨跌的绝对值,平均大约 4%。股票之间的差别,比大盘的涨跌大得多。

对不上的时候,把你的结果和这几条一起发给 AI,让它解释是哪一步出了问题。

自测

  1. 同一个月里,300 只股票的相对收益加起来等于多少?

    • A. 当月的大盘收益
    • B. 0
    • C. 一定是正数
    • D. 不确定,每个月不一样
    看答案

    答案 B。相对收益是和当月平均比,有人跑赢平均,就一定有人跑输,加起来正好抵消。

  2. 这门课为什么比较“同一个月里谁更好”,而不是预测大盘涨跌?

    • A. 大盘没法买卖
    • B. 股票之间没有差别
    • C. 大盘的涨跌是固定的
    • D. 每个月有几百只股票可以比,样本多得多,股票之间的差别也比大盘的涨跌大
    看答案

    答案 D。预测大盘,一个月只有一个答案;比较股票,一个月就有几百个,规律更容易看清。

  3. 月底给股票打分时,下面哪个数不能用?

    • A. 过去 12 个月的涨幅
    • B. 月底的市值
    • C. 下个月才公布的季度财报
    • D. 过去一年的波动
    看答案

    答案 C。表里的每一格,都必须是打分那一刻已经能知道的数字。

常见坑

  • 把用到下月信息的列当特征
  • 以为五万多个样本彼此独立——同一个月的股票受同一场行情影响,有效样本远少于表面数字

下一节

个股之间差异很大,其中有多少是能预测的?

03微小优势,怎样积少成多单个信号只比瞎猜好一点点,这点优势怎样才能积少成多?