主题切换
2.2 资产定价基础
概念详解
资产定价的核心问题
资产定价理论试图回答金融学最根本的问题:一项资产到底值多少钱?对于量化交易者而言,定价模型不仅用于估值,更用于识别错误定价(mispricing)——即市场价格与理论价格之间的偏差,这恰恰是alpha的来源。
名词解释:DCF模型
折现现金流模型,通过预测未来现金流并以适当折现率折现来估算资产内在价值。
名词解释:风险溢价 (Risk Premium)
投资者承担额外风险所要求的额外收益补偿。无风险利率之上的所有收益在理论上都是某种风险溢价的体现。
名词解释:无套利定价 (No-Arbitrage Pricing)
在一个无套利的市场中,具有相同未来现金流的资产必须有相同的价格。衍生品的定价正是基于复制组合的无套利原则。
资产定价的两大流派
- 绝对定价法 (Absolute Pricing):基于资产自身的基本面特征(现金流、增长率、风险)估算其内在价值。DCF模型是其代表。公式为:
V_0 = \sum_{t=1}^{\infty} \frac{CF_t}{(1 + r)^t}
- 相对定价法 (Relative Pricing):不直接计算内在价值,而是通过"无套利"条件,利用相关资产的价格推导目标资产的价格。Black-Scholes期权定价公式和APT套利定价理论属于此类。
数学原理
CAPM:资本资产定价模型
CAPM是现代金融的基石,它将资产的预期收益与市场风险联系起来:
E[R_i] = R_f + \beta_i \cdot (E[R_m] - R_f)
其中
CAPM的含义非常深刻:在均衡市场中,只有系统性风险(不可分散的风险)能获得收益补偿。个股的特定风险可以通过分散化消除,因此不会获得额外收益。
多因子模型的演进
Fama-French三因子模型 (1993) 扩展了CAPM:
E[R_i] - R_f = \beta_i^{MKT} \cdot (R_m - R_f) + \beta_i^{SMB} \cdot SMB + \beta_i^{HML} \cdot HML
- SMB (Small Minus Big):小盘股减大盘股——规模因子
- HML (High Minus Low):高账面市值比减低账面市值比——价值因子
后续扩展包括:
- Carhart四因子 (1997):增加动量因子 MOM (Winners minus Losers)
- Fama-French五因子 (2015):增加盈利能力RMW和投资模式CMA
- 中国版三因子:考虑到中国市场特殊性(壳价值、散户主导),A股适用的因子往往需要本土化调整
Black-Scholes期权定价
Black-Scholes方程是金融数学的巅峰成就,推导基于无套利复制原理。对于欧式看涨期权:
C = S_0 \cdot N(d_1) - K \cdot e^{-rT} \cdot N(d_2)
其中:
d_1 = \frac{\ln(S_0/K) + (r + \sigma^2/2)T}{\sigma \sqrt{T}}, \quad d_2 = d_1 - \sigma \sqrt{T}
波动率微笑与模型局限性
BS模型假设波动率恒定,但现实中不同行权价的期权隐含波动率不同,形成"波动率微笑 (Volatility Smile)"曲线。这源于:
- 收益率分布的肥尾特性(极端事件比正态分布预测的更频繁)
- 杠杆效应(股价下跌导致杠杆上升,波动加大)
- 崩盘恐惧溢价(投资者为对冲尾部风险愿意支付更高权利金)
Python实战
案例1:Black-Scholes期权定价
此处有展示代码展开 ▼
python
from scipy.stats import norm
def black_scholes(S, K, T, r, sigma):
d1 = (np.log(S/K) + (r + sigma**2/2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
call = S * norm.cdf(d1) - K * np.exp(-r*T) * norm.cdf(d2)
return call
print(black_scholes(100, 105, 0.5, 0.03, 0.2))点击展开可浏览运行结果
看涨期权价格: $4.1783
案例2:FF三因子模型——因子暴露估计与Alpha检验
此处有展示代码展开 ▼
python
import numpy as np
import pandas as pd
import statsmodels.api as sm
from scipy import stats
def estimate_factor_exposure(returns, factors, risk_free=0.0):
"""
估计资产或策略对FF三因子的暴露,提取Alpha
returns: 资产/策略的日收益率序列(超额收益,已减去无风险利率)
factors: DataFrame, 至少包含 MKT, SMB, HML 三列
"""
# 对齐数据
data = pd.concat([returns, factors], axis=1).dropna()
y = data.iloc[:, 0] # 第一列为收益率
X = data.iloc[:, 1:] # 其余为因子
# 添加常数项(Alpha)
X = sm.add_constant(X)
# OLS回归
model = sm.OLS(y, X).fit()
# 提取结果
alpha = model.params['const']
alpha_t = model.tvalues['const']
alpha_p = model.pvalues['const']
print("=== 因子暴露分析 ===")
print(f"Alpha (年化): {alpha * 252:.2%}")
print(f"Alpha t值: {alpha_t:.3f}")
print(f"Alpha p值: {alpha_p:.4f}")
print(f"R-squared: {model.rsquared:.4f}")
print(f"\n因子暴露:")
for factor_name in factors.columns:
coef = model.params[factor_name]
pval = model.pvalues[factor_name]
significance = '***' if pval < 0.001 else ('**' if pval < 0.01 else ('*' if pval < 0.05 else ''))
print(f" {factor_name}: {coef:.4f} {significance} (p={pval:.4f})")
return model
def rolling_factor_analysis(returns, factors, window=252):
"""
滚动窗口分析因子暴露的时变性
"""
n = len(returns)
rolling_alpha = np.full(n, np.nan)
rolling_alpha_t = np.full(n, np.nan)
for t in range(window, n):
ret_window = returns.iloc[t-window:t]
fac_window = factors.iloc[t-window:t]
data = pd.concat([ret_window, fac_window], axis=1).dropna()
if len(data) < window * 0.8:
continue
y = data.iloc[:, 0]
X = sm.add_constant(data.iloc[:, 1:])
try:
model = sm.OLS(y, X).fit()
rolling_alpha[t] = model.params['const'] * 252 # 年化
rolling_alpha_t[t] = model.tvalues['const']
except:
continue
return rolling_alpha, rolling_alpha_t
# 使用示例
# factors_df = pd.DataFrame({
# 'Mkt-RF': market_returns - risk_free,
# 'SMB': smb_series,
# 'HML': hml_series
# })
# strategy_excess = strategy_returns - risk_free_rate
# model = estimate_factor_exposure(strategy_excess, factors_df)点击展开可浏览运行结果
📘 本段代码定义了 2 个函数/类:函数 `estimate_factor_exposure`(估计资产或策略对FF三因子的暴露,提取Alpha)、函数 `rolling_factor_analysis`(滚动窗口分析因子暴露的时变性)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
案例3:DCF估值模型的Python实现
此处有展示代码展开 ▼
python
import numpy as np
import pandas as pd
def dcf_valuation(free_cash_flows, growth_rate, terminal_growth, wacc,
projection_years=5, shares_outstanding=None):
"""
两阶段DCF估值模型
free_cash_flows: 历史自由现金流
growth_rate: 预测期增长率
terminal_growth: 永续增长率(通常2-3%)
wacc: 加权平均资本成本
projection_years: 预测期年数
shares_outstanding: 总股本(如果提供则计算每股价值)
"""
# 第一阶段:预测期现金流
recent_fcf = free_cash_flows[-1] # 最近一年的FCF
projected_fcfs = []
for t in range(1, projection_years + 1):
fcf = recent_fcf * (1 + growth_rate) ** t
projected_fcfs.append(fcf)
# 第二阶段:终值(Gordon Growth Model)
terminal_fcf = projected_fcfs[-1] * (1 + terminal_growth)
terminal_value = terminal_fcf / (wacc - terminal_growth)
# 折现回现值
present_values = []
for t, fcf in enumerate(projected_fcfs, 1):
pv = fcf / (1 + wacc) ** t
present_values.append(pv)
pv_terminal = terminal_value / (1 + wacc) ** projection_years
# 企业价值
enterprise_value = sum(present_values) + pv_terminal
# 每股价值
per_share_value = enterprise_value / shares_outstanding if shares_outstanding else None
# 各阶段价值占比
stage1_pct = sum(present_values) / enterprise_value * 100
stage2_pct = pv_terminal / enterprise_value * 100
print("=== DCF估值结果 ===")
print(f"预测期现金流现值: {sum(present_values):,.0f} ({stage1_pct:.1f}%)")
print(f"终值现值: {pv_terminal:,.0f} ({stage2_pct:.1f}%)")
print(f"企业价值: {enterprise_value:,.0f}")
if per_share_value:
print(f"每股价值: {per_share_value:.2f}")
return {
'enterprise_value': enterprise_value,
'per_share_value': per_share_value,
'projected_fcfs': projected_fcfs,
'terminal_value': terminal_value,
'stage1_pct': stage1_pct,
'stage2_pct': stage2_pct
}
# 使用示例
# fcf_history = [100, 108, 116, 125, 135] # 过去5年自由现金流(百万)
# val = dcf_valuation(
# free_cash_flows=fcf_history,
# growth_rate=0.12, # 预测期增长率12%
# terminal_growth=0.03, # 永续增长率3%
# wacc=0.10, # WACC 10%
# projection_years=5,
# shares_outstanding=50 # 5000万股
# )点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `dcf_valuation`(两阶段DCF估值模型)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
常见误区
误区一:CAPM的无条件成立
事实:CAPM的前提假设非常严格(无摩擦市场、同质预期、所有投资者持有市场组合等),现实中这些假设无一成立。学术研究发现,Beta对截面收益的解释力很弱——低Beta股票实际收益往往高于CAPM预测,高Beta股票实际收益低于CAPM预测("低Beta异象")。
误区二:Black-Scholes的波动率恒定假设
事实:波动率不仅随时间和行权价变化,还具有"聚集性"(大波动后往往继续大波动)和"均值回归"的特征。使用BS公式时需要了解其局限性,必要时采用Heston随机波动率模型或局部波动率模型。
误区三:DCF是客观的估值方法
事实:DCF的输出完全取决于输入假设(增长率、WACC、终值增长率)。终值往往占企业价值的60-80%,而终值对永续增长率和WACC的微小变化极度敏感。DCF不是消除主观判断的客观工具,而是将主观判断转化为数字表达的框架。
误区四:多因子模型中因子越多越好
事实:增加因子并非没有代价。每增加一个因子,就增加了过拟合风险和多重共线性问题。Fama-French从三因子扩展到五因子,解释力(调整后R方)的提升并不大。关键在于因子是否具有稳健的经济学逻辑,而非统计显著性。
实战练习
CAPM Beta估计:选取一只A股个股(如600519.SS 贵州茅台),用过去5年的月度收益率回归沪深300指数收益率,估计其Beta值。尝试用滚动60个月窗口观察Beta的时变特征:Beta在牛市中更高还是熊市中更高?
Black-Scholes敏感性分析:固定S=100, K=100, T=0.5, r=0.03,让σ从10%变化到60%,观察期权价格和每个希腊字母(Delta, Gamma, Vega, Theta)的变化,理解各参数的影响力。
DCF估值实战:选取一家你熟悉的上市公司,查找其过去3年的自由现金流,自行假设增长率和WACC,用DCF模型估算其合理股价,并与当前市场价格进行比较。讨论你的假设的合理性以及估值与市场价的差距可能源于何处。
延伸阅读
- 《Asset Pricing》—— John Cochrane,资产定价理论的权威教科书
- 《Options, Futures, and Other Derivatives》—— John Hull,衍生品定价的经典教材
- Fama, E. and French, K. (1993): "Common Risk Factors in the Returns on Stocks and Bonds"
- 《Expected Returns》—— Antti Ilmanen,预期收益的全景式综述
- 《Valuation》—— McKinsey & Company,DCF估值的实务圣经
本章要点
- 资产定价分为绝对定价(DCF)和相对定价(无套利)两大流派
- CAPM是最基础的因子模型,将收益分解为无风险利率加市场风险溢价
- Fama-French多因子模型系统性地解释了截面收益差异,但因子在A股市场需本土化调整
- Black-Scholes期权定价基于无套利复制原理,是金融数学的经典成就
- 所有定价模型都依赖于假设,理解假设的局限性比记住公式更重要