基于 James P. O'Shaughnessy,What Works on Wall Street(第4版,2011)
迄今为止最全面的股票市场因子量化研究。O'Shaughnessy 对数十种单因子和多因子策略在50+年数据(1926-2009)上进行了回测,识别哪些因子实际预测股票回报,哪些只是市场神话。
O'Shaughnessy 的核心发现:简单的、量化的、基于因子的策略在长期持续战胜市场和专业基金经理。 大多数投资者失败的原因不是缺乏信息而是缺乏纪律——他们无法在策略不可避免的表现不佳期间坚持下去。
"本书的中心信息很简单:在长期中,基于已知、公开和测试过的股票表现进行投资决策的策略,战胜那些依赖希望、故事和主观评估的策略。"
O'Shaughnessy 针对几个宇宙进行测试:
| 宇宙 | 定义 | 近似大小 |
|---|---|---|
| 所有股票 | 市值 > $200M(通胀调整) | ~2,500只股票 |
| 大盘股 | 市值 > 平均市值(按市值排名的前约16%) | ~500只股票 |
| 小盘股 | 市值在$200M和平均市值之间 | ~2,000只股票 |
| 市场领导者 | 市值 > $1B、盈利 > 平均、财务强劲 | ~350只股票 |
O'Shaughnessy 最重要的发现:P/S是预测未来股票回报的单一最佳价值因子。
按P/S十分位表现(所有股票宇宙,1964-2009):
最便宜P/S的十分位1: ~18% CAGR
最贵P/S的十分位10: ~4% CAGR
利差:~14% 每年
为什么P/S最有效:
实施规则:买P/S在最低十分位(最低10%)的股票。避免P/S在最高十分位的股票。
最著名的价值因子。结果:
低市盈率十分位:~16% CAGR
高市盈率十分位:~8% CAGR
利差:~8% 每年
局限性:
低市净率十分位:~15% CAGR
高市净率十分位:~9% CAGR
利差:~6% 每年
局限性:
低市现率十分位:~17% CAGR
高市现率十分位:~6% CAGR
利差:~11% 每年
低EV/EBITDA十分位:~17.5% CAGR
高EV/EBITDA十分位:~5% CAGR
利差:~12.5% 每年
| 排名 | 因子 | 近似利差 | 可靠性 |
|---|---|---|---|
| 1 | P/S | 14% | 非常高 |
| 2 | EV/EBITDA | 12.5% | 非常高 |
| 3 | P/CF | 11% | 高 |
| 4 | P/E | 8% | 高 |
| 5 | P/B | 6% | 中等 |
O'Shaughnessy 关于成长的关键发现:过去盈利增长不预测未来股票回报。
按5年EPS增长前十分位:~11% CAGR(跑输市场)
按5年EPS增长后十分位:~14% CAGR(跑赢市场)
这是书中最违反直觉的发现之一。
继价值之后,动量是第二强大的股票市场因子。O'Shaughnessy 将其衡量为6个月或12个月相对价格强度——一只股票的价格表现在相对于所有其他股票中的排名。
按6个月相对强度前十分位:~16% CAGR
按6个月相对强度后十分位:~7% CAGR
利差:~9% 每年
这是O'Shaughnessy 关于因子组合的最重要发现:
强动量 弱动量
便宜(价值) 最佳(~20%+) 价值陷阱(~12%)
昂贵(成长) 风险(~14%) 最差(~4%)
FUNCTION relative_strength_rank(stock, universe, lookback=6_months):
all_returns = [s.price_return(lookback) FOR s IN universe]
stock_return = stock.price_return(lookback)
percentile = rank(stock_return, all_returns) / len(all_returns)
RETURN percentile # 1.0 = 最佳表现者,0.0 = 最差
规则:只买相对强度百分位 > 0.70(前30%)的股票。
传统股息收益率筛选遗漏了一种关键资本回报形式:股票回购。O'Shaughnessy 定义股东收益率为:
股东收益率 = 股息收益率 + 回购收益率
其中:
回购收益率 = (去年流通股数 - 当前流通股数) / 去年流通股数
按股东收益率前十分位:~17% CAGR
后十分位(稀释者):~6% CAGR
利差:~11% 每年
小盘股(所有股票宇宙):~13.5% CAGR,20%标准差
大盘股:~11.2% CAGR,16%标准差
基石价值策略是O'Shaughnessy 的标志性价值策略。它从大盘股宇宙中选择股票,使用简单、清晰的标准:
宇宙:大盘股(市值 > 市值平均)
过滤器:
1. 市值 > 数据库平均(大股过滤器)
2. 流通股数 > 平均
3. 每股现金流 > 平均
4. 销售额 > 1.5倍平均
5. 股息收益率 > 平均
从符合条件的股票中,选择按股东收益率最高的前50只
重新平衡:每年
基石价值CAGR(1964-2009):~15.2%
大盘股基准CAGR:~11.2%
标普500 CAGR:~10.5%
夏普比率:~0.62(vs 标普500的0.40)
最大回撤:~-38%(vs 标普500的-45%)
基石成长策略是O'Shaughnessy 的标志性成长策略。它从所有股票宇宙中选择股票,使用成长 AND 价值标准:
宇宙:所有股票(市值 > $200M通胀调整)
过滤器:
1. 市值 > $200M
2. 每股收益持续增长(EPS高于前一年多年)
3. 市销率 < 1.5
从符合条件的股票中,选择按6个月相对强度最高的前50只
重新平衡:每年
基石成长CAGR(1964-2009):~16.8%
所有股票基准CAGR:~13.5%
夏普比率:~0.55
最大回撤:~-42%
O'Shaughnessy 最重要的实践发现:组合多个因子产生比任何单一因子更好的风险调整回报。
单一因子回报不错。双因子回报更好。三因子或多因子接近最优前沿。
最佳双因子组合(来自所有股票宇宙):
| 组合 | 近似CAGR | 夏普 |
|---|---|---|
| 低P/S + 高相对强度 | ~19% | 0.68 |
| 低EV/EBITDA + 高相对强度 | ~18.5% | 0.65 |
| 高股东收益率 + 高相对强度 | ~18% | 0.63 |
| 低P/CF + 高相对强度 | ~17.5% | 0.60 |
模式清晰:价值 + 动量是 winning 组合。
O'Shaughnessy 推荐使用价值复合在多个因子间平均排名:
FUNCTION value_composite_rank(stock, universe):
ps_rank = percentile_rank(stock.p_s, universe, ascending=True) # 越低 = 越便宜
pe_rank = percentile_rank(stock.p_e, universe, ascending=True)
pcf_rank = percentile_rank(stock.p_cf, universe, ascending=True)
ev_ebitda_rank = percentile_rank(stock.ev_ebitda, universe, ascending=True)
pb_rank = percentile_rank(stock.p_b, universe, ascending=True)
sy_rank = percentile_rank(stock.shareholder_yield, universe, ascending=False) # 越高 = 越好
composite = AVERAGE(ps_rank, pe_rank, pcf_rank, ev_ebitda_rank, pb_rank, sy_rank)
RETURN composite
复合价值排名产生比任何单一价值指标更一致的结果,因为它在个体指标弱点间多元化。
FUNCTION three_factor_score(stock, universe):
value_score = value_composite_rank(stock, universe) # 越低 = 越便宜
momentum_score = relative_strength_rank(stock, universe) # 越高 = 越强
quality_score = shareholder_yield_rank(stock, universe) # 越高 = 越好
# 组合(将每个归一化到0-100范围)
combined = (100 - value_score) + momentum_score + quality_score
RETURN combined
联合基石策略将基石价值和基石成长组合成单一投资组合:
投资组合 = 50% 基石价值 + 50% 基石成长
重新平衡:每年
联合基石CAGR(1964-2009):~16.0%
夏普比率:~0.64
最大回撤:~-35%
一种替代方法:在其板块内而非跨市场对股票进行价值排名。
FUNCTION sector_relative_value(stock, sector_peers):
# 在其自己的板块内排名股票的P/S
sector_ps_rank = percentile_rank(stock.p_s, sector_peers, ascending=True)
RETURN sector_ps_rank
这防止投资组合成为对一两个板块的赌注。
| 策略 | 最大回撤 | 恢复时间 |
|---|---|---|
| 标普500 | -45% | ~5年 |
| 所有股票(价值) | -50% | ~4年 |
| 大盘股(价值) | -38% | ~3年 |
| 基石价值 | -38% | ~3年 |
| 基石成长 | -42% | ~3.5年 |
| 联合基石 | -35% | ~3年 |
基础率 = 策略战胜基准的滚动N年期的百分比。
策略 1年 3年 5年 10年
基石价值 62% 72% 82% 91%
基石成长 64% 74% 85% 93%
联合基石 66% 78% 88% 96%
持有期越长,表现优异越确定。这就是为什么耐心和纪律至关重要。
"投资者犯的最大错误是不理解在长期有效的策略在短期确实会有糟糕的回报。"
O'Shaughnessy 测试了许多流行策略,发现它们没有可靠优势:
"投资中最大的神话是你应该买伟大的公司。数据清楚地表明,以伟大价格买好公司远远优于以好价格买伟大公司。"
FUNCTION cornerstone_value(all_stocks, date):
# Step 1: Define Large Stocks universe
avg_market_cap = AVERAGE([s.market_cap FOR s IN all_stocks])
large_stocks = [s FOR s IN all_stocks IF s.market_cap > avg_market_cap]
# Step 2: Apply filters
avg_shares = AVERAGE([s.shares_outstanding FOR s IN large_stocks])
avg_cashflow = AVERAGE([s.cashflow_per_share FOR s IN large_stocks])
avg_sales = AVERAGE([s.total_sales FOR s IN large_stocks])
avg_div_yield = AVERAGE([s.dividend_yield FOR s IN large_stocks])
candidates = []
FOR each stock IN large_stocks:
IF stock.shares_outstanding > avg_shares \
AND stock.cashflow_per_share > avg_cashflow \
AND stock.total_sales > 1.5 * avg_sales \
AND stock.dividend_yield > avg_div_yield:
candidates.APPEND(stock)
# Step 3: Rank by shareholder yield (highest first)
candidates.SORT(key=shareholder_yield, descending=True)
# Step 4: Select top 50
RETURN candidates[:50]
FUNCTION cornerstone_growth(all_stocks, date):
# Step 1: Market cap filter
candidates = [s FOR s IN all_stocks IF s.market_cap > 200_million_adjusted]
# Step 2: Earnings persistence filter
candidates = [s FOR s IN candidates
IF s.eps_year_0 > s.eps_year_1
AND s.eps_year_1 > s.eps_year_2]
# Step 3: Valuation filter
candidates = [s FOR s IN candidates IF s.price_to_sales < 1.5]
# Step 4: Rank by 6-month relative strength (highest first)
FOR each stock IN candidates:
stock.rs_6m = stock.price_return(months=6)
candidates.SORT(key=rs_6m, descending=True)
# Step 5: Select top 50
RETURN candidates[:50]
FUNCTION united_cornerstone(all_stocks, date, capital):
cv_picks = cornerstone_value(all_stocks, date)
cg_picks = cornerstone_growth(all_stocks, date)
# Allocate 50% to each
cv_capital = capital * 0.5
cg_capital = capital * 0.5
# Equal weight within each sub-portfolio
cv_weight = cv_capital / len(cv_picks) # per stock
cg_weight = cg_capital / len(cg_picks) # per stock
portfolio = {}
FOR stock IN cv_picks:
portfolio[stock] = cv_weight
FOR stock IN cg_picks:
IF stock IN portfolio:
portfolio[stock] += cg_weight # Can overlap
ELSE:
portfolio[stock] = cg_weight
RETURN portfolio
# Annual rebalancing
FUNCTION annual_rebalance(portfolio, all_stocks, date, capital):
new_portfolio = united_cornerstone(all_stocks, date, capital)
# Sell positions not in new portfolio
# Buy new positions
# Adjust existing positions to target weights
RETURN new_portfolio
FUNCTION multi_factor_screen(all_stocks, date):
# Step 1: Universe filter
universe = [s FOR s IN all_stocks IF s.market_cap > 200_million_adjusted]
# Step 2: Compute value composite for each stock
FOR each stock IN universe:
stock.value_rank = value_composite_rank(stock, universe)
# Step 3: Compute momentum
FOR each stock IN universe:
stock.momentum_rank = relative_strength_rank(stock, universe, lookback=6)
# Step 4: Compute shareholder yield rank
FOR each stock IN universe:
stock.sy_rank = percentile_rank(stock.shareholder_yield, universe)
# Step 5: Combined score (equal weight each factor)
FOR each stock IN universe:
stock.combined = (
(1 - stock.value_rank) * 0.40 + # 40% weight to value
stock.momentum_rank * 0.35 + # 35% weight to momentum
stock.sy_rank * 0.25 # 25% weight to shareholder yield
)
# Step 6: Select top 25
universe.SORT(key=combined, descending=True)
RETURN universe[:25]
P/S是价值因子之王。 如果只使用一个估值指标,使用市销率。它是所有时期和市场环境中最可靠的未来回报预测因子。
价值 + 动量是最佳组合。 便宜股票配强相对价格强度产生最佳风险调整回报。任一因子 alone 不如组合强大。
过去盈利增长不预测未来回报。 投资者系统性地为过去增长过度支付。买中等、持续成长且价格便宜而不是。
股东收益率战胜股息收益率。 在收益率计算中包括回购。减少股份数的公司在创造价值;稀释的在摧毁价值。
复合因子战胜单因子。 将多个价值指标(P/S、P/E、P/CF、EV/EBITDA、P/B、股东收益率)平均为复合排名以获得更一致的结果。
联合基石策略是实践答案。 50% 基石价值 + 50% 基石成长,每年重新平衡。简单、有效且稳健。
纪律是真正的优势。 每个策略都有多年表现不佳的时期。在糟糕时期坚持已证明的量化策略的投资者将战胜追逐去年赢家的投资者。
避免高P/S比率股票。 交易高于10倍销售额的股票在整个数据中是最差的投资之一。这是单一最强负面信号。
基础率比个体结果更重要。 在滚动5年期中赢得85%的策略是出色的。你不需要每年都赢——你需要赢得大多数多年期。
简单性获胜。 书中最简单的策略也是最好的。复杂性不增加回报——它增加脆弱性和错误机会。
"指数化有效,因为大多数投资者无法让自己系统地遵循任何策略,无论其过去表现有多好。投资的情绪是投资者最大的敌人。"