Skip to content

2.2 资产定价基础

概念详解

资产定价的核心问题

资产定价理论试图回答金融学最根本的问题:一项资产到底值多少钱?对于量化交易者而言,定价模型不仅用于估值,更用于识别错误定价(mispricing)——即市场价格与理论价格之间的偏差,这恰恰是alpha的来源。

名词解释:DCF模型

折现现金流模型,通过预测未来现金流并以适当折现率折现来估算资产内在价值。

名词解释:风险溢价 (Risk Premium)

投资者承担额外风险所要求的额外收益补偿。无风险利率之上的所有收益在理论上都是某种风险溢价的体现。

名词解释:无套利定价 (No-Arbitrage Pricing)

在一个无套利的市场中,具有相同未来现金流的资产必须有相同的价格。衍生品的定价正是基于复制组合的无套利原则。

资产定价的两大流派

  1. 绝对定价法 (Absolute Pricing):基于资产自身的基本面特征(现金流、增长率、风险)估算其内在价值。DCF模型是其代表。公式为:
V_0 = \sum_{t=1}^{\infty} \frac{CF_t}{(1 + r)^t}
  1. 相对定价法 (Relative Pricing):不直接计算内在价值,而是通过"无套利"条件,利用相关资产的价格推导目标资产的价格。Black-Scholes期权定价公式和APT套利定价理论属于此类。

数学原理

CAPM:资本资产定价模型

CAPM是现代金融的基石,它将资产的预期收益与市场风险联系起来:

E[R_i] = R_f + \beta_i \cdot (E[R_m] - R_f)

其中 βi=Cov(Ri,Rm)Var(Rm) 衡量了资产 i 对市场组合变动的敏感度。

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}

N() 是标准正态分布的累积分布函数。

波动率微笑与模型局限性

BS模型假设波动率恒定,但现实中不同行权价的期权隐含波动率不同,形成"波动率微笑 (Volatility Smile)"曲线。这源于:

  1. 收益率分布的肥尾特性(极端事件比正态分布预测的更频繁)
  2. 杠杆效应(股价下跌导致杠杆上升,波动加大)
  3. 崩盘恐惧溢价(投资者为对冲尾部风险愿意支付更高权利金)

Python实战

案例1:Black-Scholes期权定价

PYTHON7 行 · 288 B
📄此处有展示代码7 行 · 288 B展开 ▼
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检验

PYTHON78 行 · 2.4 KB
📄此处有展示代码78 行 · 2.4 KB展开 ▼
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实现

PYTHON72 行 · 2.4 KB
📄此处有展示代码72 行 · 2.4 KB展开 ▼
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方)的提升并不大。关键在于因子是否具有稳健的经济学逻辑,而非统计显著性。

实战练习

  1. CAPM Beta估计:选取一只A股个股(如600519.SS 贵州茅台),用过去5年的月度收益率回归沪深300指数收益率,估计其Beta值。尝试用滚动60个月窗口观察Beta的时变特征:Beta在牛市中更高还是熊市中更高?

  2. Black-Scholes敏感性分析:固定S=100, K=100, T=0.5, r=0.03,让σ从10%变化到60%,观察期权价格和每个希腊字母(Delta, Gamma, Vega, Theta)的变化,理解各参数的影响力。

  3. 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期权定价基于无套利复制原理,是金融数学的经典成就
  • 所有定价模型都依赖于假设,理解假设的局限性比记住公式更重要