专题阶。前几篇用了不少"因子",这一篇回到最朴素的价值投资灵魂一问:怎么用财报,挑出"又便宜、又能赚"的公司?Greenblatt 的"魔法公式"把这件事压缩成两个排名。
一、这个方法解决什么投资问题
价值投资听起来很"艺术"——读财报、懂生意、等低估。但 Joel Greenblatt 在《股市稳赚》里把它量化成两个数字:
- 这家公司资本回报率高不高?(赚钱效率高不高)
- 买它贵不贵?(收益率高不高)
两个都好的公司,长期跑赢市场。问题是:怎么"同时"挑出两者都好的?答案是——分别排名、再加起来。
二、核心思想:两个排名拧成一个分
魔法公式只依赖两张表的数据:
| 指标 | 公式 | 越好= |
|---|---|---|
| 收益率 EY | EBIT ÷ 企业价值 | 越高(越便宜) |
| 资本回报率 ROC | EBIT ÷(净营运资本 + 净固定资产) | 越高(越能赚) |
做法是:
- 对所有股票,按EY 从高到低排名(第 1 名最便宜);
- 按ROC 从高到低排名(第 1 名最能赚);
- 两个排名相加= 魔法综合分;
- 选综合分最低的(最便宜 ∩ 最能赚)。
为什么相加而不是相乘?排名相加对极端值更稳健,且天然做了"跨指标中性"——不会因为某个指标量纲大就一家独大。
三、实操演示
合成示意财报(200 只,固定种子):算 EY/ROC,分别排名相加,挑综合分最低的前 5。
importnumpyasnp,pandasaspd rng=np.random.default_rng(46082026)N=200ebit=rng.uniform(5,80,N);ev=rng.uniform(40,600,N)nwc=rng.uniform(10,150,N);ppe=rng.uniform(20,200,N)df=pd.DataFrame({"EBIT":ebit,"EV":ev,"NWC":nwc,"PPE":ppe})df["EY"]=df["EBIT"]/df["EV"]df["ROC"]=df["EBIT"]/(df["NWC"]+df["PPE"])df["rank_EY"]=df["EY"].rank(ascending=False)df["rank_ROC"]=df["ROC"].rank(ascending=False)df["magic_score"]=df["rank_EY"]+df["rank_ROC"]# 越低越好print(df.sort_values("magic_score").head(5)[["EY","ROC","rank_EY","rank_ROC","magic_score"]].round(3))运行结果(合成示意,N=200,综合分最低的前 5):
| EY | ROC | rank_EY | rank_ROC | magic_score |
|---|---|---|---|---|
| 1.338 | 0.547 | 3 | 13 | 16 |
| 0.761 | 0.646 | 8 | 10 | 18 |
| 1.471 | 0.512 | 2 | 16 | 18 |
| 1.038 | 0.493 | 4 | 17 | 21 |
| 0.498 | 0.624 | 19 | 11 | 30 |
数据需求标注:EBIT/企业价值/净营运资本/固定资产/PE 等财报基本面属需求 R1,行情服务补全后即可用真实财务替换
synthetic段,魔法公式算法完全一致。本 demo 用合成数据演示方法。
四、结果解读
上榜的公司,EY 和 ROC两个排名都靠前(比如第 1 行 EY 排第 3、ROC 排第 13,综合 16)。这正是魔法公式的精髓:不要求单项第一,要求两项都好。
有趣的一点:魔法公式综合分和"单看 PE"的相关系数≈ −0.002(几乎为零)。说明魔法公式捕捉的是 PE 之外的"盈利能力"维度——它挑的不只是便宜,更是"便宜且真能赚"。纯看 PE 会漏掉那些"不便宜但极能赚"、或"便宜但平庸"的公司。
五、常见陷阱
- 财务质量陷阱:EBIT、企业价值都要用"干净"的财报;商誉、递延税、少数股东权益处理不当会扭曲 EY/ROC。
- 幸存者偏差:只测当前还在上市的公司,魔法公式的历史回测会因此虚高(#04)。
- 小市值失真:小公司 EY/ROC 容易因一笔大额资产波动而极端,需要市值过滤。
- 周期性行业:景气顶端 ROC 虚高、景气底部 EY 虚高,要在行业中性后看。
- 不择时持有:魔法公式讲究"长期持有整篮",频繁换手会被资本利得税和交易成本吃掉超额(#31)。
六、小结 + 下篇预告
基本面量化 ≠ 拍脑袋价值投资。魔法公式把"便宜 + 能赚"翻译成 EY、ROC 两个排名,相加成综合分,挑最低者——一个可复制、可回测的价值投资框架。
最后一篇 #47 讲AI 量化入门——用机器学习给因子打分,以及它的边界与风险(过拟合、未来函数、不可解释)。依赖因子特征工程(需求 R4),补全后即可实跑。
免责声明
本文为量化方法教学,代码示例使用合成示意数据,不构成投资建议,不承诺收益。投资有风险,入市需谨慎。