贝叶斯回归入门:轻松掌握概率思维的强大工具
数据派THU
共 10352字,需浏览 21分钟
·
2024-10-27 17:00
来源:数据分析学习与实践
本文约3500字,建议阅读9分钟
本文深入探讨Transformer模型中三种关键的注意力机制:自注意力、交叉注意力和因果自注意力。
在实践中运行 MCMC 采样算法
-
是投资的预期收益 -
是无风险收益率(没有财务损失风险的投资收益) -
是投资的贝塔系数(衡量投资收益相对于市场收益的预期变动程度) -
是市场的预期收益 -
被称为市场溢价(高于无风险利率的市场预期超额收益)。
贝叶斯广义线性模型 (GLM)
-
纳入先验知识:贝叶斯学家可以通过对参数设置先验来量化任何先验知识或信念。例如,如果我们认为 很可能很小,我们就可以选择一个先验分布,其中为较小的值赋予更高的概率。 -
不确定性量化:贝叶斯方法提供的是完整的后验分布,而不是对 β 的单一估计,它捕捉了不同值 的不同可信度,如果具体实际数据有限, 的不确定性会很高,导致后验分布很宽。
使用 PyMC 的示例
模型方程:
资产收益 = 截距 + 斜率 × 市场超额收益 + ϵ
-
在 CAPM 中,截距通常设为 0,因为截距代表的是与市场回报无关的资产预期回报,在对无风险利率进行调整后,市场回报通常被认为是零。 -
斜率与传统 CAPM 公式中的 相对应,表示市场收益率发生单位变化时,资产收益率的变化程度。 -
ϵ 代表误差项或残差,表示观察到的回报与模型预测的回报之间的偏差。
先验:
-
"参数(误差项的标准差)的先验值为半考奇先验值(Half-Cauchy Prior),这是贝叶斯模型中方差参数的常见选择,因为它的尾部较重,允许有较大范围的可能值。 -
截距的先验值是以 0 为中心的正态先验值,标准差较大(本例中为 20),表达了对其值的不确定性,但也认识到在对无风险利率进行调整后,其值可能较小或为零。 -
斜率(或 )也是以 0 为中心的正态先验值,具有较大的标准差,反映了其不确定性,但允许数据告知其可能的值。
可能性:
-
似然函数说明我们认为数据是如何产生的。在这种情况下,资产超额收益被模拟为围绕均值的正态分布,而均值是市场超额收益的线性函数,“sigma”描述了围绕该均值的资产收益的变异性。
推断:
-
该模型使用观察到的数据(市场超额收益和资产超额收益)来更新我们对参数(截距、斜率和 sigma)的信念。马尔可夫链蒙特卡罗(MCMC)等采样方法用于近似这些参数的后验分布。
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()
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
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()
关于我们
数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。
新浪微博:@数据派THU
微信视频号:数据派THU
今日头条:数据派THU
评论