转自 数据派THU

在实践中运行 MCMC 采样算法

资本资产定价模型(CAPM)是一种金融模型,有助于根据与整体市场相比的风险水平预测投资的预期收益。CAPM 回归是一种统计技术,用于计算 CAPM 公式中的变量值。这一过程有助于投资者理解资产的预期回报与其相对于大市场的风险之间的相关性。

CAPM 公式表示为:

打开网易新闻 查看精彩图片

其中

  • 是投资的预期收益

  • 是无风险收益率(没有财务损失风险的投资收益)

  • 是投资的贝塔系数(衡量投资收益相对于市场收益的预期变动程度)

  • 是市场的预期收益

  • 被称为市场溢价(高于无风险利率的市场预期超额收益)。

在进行 CAPM 回归分析时,预测或解释的变量是资产的超额收益,计算方法是资产收益减去无风险收益率。用于解释这一超额收益的自变量是整个市场的超额收益,计算方法是从市场收益中减去无风险利率。从回归线估算出的斜率系数( )可以量化资产收益对市场收益变化的敏感程度。 值越高,表明该资产相对于整个市场的风险越高,但同时也表明该资产可能会提供更高的回报来补偿较高的风险。

贝叶斯广义线性模型 (GLM)

一般来说,线性回归的频率派使用方法如下:

目标是利用输入或自变量( )预测输出或因变量( )。模型包括需要估计的系数或参数 ( )。此外,还有一个误差项 ( ),并假定其服从正态分布。

采用普通最小二乘法(OLS)或最大似然估计等技术,可以找到最适合数据的系数( )的最佳值。

贝叶斯学派从概率角度看待世界,并使用概率分布来表达模型。线性回归模型可在此概率框架内重新表述:

从本质上讲, 被视为一个随机变量(或向量),其中数据都服从正态分布。该正态分布的均值由线性预测因子决定,方差为 。

虽然模型表述基本相同,但贝叶斯估计法有两个关键优势:

  1. 纳入先验知识:贝叶斯学家可以通过对参数设置先验来量化任何先验知识或信念。例如,如果我们认为 很可能很小,我们就可以选择一个先验分布,其中为较小的值赋予更高的概率。

  2. 不确定性量化:贝叶斯方法提供的是完整的后验分布,而不是对 β 的单一估计,它捕捉了不同值 的不同可信度,如果具体实际数据有限, 的不确定性会很高,导致后验分布很宽。

这种概率观点允许贝叶斯学家利用先验信息,全面了解与参数估计相关的不确定性。

为此,在贝叶斯 CAPM 框架中,我们将参数 和可能的 (如果不知道)视为具有先验分布的随机变量。然后,我们的目标是根据观察到的数据更新这些参数的分布,从而得出后验分布。

使用 PyMC 的示例

PyMC3 是一个专为贝叶斯统计建模而设计的 Python 库。它的核心优势在于马尔可夫链蒙特卡罗(MCMC)和变异推理(VI)算法等先进技术。PyMC3 的通用性和功能扩展能力使其成为解决各种需要贝叶斯建模和推理问题的重要工具。

在贝叶斯设置中,我们将资产超额收益建模为市场超额收益的线性函数,并通过参数的概率分布(先验)将不确定性纳入我们的估计中。使用线性回归的 CAPM 的贝叶斯公式数学描述如下:

模型方程:

资产收益 = 截距 + 斜率 × 市场超额收益 + ϵ

其中:

  • 在 CAPM 中,截距通常设为 0,因为截距代表的是与市场回报无关的资产预期回报,在对无风险利率进行调整后,市场回报通常被认为是零。

  • 斜率与传统 CAPM 公式中的 相对应,表示市场收益率发生单位变化时,资产收益率的变化程度。

  • ϵ 代表误差项或残差,表示观察到的回报与模型预测的回报之间的偏差。


先验:

  • "参数(误差项的标准差)的先验值为半考奇先验值(Half-Cauchy Prior),这是贝叶斯模型中方差参数的常见选择,因为它的尾部较重,允许有较大范围的可能值。

  • 截距的先验值是以 0 为中心的正态先验值,标准差较大(本例中为 20),表达了对其值的不确定性,但也认识到在对无风险利率进行调整后,其值可能较小或为零。

  • 斜率(或 )也是以 0 为中心的正态先验值,具有较大的标准差,反映了其不确定性,但允许数据告知其可能的值。


可能性:

  • 似然函数说明我们认为数据是如何产生的。在这种情况下,资产超额收益被模拟为围绕均值的正态分布,而均值是市场超额收益的线性函数,“sigma”描述了围绕该均值的资产收益的变异性。


推断:

  • 该模型使用观察到的数据(市场超额收益和资产超额收益)来更新我们对参数(截距、斜率和 sigma)的信念。马尔可夫链蒙特卡罗(MCMC)等采样方法用于近似这些参数的后验分布。

现在我们可以生成一些 CAPM 数据:

import pymc3 as pm
import arviz as az
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.random.seed(42) # 随机种子
size = 200
R_f = 0.02 # 无风险收益率
E_R_m = 0.1 # 市场的预期收益
beta = 1.5 # 投资的贝塔系数
sigma = 0.05 # 残差

# 生成市场收益 正态分布
E_R_m_samples = np.random.normal(E_R_m, sigma, size)

# 计算投资收益 CAPM
epsilon = np.random.normal(0, sigma, size) # Noise
E_R_i_samples = R_f + beta * (E_R_m_samples - R_f) + epsilon # Asset returns

# 生成贝叶斯回归数据
market_excess_return = E_R_m_samples - R_f # 独立变量 (x)
asset_excess_return = E_R_i_samples - R_f # (y)

data_capm = pd.DataFrame(dict(market_excess_return=market_excess_return, asset_excess_return=asset_excess_return))

# Plot
plt.figure(figsize=(7, 7))
plt.scatter(data_capm['market_excess_return'], data_capm['asset_excess_return'], label='Sampled Data')
plt.xlabel('Market Excess Return')
plt.ylabel('Asset Excess Return')
plt.title('Generated CAPM Data')
plt.legend()
plt.show()

可视化为:

要使用 PyMC3 对给定数据集拟合贝叶斯线性回归模型,可以在称为上下文管理器的 with 表达式中定义模型规范。默认情况下,PyMC 采用 NUTS(No-U-Turn Sampler)算法来执行模型拟合过程。这一过程的结果是一个轨迹,它是代表潜在模型参数边际后验分布的样本集合。

with pm.Model() as model_capm: # 定义先验分布
sigma = pm.HalfCauchy('sigma', beta=10)
intercept = pm.Normal('Intercept', 0, sigma=20)
slope = pm.Normal('slope', 0, sigma=20)

# 定义似然函数
likelihood = pm.Normal('asset_excess_return', mu=intercept + slope * market_excess_return, sigma=sigma, observed=asset_excess_return)

# 推断
trace_capm = pm.sample(3000, return_inferencedata=True)
# trace
az.plot_trace(trace_capm, figsize=(10, 7))
plt.show()

打开网易新闻 查看精彩图片

1_y7iDvKAuyKy77FOsonmhPA.jpg

解释一下,在likelihood = pm.Normal(‘asset_excess_return’, mu=intercept + slope * market_excess_return, sigma=sigma, observed=asset_excess_return中,似然函数被指定为正态分布,其中均值( )是市场收益的线性函数。这就将观测到的资产超额收益纳入模型,使贝叶斯推理过程能够根据数据更新我们对模型参数的信念。

此外,trace_capm = pm.sample(3000, return_inferencedata=True指示 PyMC 使用马尔科夫链蒙特卡罗 (MCMC) 方法从模型参数的后验分布中采样。它会执行 3000 次采样迭代,生成每个参数的采样值轨迹。return_inferencedata=True参数指定输出应采用与 ArviZ 兼容的格式,ArviZ 是一个用于贝叶斯模型探索性分析的库。

贝叶斯推理方法不像最大似然估计法那样只提供一条最佳拟合线。相反,它产生了一个完整的可信参数后验分布。该分布囊括了与不同参数值相关的不同似然度。

图的左侧显示边际后验分布。 轴上是参数值的范围, 轴上是相应的概率,表示在观测数据的基础上,每个参数值的可能性有多大。

值得注意的是,每个变量的最大后验估计值(由边际后验分布中的峰值表示)都非常接近用于生成数据的真实参数值。在本例中,斜率是回归系数, 是标准偏差。

在广义线性模型(GLM)中,贝叶斯方法不会产生单一的最佳拟合回归线。相反,它会产生许多可信的回归线。后验预测图通过从后验分布中提取多个样本(代表不同的截距和斜率值),并为每个取样的参数集绘制单独的回归线,从而直观地反映了这一点。这组回归线反映了数据和先验信念所支持的可信模型的范围。

要手动生成这些回归线,可以直接利用截距和斜率等模型参数的后验样本,并根据这些采样值构建相应的回归线:

posterior_intercept = trace_capm.posterior["Intercept"].values.flatten()
posterior_slope = trace_capm.posterior["slope"].values.flatten()

# x
x_plot = np.linspace(market_excess_return.min(), market_excess_return.max(), 100)

# regression lines
plt.figure(figsize=(7, 7))
for i in range(100): # 100 个点
y_plot = posterior_intercept[i] + posterior_slope[i] * x_plot
plt.plot(x_plot, y_plot, 'c-', alpha=0.2)

# Plot data
plt.scatter(market_excess_return, asset_excess_return, alpha=0.5)
plt.xlabel('Market Excess Return')
plt.ylabel('Asset Excess Return')
plt.title('Posterior Predictive Regression Lines with Observed Data')
plt.show()

我们可以看到,贝叶斯推理框架提供了对参数空间的全面理解,提供了对不同参数值可信度的细微观察,而不是单一的点估计。

强烈推荐一个关于贝叶斯入门的书,打开了我对贝叶斯认知的大门,里面含有实例和具体代码实现。欢迎来到贝叶斯的世界。

编辑:王菁

【免责声明】转载出于非商业性的教育和科研目的,只为学术新闻信息的传播,版权归原作者所有,如有侵权请立即与我们联系,我们将及时删除。