资产配置研究框架(附代码)

让人想犯罪 __ 提交于 2020-01-27 22:18:50

资产配置研究框架(附代码)

大类资产配置是全球化视野下投资组合管理的重要议题之一。风险和收益是衡量投资组合管理绩效的天枰两边的两个筹码,如何有效均衡风险和收益的关系一直是学界和业界探讨的问题。

本文旨在将目标风险函数和收益风险函数这两大类目标函数引入资产配置研究框架中,同时对比分析综合宏观观点的Black Litterman模型,并在中国市场上进行实证分析。

资产配置理论介绍

广义风险平价模型(风险类目标函数)

风险类目标函数即广义的风险平价模型,就是构造不同风险指标的等风险投资组合。

最典型的风险类目标函数是传统的或者说是狭义的风险平价模型,即波动率平价。我们定义投资组合的波动率为:
σ(ω)=ωΣω \sigma(\omega)=\sqrt{\omega^{'}\Sigma\omega^{'} }
我们的目标是令标的资产i对投资组合波动率的风险贡献度为投资组合总风险的的1/N:
σ(ωi)=ωiσ(ω)ωi=ωi(Σω)iωΣω=σ(ω)N \sigma(\omega_i)=\omega_i\ast \frac{\partial \sigma(\omega)}{\partial \omega_i} \\=\frac{\omega_{i}(\Sigma\omega)_{i}}{\sqrt{\omega^{'}\Sigma\omega^{'}} } =\frac{\sigma(\omega)}{N}
我们需要解下面这个最小化问题:
argminωi=1N[ωiω(σ)2(Σω)iN]2 argmin\omega \sum_{i=1}^{N}[\omega_i-\frac{\omega(\sigma)^{2}}{(\Sigma\omega)_iN}]^{2}

#定义波动率平价优化的目标函数
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)平价这六种模型。

下行波动率的计算公式如下:
MSDmin=R<Rmin(RRmin)2N MSD_{min}=\sqrt{\frac{\sum_{R<R_{min}}^{ } (R-R_{min})^{2}}{N}}
在O.Ledoit 和 M.Wolf 2004 年的论文 [1] 中, 提出了一个公式, 用来计算最优的收缩系数 \alpha ,它使得估计协方差和实际协方差矩阵之间的均方误差(Mean Squared Error)进行最小化,这就是收敛协方差(ledoit_wolf)。我在计算中直接调用Scikit-Learn中的代码,计算公式如下:
Σshrunk=(1α)Σ^+αTrΣ^ \Sigma_{\rm shrunk}=(1-\alpha)\hat{\Sigma}+\alpha\frac{{\rm Tr}}{\hat{\Sigma}}
加权平均风险溢价的方法即将过去n期计算的风险指标按照权重等差衰减的方式进行加权平均。这里,n取4.
σ=nσn+(n1)σn1+(n2)σn2+...n+(n1)+(n2)+... \sigma = \frac{n\sigma_n+(n-1)\sigma_{n-1}+(n-2)\sigma_{n-2}+...}{n+(n-1)+(n-2)+...}
风险类目标函数(广义风险平价)代码如下:

#定义下行波动率平价优化的目标函数
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)。它是用收益率序列均值来代表投资组合的收益,用收益率序列方差来代表投资组合的风险,以此来平衡投资组合的风险和收益。

投资组合预期收益的计算公式为:
E(Rp)=iωiE(Ri) E(R_p)=\sum_{i}^{}\omega_iE(R_i)
投资组合预期方差的计算公式为:
σp2=iωi2σi2+iijωiωjσiσjρij \sigma_{p}^{2}=\sum_{i}^{}\omega_{i}^{2}\sigma_{i}^{2}+\sum_{i}^{}\sum_{i\neq j}^{}\omega_i\omega_j\sigma_i\sigma_j\rho_{ij}
用矩阵的方法来表示有效前沿:
ωTω q RTω \omega ^{T}\sum \omega-~q~*R^{T}\omega
用代码实现,如下:

#定义马科维茨优化的目标函数
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后面某一天的净值):
maximum drawdown=max(PxPy)Px maximum~drawdown=\frac{max(P_x-P_y)}{P_x}
代码实现如下:

#--* 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的估计值。历史的方法假设历史数据样本确实可以代替整体分布。

VaRt+1p=Percentile(RPF,t+1ττ=1m,100p) VaR_{t+1}^{p}=-Percentile({R_{PF,t+1-\tau}}_{\tau=1}^{m},100p)
代码实现如下:

#--*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模型对马科维兹模型进行改进,在收益率序列分布上,用贝叶斯统计理论将投资者对大类资产的观点与市场均衡回报相结合。

由马科维兹模型,我们知道
β=Cov(r,wTr)Var(wTr)=Cov(r,r)wVar(wTr)=1σ2Σw \beta=\frac{Cov(r,w^Tr)}{Var(w^Tr)}=\frac{Cov(r,r)w}{Var(w^Tr)}=\frac{1}{\sigma^2}\Sigma w
市场超额收益为
Excess Return=(wTr)β=(wTr)β=wTrσ2Σw Excess~Return=(w^Tr)\beta \\=(w^Tr)\beta=\frac{w^Tr}{\sigma^2}\Sigma w
现在我们要构建一个投资组合ww满足在既定风险下的期望收益最大化。引入对个股期望收益的主观判断如下:
PE(r)=q+vvN(0,Ω)PE(r)N(q,Ω) Excess eturnE(r)N(E(r),τΣ) PE(r)=q+v \\ v\sim N(0,\Omega) \\ PE(r)\sim N(q,\Omega) \\假设~Excess~eturn|E(r)\sim N(E(r),\tau\Sigma)
我们需要解下面这个最小化问题:
minE(r) (E(r)Excess Return)T(τΣ)1(E(r)Excess Return)s.t. PE(r)=q \min_{E(r)}\ (E(r)-Excess~Return)^T(\tau\Sigma)^{-1}(E(r)-Excess~Return) \\ s.t.\ PE(r)=q
对个股期望收益的主观判断,这里采用宏观场景的方法进行建模,并将历史的方法作为基准模型。历史的方法即采用过去半年内的资产收益分布作为期望收益分布,宏观场景的方法即假设两个宏观经济形势相似的时段内资产期望收益分布相同。这里采用十个中国宏观经济的主要变量,经过主成分分析后得到的因子载荷矩阵,取前四大主成分因子,并将各个主成分解释方差的比例作为其在总体中重要性的量度,从而可以作为加权计算宏观相似性时的权重。然后,对因子序列进行一阶差分、去极值、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

基准投资组合的权重变化图

avatar

基准投资组合的净值曲线图

avatar

广义风险平价模型

年化收益率 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

广义风险平价模型的投资组合净值曲线图

avatar

狭义的风险平价模型(波动率平价模型)的权重变化图

avatar

ledoit_wolf平价模型的权重变化图

avatar

下行波动率平价模型的权重变化图

avatar

收缩的波动率平价模型的权重变化图

avatar

shrinkage_Ledoit 平价模型的权重变化图

avatar

shrinkage_DW平价模型的权重变化图

avatar

广义均值方差模型

年化收益率 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

广义均值方差模型的投资组合净值曲线图

avatar

狭义的均值方差模型的权重变化图

avatar

最小化最大回撤下的权重变化图

avatar

最大化收益比上VaR下的权重变化图

avatar

最大化收益比上CVaR下的权重变化图

avatar

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模型的投资组合净值曲线图

avatar

历史BL的权重变化图

avatar

宏观场景下的BL的权重变化图

avatar

Reference:

资产瞎配模型(三):风险平价及其优化

VaR系列(一):HS,WHS,RM方法估计VaR

诺德基金徐浩天《基于宏观场景分析的大类资产配置策略》

项目Github链接: Strategic_Asset_Allocation_

欢迎关注二幺子的知识输出通道:

_biz=MzU5NDY0NDM2NA%3D%3D&chksm=fe7f5d23c908d435fd69315b252ec08b72294754eb13ce884a2a5ba5678b6ed76b540889e6b6&idx=1&mid=2247483840&scene=21&sn=f4af3de6e389047ee46b28e37f6cbe76#wechat_redirect) **

诺德基金徐浩天《基于宏观场景分析的大类资产配置策略》

项目Github链接: Strategic_Asset_Allocation_

欢迎关注二幺子的知识输出通道:

avatar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!