资产配置研究框架(附代码)
大类资产配置是全球化视野下投资组合管理的重要议题之一。风险和收益是衡量投资组合管理绩效的天枰两边的两个筹码,如何有效均衡风险和收益的关系一直是学界和业界探讨的问题。
本文旨在将目标风险函数和收益风险函数这两大类目标函数引入资产配置研究框架中,同时对比分析综合宏观观点的Black Litterman模型,并在中国市场上进行实证分析。
资产配置理论介绍
广义风险平价模型(风险类目标函数)
风险类目标函数即广义的风险平价模型,就是构造不同风险指标的等风险投资组合。
最典型的风险类目标函数是传统的或者说是狭义的风险平价模型,即波动率平价。我们定义投资组合的波动率为:
我们的目标是令标的资产i对投资组合波动率的风险贡献度为投资组合总风险的的1/N:
我们需要解下面这个最小化问题:
#定义波动率平价优化的目标函数
def funsRP(weight,sigma):
weight = np.array([weight]).T
X = np.multiply(weight,np.dot(sigma.values,weight))
result = np.square(np.dot(X,np.ones([1,X.shape[0]])) - X.T).sum()
return(result)
同理,我们可以将狭义的风险平价模型扩展为波动率平价、下行波动率平价、收敛协方差(ledoit_wolf)平价、加权平均波动率平价、加权平均下行波动率平价、加权平均收敛协方差(ledoit_wolf)平价这六种模型。
下行波动率的计算公式如下:
在O.Ledoit 和 M.Wolf 2004 年的论文 [1] 中, 提出了一个公式, 用来计算最优的收缩系数 ,它使得估计协方差和实际协方差矩阵之间的均方误差(Mean Squared Error)进行最小化,这就是收敛协方差(ledoit_wolf)。我在计算中直接调用Scikit-Learn中的代码,计算公式如下:
加权平均风险溢价的方法即将过去n期计算的风险指标按照权重等差衰减的方式进行加权平均。这里,n取4.
风险类目标函数(广义风险平价)代码如下:
#定义下行波动率平价优化的目标函数
def downward(RET,rollingtime=126):
i=130
data_cov = RET.iloc[i-int(rollingtime):i]
data_cov[data_cov>0] = 0
sigma = data_cov.cov()
return sigma
def getSigma(datas, method='Simple'):
asset = datas.columns
datas['n'] = np.arange(datas.shape[0])
datas['group'] = pd.qcut(datas.n, 4, labels=False)
weights = np.arange(1, datas.shape[1]) / 10
if method == 'Simple':
sigma_1 = datas.loc[datas.group == 0, asset].cov()
sigma_2 = datas.loc[datas.group == 1, asset].cov()
sigma_3 = datas.loc[datas.group == 2, asset].cov()
sigma_4 = datas.loc[datas.group == 3, asset].cov()
sigma = 0.1 * sigma_1 + sigma_2 * 0.2 + sigma_3 * 0.3 + sigma_4 * 0.4
elif method == 'Ledoit':
sigma_1, a = ledoit_wolf(datas.loc[datas.group == 0, asset])
sigma_2, a = ledoit_wolf(datas.loc[datas.group == 1, asset])
sigma_3, a = ledoit_wolf(datas.loc[datas.group == 2, asset])
sigma_4, a = ledoit_wolf(datas.loc[datas.group == 3, asset])
sigma = 0.1 * sigma_1 + sigma_2 * 0.2 + sigma_3 * 0.3 + sigma_4 * 0.4
sigma = pd.DataFrame(sigma)
elif method == 'DW':
datas[datas > 0] = 0
datas['n'] = np.arange(datas.shape[0])
datas['group'] = pd.qcut(datas.n, 4, labels=False)
sigma_1 = datas.loc[datas.group == 0, asset].cov()
sigma_2 = datas.loc[datas.group == 1, asset].cov()
sigma_3 = datas.loc[datas.group == 2, asset].cov()
sigma_4 = datas.loc[datas.group == 3, asset].cov()
sigma = 0.1 * sigma_1 + sigma_2 * 0.2 + sigma_3 * 0.3 + sigma_4 * 0.4
else:
pass
return sigma
广义均值方差模型(收益类目标函数)
收益率目标函数在资产配置框架中的典型代表是传统的均值方差模型,即马科维茨的均值一方差组合模型(Markovitz Mean-Variance Model)。它是用收益率序列均值来代表投资组合的收益,用收益率序列方差来代表投资组合的风险,以此来平衡投资组合的风险和收益。
投资组合预期收益的计算公式为:
投资组合预期方差的计算公式为:
用矩阵的方法来表示有效前沿:
用代码实现,如下:
#定义马科维茨优化的目标函数
def funs(weight,sigma):
weight = np.array([weight]).T
result = np.dot(np.dot(weight.T,np.mat(sigma)),weight)[0,0]
return(result)
同理,我们可以将扩展出广义的均值方差模型,即使用收益的替代变量替换分子,使用风险的替代变量替换分母。首先,我将最大化目标函数改为最小化最大回撤。最大回撤的计算公式如下(P为某一天的净值,x为某一天,y为x后的某一天,Px为第x天的产品净值,Py则是Px后面某一天的净值):
代码实现如下:
#--* define objective functions*--
def minMDD(weights, Returns):
weights = np.array(weights)
RET = np.sum(Returns * weights, axis=1)
value = (RET+1).cumprod()
MDD = ffn.calc_max_drawdown(value)
return (-MDD)
然后,我将最大化目标函数改为最大化收益比上VaR,最大化收益比上CVaR。其中VaR的计算方式采用历史的VaR。历史模拟法的VaR即将收益率序列升序排列后,位于总体100p%处的收益率值作为VaR的估计值。历史的方法假设历史数据样本确实可以代替整体分布。
代码实现如下:
#--*define VaR*--
def maxR2VaR(weights,Returns,method='historical',
alpha=0.99):
weights = np.array(weights)
RET = np.sum(Returns *weights,axis=1)
sorted_Returns = np.sort(RET)
index = int(alpha * len(sorted_Returns))
var = abs(sorted_Returns[index])
result = var/(np.average(RET)++10000000)
return(result)
#--*define CVaR*--
def maxR2CVaR(weights,Returns,alpha=0.99):
weights = np.array(weights)
RET = np.sum(Returns *weights,axis=1)
sorted_Returns = np.sort(RET)
index = int(alpha * len(sorted_Returns))
sum_var = sorted_Returns[0]
for i in range(1, index):
sum_var += sorted_Returns[i]
CVaR=abs(sum_var / index)
result = CVaR/(np.average(RET)++10000000)
return(result)
宏观观点下的Black Littterman模型
Black Litterman模型对马科维兹模型进行改进,在收益率序列分布上,用贝叶斯统计理论将投资者对大类资产的观点与市场均衡回报相结合。
由马科维兹模型,我们知道
市场超额收益为
现在我们要构建一个投资组合满足在既定风险下的期望收益最大化。引入对个股期望收益的主观判断如下:
我们需要解下面这个最小化问题:
对个股期望收益的主观判断,这里采用宏观场景的方法进行建模,并将历史的方法作为基准模型。历史的方法即采用过去半年内的资产收益分布作为期望收益分布,宏观场景的方法即假设两个宏观经济形势相似的时段内资产期望收益分布相同。这里采用十个中国宏观经济的主要变量,经过主成分分析后得到的因子载荷矩阵,取前四大主成分因子,并将各个主成分解释方差的比例作为其在总体中重要性的量度,从而可以作为加权计算宏观相似性时的权重。然后,对因子序列进行一阶差分、去极值、HP滤波处理。对于两个长度相同的时间区间,分别计算出两个时间段内各个因子的相关系数;对各因子的相关系数进行加权,将得到的加权相关系数作为这两个时间段宏观经济相似性的量度。具体方法详见诺德基金徐浩天《基于宏观场景分析的大类资产配置策略》。
表 选用的宏观指标
指标名称 | 处理方法 | 指标类型 |
---|---|---|
工业企业:营业收入 | 累计同比 | 景气 |
工业企业:产成品存货 | 累计同比 | 景气 |
消费者预期指数 | 同比 | 景气 |
CPI | 同比 | 通胀 |
PPI | 同比 | 通胀 |
M1 | 同比 | 流动性 |
M2 | 同比 | 流动性 |
M2-M1 | 同比 | 流动性 |
中债10年国债到期收益率 | 同比 | 流动性 |
央行负债 | 同比 | 流动性 |
资料来源:WIND数据库
资产配置实证分析
实证部分的数据起止时间为2004/01/02-2018/12/28,指数采用500、中证全债、万德商品指数、999黄金期货、标普500、恒生指数,滚动回测区间长度为100天,调仓频率为每月一次。投资组合的全样本表现、权重变化图、净值曲线图如下所示。
基准投资组合
EW | EV | |
---|---|---|
年化收益率 | 0.069995 | 0.051687 |
T检验值 | 2.349517 | 4.849205 |
年化波动率 | 0.113759 | 0.038006 |
最大回撤 | 0.417102 | 0.123285 |
累计净值 | 2.409684 | 1.925404 |
夏普比率 | 0.351571 | 0.57061 |
收益比上VaR | -0.01563 | -0.03094 |
收益比上CVaR | -9.03675 | -1.88108 |
基准投资组合的权重变化图
基准投资组合的净值曲线图
广义风险平价模型
年化收益率 | T检验值 | 年化波动率 | 最大回撤 | 累计净值 | 夏普比率 | 收益比上VaR | 收益比上CVaR | |
---|---|---|---|---|---|---|---|---|
variance | 0.061303 | 5.771992 | 0.037607 | 0.114315 | 2.167278 | 0.832393 | -0.03409 | -1.59811 |
downward | 0.080861 | 5.301775 | 0.053867 | 0.094719 | 2.747954 | 0.944198 | -0.03448 | -1.69246 |
ledoit_wolf | 0.068865 | 3.646437 | 0.068148 | 0.258295 | 2.376828 | 0.570309 | -0.02366 | -2.47014 |
shrinkage | 0.069197 | 6.636171 | 0.036718 | 0.096217 | 2.386452 | 1.067529 | -0.04066 | -1.49989 |
shrinkage_DW | 0.076659 | 5.144326 | 0.052744 | 0.084664 | 2.612267 | 0.884644 | -0.03159 | -1.73889 |
shrinkage_Ledoit | 0.071664 | 3.17271 | 0.082529 | 0.320747 | 2.45902 | 0.504842 | -0.02105 | -3.0959 |
广义风险平价模型的投资组合净值曲线图
狭义的风险平价模型(波动率平价模型)的权重变化图
ledoit_wolf平价模型的权重变化图
下行波动率平价模型的权重变化图
收缩的波动率平价模型的权重变化图
shrinkage_Ledoit 平价模型的权重变化图
shrinkage_DW平价模型的权重变化图
广义均值方差模型
年化收益率 | T检验值 | 年化波动率 | 最大回撤 | 累计净值 | 夏普比率 | 收益比上VaR | 收益比上CVaR | |
---|---|---|---|---|---|---|---|---|
MAC | 0.069409 | 3.43773 | 0.073193 | 0.211136 | 2.392606 | 0.538428 | -0.02438 | -2.31929 |
minMDD | 0.062581 | 8.473443 | 0.025971 | 0.043603 | 2.201435 | 1.254488 | -0.04804 | -1.37752 |
historical VaR | 0.06204 | 3.270488 | 0.068979 | 0.182904 | 2.186913 | 0.464489 | -0.01978 | -3.3727 |
historical CVaR | 0.063631 | 2.808532 | 0.083694 | 0.149541 | 2.229878 | 0.40183 | -0.01841 | -2.81145 |
广义均值方差模型的投资组合净值曲线图
狭义的均值方差模型的权重变化图
最小化最大回撤下的权重变化图
最大化收益比上VaR下的权重变化图
最大化收益比上CVaR下的权重变化图
Black Littterman模型
历史的BL | BL宏观场景下的BL | |
---|---|---|
年化收益率 | 0.069368 | 0.061145 |
T检验值 | 3.43852 | 1.957171 |
年化波动率 | 0.073131 | 0.123416 |
最大回撤 | 0.21163 | 0.412883 |
累计净值 | 2.391404 | 2.163073 |
夏普比率 | 0.53832 | 0.252357 |
收益比上VaR | -0.02437 | -0.01189 |
收益比上CVaR | -2.32377 | -12.188 |
BL模型的投资组合净值曲线图
历史BL的权重变化图
宏观场景下的BL的权重变化图
Reference:
诺德基金徐浩天《基于宏观场景分析的大类资产配置策略》
项目Github链接: Strategic_Asset_Allocation_
欢迎关注二幺子的知识输出通道:
_biz=MzU5NDY0NDM2NA%3D%3D&chksm=fe7f5d23c908d435fd69315b252ec08b72294754eb13ce884a2a5ba5678b6ed76b540889e6b6&idx=1&mid=2247483840&scene=21&sn=f4af3de6e389047ee46b28e37f6cbe76#wechat_redirect) **
诺德基金徐浩天《基于宏观场景分析的大类资产配置策略》
项目Github链接: Strategic_Asset_Allocation_
欢迎关注二幺子的知识输出通道:
来源:CSDN
作者:天天学习的二幺
链接:https://blog.csdn.net/weixin_42294255/article/details/104094943