2 python实现资产配置--Blacklitterman 模型

1. Black-模型简介
在实现资产配置(1)---- 投资组合模型中, 我们已经见过如何使用求得最优资产配比. 这是一种在已知未来各资产的概率分布,然后再求解的方法.
模型输入参数包括历史数据法和情景分析法两种方法,情景分析法的缺点是主观因素,随意性太强,因此使用历史数据法, 将资产的均值和协方差输入模型是比较常见的作法. 不过, 不足之处很明显: 未来的资产收益率分布不一定与过去相同. 此外,模型结果对输入参数过于敏感.
Black-模型就是基于此的改进. 其核心思想是将投资者对大类资产的观点 (主观观点) 与市场均衡收益率 (先验预期收益率)相结合,从而形成新的预期收益率(后验预期收益率). 这里的先验预期收益率的分布可以是贝叶斯推断中的先验概率密度函数的多元正态分布形式,投资者的主观观点就是贝叶斯推断中的似然函数(可以看作新的信息, 因为做出主观判断必然是从外界获取得到了这些资产的收益率变化信息), 而相应的, 后验预期收益率也可以从后验概率密度函数中得到. 具体的推导可以看我的这篇文章:从贝叶斯定理到贝叶斯推断.
【2python实现资产配置--Blacklitterman 模型】BL模型的求解步骤包括下面几步:
(1) 使用历史数据估计预期收益率的协方差矩阵作为先验概率密度函数的协方差.
(2) 确定市场预期之收益率向量, 也就是先验预期收益之期望值. 作为先验概率密度函数的均值. 或者使用现有的期望值和方差来反推市场隐含的均衡收益率(), 不过在使用这种方法时, 需要知道无风险收益率 R f R_f Rf?的大小.
(3) 融合投资人的个人观点,即根据历史数据(看法变量的方差)和个人看法(看法向量的均值)
(4) 修正后验收益.
μ B L = [ ( τ Σ ) ? 1 + ( P T Ω ? 1 P ) ] ? 1 [ ( τ Σ ) ? 1 Π + P T Ω ? 1 Q ] Σ B L = Σ + [ ( τ Σ ) ? 1 + ( P T Ω ? 1 P ) ] ? 1 \mu^{BL} = [(\tau\Sigma)^{-1}+(P^T\Omega^{-1}P)]^{-1}[(\tau\Sigma)^{-1}\Pi+P^T\Omega^{-1}Q] \\ \Sigma^{BL} = \Sigma+[(\tau\Sigma)^{-1}+(P^T\Omega^{-1}P)]^{-1} μBL=[(τΣ)?1+(PTΩ?1P)]?1[(τΣ)?1Π+PTΩ?1Q]ΣBL=Σ+[(τΣ)?1+(PTΩ?1P)]?1
τ \tau τ是均衡收益率协方差的调整系数,可以根据信心水平来判断.Σ \Sigma Σ是历史资产收益率的协方差矩阵, P是投资者的观点矩阵, Ω \Omega Ω是似然函数(即投资者观点函数)中的协方差矩阵,其值为 P T ( τ Σ ) P P^T(\tau\Sigma)P PT(τΣ)P的对角阵,Π \Pi Π是先验收益率的期望值.
(5) 投资组合优化: 将修正后的期望值与协方差矩阵即$\mu^{BL}, \Sigma^{BL} $重新代入投资组合模型求解.
2. Black- 模型的实现
(1)定义求解函数,输入为投资者观点P,Q以及目前资产的市场收益率矩阵,输出为后验的市场收益率和协方差矩阵.
import numpy as npimport baostock as bsimport pandas as pdfrom numpy importlinalgdef blacklitterman(returns,tau,P,Q):mu = returns.mean()sigma = returns.cov()pil = np.expand_dims(mu,axis = 0).Tts = tau * sigmats_1 = linalg.inv(ts)Omega = np.dot(np.dot(P,ts), P.T)* np.eye(Q.shape[0])Omega_1 = linalg.inv(Omega)er = np.dot(linalg.inv(ts_1 + np.dot(np.dot(P.T,Omega_1),P)),(np.dot(ts_1 ,pil)+np.dot(np.dot(P.T,Omega_1),Q)))posterirorSigma = linalg.inv(ts_1 + np.dot(np.dot(P.T,Omega_1),P))return [er, posterirorSigma]
(2) 实列分析
我们继续研究实现资产配置(1)---- 投资组合模型中的五支股票: 白云机场, 福建高速, 华夏银行, 生益科技和浙能电力. 假设现在分析师的观点为:

2  python实现资产配置--Blacklitterman 模型

文章插图
pick1 = np.array([1,0,1,1,1])q1 = np.array([0.003*4])pick2 = np.array([0.5,0.5,0,0,-1])q2 = np.array([0.001])P = np.array([pick1,pick2])Q = np.array([q1,q2])
获取股票数据, 并且获得后验的均值和方差: