【量化投资从入门到精通 #34】便宜、成长还是小盘?价值、成长、规模,风格因子的教科书三件套
本系列进度:#01–#33 ✅ #34 ✅ #35–#48 ⏳(其中 #36/#38–#43/#48 已先行发布,余 #35/#37/#44–#47 待数据补全后补齐) 进入因子体系第一阶。#33 把"好公司"翻译成了可排序的数;这一篇给你三把最经典、也最被机构验证过的"尺子"——价值、成长、规模。
一、这个方法解决什么投资问题
"买便宜的,还是买涨得快的,还是买小盘股?"——这三类偏好背后,是量化里最古老的三个风格因子(style factor):
- 价值(Value):偏爱"便宜"——低 PE、低 PB 的公司。
- 成长(Growth):偏爱"长得快"——营收、利润高速扩张的公司。
- 规模(Size):偏爱"小盘"——市值小、弹性大的公司。
它们被称为"教科书三件套",不是因为复杂,而是因为长期、跨市场、被无数论文重复验证过。你不需要押注某一个,但必须理解它们各自在赚什么钱、又会踩什么坑。这一篇就用可计算的数字,把这三把尺子造出来。
二、核心思想:把"偏好"翻译成横截面的数
和 #33 一样,因子是同一天、所有股票横截面上的排序,不是单只股票的时间序列。三件套的构造逻辑极简:
| 因子 | 想捕捉的偏好 | 用的数字 | 方向 |
|---|---|---|---|
| 价值 | 便宜 | PE、PB(越低越好) | 取负号 |
| 成长 | 扩张快 | 营收增速、利润增速 | 正 |
| 规模 | 小盘弹性 | 总市值(越小越好) | 取负号 |
关键两步:
- 标准化(z-score):PE 是 10 还是 1000 量纲不同,先减均值除标准差,让所有因子在同一把尺上。
- 方向对齐:把"越好越高"统一成"分数越高越好",方便后面相加合成。
铁律不变:打分只能用当下/历史数据,观察未来收益只能用 T 之后的数据,否则前视偏差(#04)会把噪声当成信号。
三、实操演示
下面用 Python 把三件套造出来并做分组检验。数据为合成示意(固定随机种子,可复现),仅用于演示流程;真实接入时把 synthetic 段换成麦蕊行情/财务接口即可。
import numpy as np, pandas as pd
rng = np.random.default_rng(20260817)
N = 300
pe = np.exp(rng.normal(3.2, 0.6, N)) # 市盈率(示意)
pb = np.exp(rng.normal(0.6, 0.5, N)) # 市净率(示意)
rev_g = rng.normal(0.12, 0.18, N) # 营收同比(示意)
eps_g = rng.normal(0.10, 0.22, N) # 利润同比(示意)
mcap = np.exp(rng.normal(23.0, 1.1, N)) # 总市值(亿元)(示意)
def z(x): return (x - np.nanmean(x)) / (np.nanstd(x) + 1e-9)
value = -z(np.log(pe)) - z(np.log(pb)) # 低 PE/PB 得分高
growth = z(rev_g) + z(eps_g) # 增速高得分高
size = -z(np.log(mcap)) # 小市值得分高
# 合成"未来收益":与三因子正相关 + 噪声(仅演示分组流程)
future = 0.30*value + 0.20*growth + 0.12*size + rng.normal(0, 0.6, N)
# 分组检验:按单因子 5 等分,看最高组 vs 最低组
def spread(s, r, q=5):
lab = pd.qcut(s, q, labels=False, duplicates="drop")
return r[lab==q-1].mean(), r[lab==0].mean()
for name, s in [("value",value),("growth",growth),("size",size)]:
t, b = spread(s, future)
print(f"{name:7s} 高组={t:+.3f} 低组={b:+.3f} 价差={t-b:+.3f}")
运行结果(合成示意数据,N=300):
| 因子 | 高分组未来收益 | 低分组 | 多空价差 |
|---|---|---|---|
| value | +0.738 | −0.598 | +1.336 |
| growth | +0.413 | −0.415 | +0.828 |
| size | +0.356 | −0.121 | +0.476 |
把三件套等权合成一个数后再分组:
| 合成因子 | 高分组 | 低分组 | 价差 |
|---|---|---|---|
| composite | +0.797 | −0.752 | +1.550 |
数据需求标注:价值/成长依赖财报基本面(PE/PB/增速),规模可用麦蕊实时快照提供的「总市值」字段(zsz/lt)直接计算,无需新数据。财报类数据麦蕊暂未覆盖的部分,已作为需求 R1 提交数据团队补全;补全后即可用真实财务替换上述
synthetic段,方法完全一致。
四、结果解读
三件套各自的多空价差都为正,说明"在这个示意样本里,便宜/成长快/小盘"相对"贵/慢/大盘"都有正溢价——这正是三件套被写进教科书的原因。
更关键的是最后一行:等权合成后的价差(+1.550)大于任一单因子。这是因子投资的日常:单因子容易受某一阶段风格拖累,多因子组合能互相熨平,这也是 #37 要展开讲的主题。
但务必泼冷水:上面所有数字都是合成示意,只用来演示"打分→分组→看未来→算价差"的标准动作。真实市场里:
- 价值因子在成长股牛市(如 2020)会长期跑输;
- 小盘因子在流动性收紧时会剧烈回撤;
- 成长因子对"增速不及预期"极其敏感。
因子有效,但有效性是轮动的、有条件的。
五、常见陷阱
- 把某一阶段的方向当永恒:价值/成长/规模会周期性轮动,没有永远赢的风格。
- 忽略标准化:PE 和营收增速量纲差上万倍,不 z-score 直接相加,大数会淹没小数。
- 前视偏差:算 PE 用的是 T 时刻的价和 T 时刻的财报,但财报是 T 之前发布的——必须对齐"财报发布日",不能用未来财报。
- 小样本幻觉:N=300 都未必稳,实盘至少几百只、滚动几十期截面才有统计意义。
- 规模因子的流动性黑洞:小盘流动性差,回测赚的价差,实盘可能变不成成交价(#32 讲过实盘与回测的鸿沟)。
六、小结 + 下篇预告
风格因子三件套 = 把"便宜/成长快/小盘"三种偏好翻译成横截面可排序的数,经 z-score 标准化、方向对齐后,既能单因子检验,也能等权合成。合成因子往往比单因子更稳。
下一篇 #35 讲质量与动量——机构也在用的另外两套套路(高 ROE/低杠杆的质量因子,以及用历史 K 线就能算的价格动量),其中动量因子不依赖财报,可以马上用麦蕊历史 K 线实跑。
七、合规收尾
本文为量化方法教学,代码示例使用合成示意数据,不构成投资建议,不承诺收益。投资有风险,入市需谨慎。
想亲手跑通上面的因子流水?麦蕊智数提供稳定的实时快照与历史 K 线(规模因子可直接取「总市值」,动量因子可直接取历史 K),免费版即可起步,证书即取即用。配套 Demo(含 main.py + RUN.md)见 麦蕊智数 www.mairuiapi.com 站内「API 文档」与「证书获取」(免费版 500 次/日,邮箱验证即领)。



