这篇教程的主要目的是介绍主动投资组合管理的一些重要概念,帮助不熟悉这一领域的读者能够了解这个方法论的核心思想和价值。我们先介绍主动投资的概念,然后引入主动投资里最重要的概念——信息率。 接着我们分别从主动投资组合最优化框架,以及收益、风险的权衡展开,最后我们通过一个实际的主动投资组合的案例实验来结束讨论。
之前我们已经介绍了经典的MPT,它的核心思想是市场是均衡的,不存在套利机会,投资者应该投资市场指数,从而分散股票的非特异风险并使得交易成本最低化。 但是,金融市场的从业人员、投资者一般都很难相信市场是完全有效的,甚至对于技术分析派的交易者,也会否认市场的弱势有效性。但是MPT确实有很多概念和工具值得我们借鉴, 于是,以Grinold为代表的主动投资理论便蓬勃发展起来,并且继承了MPT的诸多思想。
所谓主动投资是相对于被动投资而言的,假设有一家私募基金,投资者并且私募管理者以基金相对于沪深300指数的相对收益作为评估基金的标准,那么我们便认为沪深300指数期间的成分股权重作为这个资金投资组合的被动权重或者基准权重, 而基金任何偏离基准权重的情况都是基金的主动投资行为,因为基金管理者认为这些偏离能给组合带来相对于基准更高的风险调准后收益,也就是我们所谓的alpha收益或者风险调整后alpha。如果一个基金在整个投资期间没有任何主动权重, 那么它就是一只指数基金,因为它复制了指数组合,并且也获得了相同的指数收益。如果是一家对冲基金,它以绝对收益作为衡量自己业绩的标准,那么它的被动权重就是现金或者无风险资产,任何风险资产头寸都成为它的主动头寸。
一个基金管理者或者投资者采取主动投资,便是他认为他的主动行为上(如选股)相对于基准,能够提供额外的alpha收益,也就是说他相信自己在某些方面的投资能力能够创造alpha。主动投资组合管理便是一个系统的方法论和流程, 用以帮助相信具有alpha能力的投资者或者基金管理者来寻找和管理alpha。
为简介易懂,我以下面的表格作为例子。我们的基准组合是一个包含四个股票的全额投资等权组合,在表格的第二列是我们的基准权重。然后在一个假设场景中,基金经理认为风险资产配置太高,于是降低到90%,无风险资产权重提升至10%。 基金经理根据自己的独特信息来源以及选股能力,给出了下一个投资期的股票预期收益。并基于预期收益信息,基金经理进一步调整了风险资产权重,对应的是表格中的基金权重,作为验证,我们可以计算得到基金权重的总和是100%。 在上面我们也说过了,主动投资的定义是于基准的偏离,也就是实际资产组合与基准组合的偏差,于是我们把基金权重减去基准权重得到了主动权重,在我们表格中的第三列。主动权重是相对偏离,所以它的权重是可以为负的,但是我们还 看到了一个有趣的现象,那就是主动权重的和为0,也就是说主动组合是一个现金中性组合。最后,我们还计算了组合的实际收益率为31.7%,基准为14.5%,也就是说我们实现了17%的alpha,或者说主动收益率。
基准组合 | 基准权重 | 主动权重 | 基金权重 | 预期收益 | 期末收益 | 期末资本收益 |
---|---|---|---|---|---|---|
现金 | 0% | 10% | 10% | 5% | 5% | 0.5% |
股票1 | 25% | -15% | 15% | 10% | 8% | 1.2% |
股票2 | 25% | 15% | 60% | 50% | 40% | 24% |
股票3 | 25% | -10% | -10% | -20% | -10% | 1% |
股票4 | 25% | 0% | 25% | 15% | 20% | 5% |
合计 | 100% | 0% | 100% | N/A | N/A | 31.7% |
我们可以将预期收益率分解为四部分,分别是无风险收益(时间溢价)、业绩基准部分(风险溢价)、基准择时部分(超额业绩基准收益率)、alpha部分(预期残差收益率),即:
\begin{align*} \mathbb{E}[r_i] = r_f + \beta_i \mu_b + \beta_i \Delta f_b + \alpha_i \end{align*}时间溢价表示投资者放弃当前资产的投资转而投资无风险资产所获得的收益。称之为时间溢价代表对时间的补偿。一般我们可以采取银行间拆借利率作为无风险资产收益率,比如shibor。
这里采用了CAPM的概念,基准收益$\mu_b$一般指长期的基准超额收益。低beta资产具有较低的风险溢价,高beta具有较高的风险溢价。
如果你相信在未来相对短周期的投资期内(如下一季度、下一年),预期业绩基准收益率不同于$\mu_b$,那么$\Delta f_b$就衡量了业绩基准在临近的未来时期上的预期超额收益率与长期预期超额收益率的差,也就是我们常说的大盘择时。 而Grinold认为,大多数投资机构经理都不使用业绩基准择时,而忽略它也将大大降低学习主动管理的学习曲线,所以如无特别说明,我们下面以及以后的教程都会假设没有基准业绩择时,也就是$\Delta f_b = 0$。我会在专门的教程里讨论基准择时。
$\alpha_i$即股票预期残差收益率,也就是我们最感兴趣的一部分,衡量投资者的投资能力,如预测能力、选股能力。
残差收益率和风险为:
\begin{align*} \theta_p &= r_p - \beta_p r_b\\ \omega_p &= std(\theta_p) \end{align*}主动收益率和风险为:
\begin{align*} r_{pa} &= r_p - r_b = \theta_p - \beta_{pa} r_b\\ \psi_p &= std(r_{pa}) = \sqrt{\omega_p^2 + \beta_{pa}^2 \sigma_b^2} \end{align*}投资经理在避免基准择时的情况下,并设置$\beta_p=1$,那么主动收益率就是残差收益率。如果投资经理进行基准择时,从上述公式可以看到,主动收益率等于残差收益率与业绩基准择时收益率的和。
这里,我们将介绍衡量主动投资成功的标准,那就是信息率。不过在谈信息率之前,我们先要谈谈alpha。
向未来看,即先验alpha是对残差收益率的预测。向过去看,即后验alpha是实现的残差收益率的平均值。
alpha类似beta,是利用线性回归将组合收益率分解为与基准相关的部分(线性相关),以及与基准不相关的残差部分(非线性相关)。于是:
\begin{align*} r_{p}(t) &= \alpha_p + \beta_p r_b(t) + \epsilon_p(t) \end{align*}上面的$\alpha_p$和$\beta_p$分别是我们的后验alpha与后验beta。马上,我们可以推导出组合的残差收益率:
\begin{align*} \theta_{p}(t) &= \alpha_p + \epsilon_p(t) \end{align*}$\alpha_p$便是平均残差收益率,$\epsilon_p(t)$是残差收益率的随机项(均值为0)。
当我们向未来看,我们的先验alpha就是对残差收益率的预测。令$\theta_i$表示股票i的残差收益率,于是有:
\begin{align*} \alpha_i &= \mathbb{E}[\theta_i] \end{align*}组合alpha为:
\begin{align*} \alpha_p &= \boldsymbol{w^{\prime} \alpha} \end{align*}根据定义,基准的残差收益率总是为0,无风险资产的残差收益率也是0,因此任何有业绩基准和现金构成的投资租着的alpha也必然为0,即被动投资的alpha为0。
信息率用IR来表示,定义为年化残差收益率与年化残差风险的比值:
\begin{align*} IR_p = \frac{\bar{\theta}_p}{\omega_p} = \frac{\bar{\alpha_p}}{std(\alpha_p)} \end{align*}若不存在基准择时,那么$\beta_p=1$:
\begin{align*} IR_p = \frac{\bar{\alpha_p}}{std(\alpha_p)} = \frac{r_p-r_b}{std(r_p-r_b)} \end{align*}上面这个公式我们是不是觉得有点眼熟,是的,很像夏普比率:
\begin{align*} SR = \frac{r_p-r_f}{std(r_p)} \end{align*}SR代表单位总风险所蕴含的超额回报,IR在这个基础上,引入了相对性,它衡量了主动头寸组合的单位风险所蕴含的主动收益,换言之,即风险调整后的alpha。 如果我们将基准设为无风险资产,那么IR就是SR,之前我们也讨论过,SR用来衡量追求绝对收益的对冲基金更加合适,对于追求相对收益的投资基金或者投资策略, 就不那么合适了。
在《主动投资组合管理》,grinold给出了衡量IR的参考分布:
分位数 | 信息率 |
---|---|
10 | 1 |
25 | 0.5 |
50 | 0 |
75 | -0.5 |
90 | -1 |
Grinold认为整体而言,投资经理的费前信息率非常接近上表,是一个对称分布,所以主动管理是一个零和博弈游戏。在实践中,信息率高于1是卓越,高于0.5的信息率算是优秀了。
在被动投资里,我们的投资机会集就是与有效前沿相切的CML,所有投资经理、投资者都一样。而在主动投资中,IR绝对了投资经理、投资者的能力水平,并且只有在相同的业绩基准下,投资经理的IR才有对比的合理性。 信息率为主动投资经理定义了一条“预算约束”,即残差前沿:
\begin{align*} \alpha_p = IR \cdot \omega_p \end{align*}在最优的情形下,投资经理只能通过增加相应程度的残差风险来增加预期残差收益率。下面我们画出了主动投资的机会集,IR是图中的斜率,x/y轴分别代表残差收益率和残差风险。
import matplotlib.pyplot as plt
omegas = np.linspace(0, 0.15,50)
IR1,IR2,IR3 = [1,0.75,0.5]
alphas_1 = IR1*omegas
alphas_2 = IR2*omegas
alphas_3 = IR3*omegas
plt.plot(omegas, alphas_1, 'b-',label='IR1')
plt.plot(omegas, alphas_2, 'b--',label='IR2')
plt.plot(omegas, alphas_3, 'b-.',label='IR3')
plt.title("Active opportunity sets")
plt.xlabel("$\omega$")
plt.ylabel("alpha")
plt.legend()
plt.show()
首先,让我们重温下MPT里的最优组合问题阐述,其中f是超额收益:
\begin{align*} Minimize \qquad & \boldsymbol{w^{\prime} f} - \lambda \boldsymbol{w^{\prime} \Sigma w}\\ s.t \qquad & \boldsymbol{w^{\prime}} \boldsymbol{1} = 1 \end{align*}在主动投资组合管理中,我们关注的目标不再是我们的组合头寸,而是主动头寸,还记得我们的组合头寸总是等于基准头寸加上主动头寸么?
那么,在没有基准择时的情况下,我们的问题便转化为寻找最优无主动beta、现金中性的主动头寸:
\begin{align*} Maximize \qquad & \boldsymbol{w_a^{\prime} \alpha} - \lambda \boldsymbol{w_a^{\prime} (\Sigma - \beta \beta^{\prime} \sigma_b^2) w_a} = \alpha_p - \lambda \omega_p^2\\ s.t \qquad & \boldsymbol{w_a^{\prime}} \boldsymbol{1} = 0\\ \qquad & \boldsymbol{\beta^{\prime} w_a} = 1 \end{align*}我们有两个函数,分别是无差异曲线族和残差前沿:
\begin{align*} U &= \alpha - \lambda \omega^2, \quad \lambda \in \mathbb{R^{+}}\\ \alpha & = IR \cdot \omega \end{align*}为了找到两条曲线的焦点,把残差前沿带入无差异效用曲线:
\begin{align*} \lambda \omega^2 - IR \cdot \omega + U = 0 \end{align*}因为相切,所以上述曲线只有一个交点,最终得到:
\begin{align*} U^{\ast} &= \frac{IR^2}{4\lambda}\\ \alpha^{\ast} &= \frac{IR^2}{2 \lambda}\\ \omega^{\ast} &= \frac{IR}{2 \lambda} \end{align*}下面我们用python代码画出了无差异效用曲线和残差前沿,并且得到了最优组合。
omegas = np.linspace(0, 0.15,50)
IR = 0.75
lam = 5
alphas = IR*omegas
opt_va = IR**2/(4*lam)
opt_alpha = IR**2/(2*lam)
opt_omega = IR/(2*lam)
plt.plot(omegas, alphas, 'b-')
plt.plot(opt_omega, opt_alpha, 'ko')
# 无差异效用曲线
U = opt_va + lam * omegas**2
plt.plot(omegas, U, 'r-')
plt.plot(omegas, U+0.02, 'r-')
plt.plot(omegas, U-0.02, 'r-')
plt.title("Optimal decision under utility functions")
plt.xlabel("$\omega$")
plt.ylabel("alpha")
plt.show()
下面我们用一个toy example作为这篇教程的结尾。这个案例实验取自于《Alpha系列——从均值方差到有效前沿》,我们随机选取了五个股票,并重抽样还原至月收益数据,选取时间范围为2012年处到2017年底,同时以等权投资组合作为我们的基准业绩组合。 无风险资产收益率我们去一年期chibor利率,回测区间为2014年到2017年底,预留两年的数据用以计算必要的参数。
下面我们给出了实际可运行的python代码,其中get_active_mv_weight函数用以计算主动投资下的组合权重,plot_wealth_path函数画出我们最终的净值曲线,我们分别设置对残差风险厌恶系数分别为5、1、0.2情况下的净值曲线。从图中我们可以很明显地 看到残差风险厌恶系数对我们组合地残差风险的影响(与基准变动程度的偏离),同时我们的净值曲线大多在基准上面,说明了我们的主动头寸贡献了alpha,回忆一下,我们组合中的基准头寸beta为1,alpha为0。
# 随机选取样本
start_date = '2012-01-01'
end_date = '2017-12-30'
instruments = ['601601.SHA', '600030.SHA', '601668.SHA', '600036.SHA', '601098.SHA']
df = D.history_data(instruments,start_date,end_date, fields=['close'])
# 重抽样还原股票相关数据
resample_freq = 'M'
ret_df = df.set_index('date')\
.groupby('instrument')\
.apply(lambda df: df['close'].resample(resample_freq,how='last'))\
.transpose()\
.apply(lambda df: df.pct_change().dropna())
def get_active_mv_weight(ret_df, rf=0.04393, lambda_R=.1, atol=1e-03):
V=ret_df.cov()*12
N = len(V)
e = np.ones(N)
sigma = np.sqrt(np.diag(V))
V_inverse = np.linalg.inv(V)
# 基准组合收益率
port_B = ret_df.mean(axis=1)
# 最小方差组合
w_C = V_inverse.dot(e)/e.T.dot(V_inverse).dot(e)
sigma2_C = w_C.dot(V).dot(w_C)
sigma_C = np.sqrt(sigma2_C)
# alpha 特征组合
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(port_B.reshape(-1,1)-rf/12, ret_df-rf/12)
alpha, beta = reg.intercept_,reg.coef_
beta = beta.reshape(-1)
h_A = V_inverse.dot(alpha)/alpha.T.dot(V_inverse).dot(alpha)
omega2_A = h_A.dot(V).dot(h_A)
omega_A = np.sqrt(omega2_A)
alpha_A = h_A.dot(alpha)
beta_A = h_A.dot(beta)
IR = 1/omega_A
assert np.allclose(alpha_A,1,atol=atol), "alpha特征组合应该有单位alpha暴露,实际为: "+str(alpha_A)
assert np.allclose(beta_A,0,atol=atol), "alpha特征组合的beta暴露为0,实际为: "+str(beta_A)
# 基准组合
h_B = e/N
omega2_B = h_B.dot(V).dot(h_B)
omega_B = np.sqrt(omega2_B)
beta_B = h_B.dot(beta)
assert np.allclose(beta_B,1,atol=atol), "beta特征组合应该有单位beta暴露,实际为: "+str(beta_B)
# CR 组合
beta_C = beta.dot(w_C)
h_CR = w_C - beta_C*h_B
omega2_C = sigma2_C*(1-beta_C)
omega_C = np.sqrt(omega2_C)
alpha_C = alpha.dot(w_C)
IR_C = alpha_C/omega_C
assert np.allclose(beta.dot(h_CR),0,atol=atol), 'CR组合的beta暴露为0,实际为: '+str(beta.dot(h_CR))
# 主动头寸
h_Y = h_A/omega_A - (IR_C/IR)*h_CR/omega_C
assert np.allclose(beta.dot(h_Y),0,atol=atol), 'Y组合是beta中性的,实际为: '+str(beta.dot(h_Y))
assert np.allclose(h_Y.sum(),0,atol=atol), 'Y组合是现金中性的,实际为: '+str(h_Y.sum())
h_P = h_B + IR/(2*lambda_R)*h_Y
return h_P
import matplotlib.pyplot as plt
def plot_wealth_path(title="wealth curve with risk reversion of 0.5",lambda_R=0.5):
P_portfolio_wealth = 1
E_portfolio_wealth = 1
P_portfolio_wealth_path = []
E_portfolio_wealth_path = []
L = len(ret_df)
start_index=24 # 预留24个月数据
rf=0
w_P = None
prev_w_P = None
trans_cost_ratio = 0.01
N = ret_df.shape[1]
e = np.ones(N)
w_E = np.ones(N)/N
for i in range(start_index,L):
## 每次循环的逻辑相当于期初开仓或调仓、期末计算收益,其中会考虑组合偏移因素
## 即10%的资金开仓,期末由于股票上涨50%,导致组合权重偏移5%(假设其他股票没变化)
curr_ret_df = ret_df.iloc[i,:]
hist_2_prev_ret_df = ret_df.iloc[:i,:]
# 最优主动组合
adjusted_w_P = get_active_mv_weight(hist_2_prev_ret_df, lambda_R=lambda_R)
r_P = adjusted_w_P.dot(curr_ret_df)
r_E = w_E.dot(curr_ret_df)
# 假设交易费用为净仓位的1%,包含交易佣金、手续费和滑点
if i == start_index:
c_P = trans_cost_ratio*np.abs(adjusted_w_P).sum()
c_E = trans_cost_ratio*np.abs(w_E).sum()
else:
# 计算组合偏移权重
shifted_w_P = prev_w_P * (1+curr_ret_df)
shifted_w_P /= shifted_w_P.sum()
shifted_w_E = w_E * (1+curr_ret_df)
shifted_w_E /= shifted_w_E.sum()
c_P = trans_cost_ratio*np.abs(adjusted_w_P-shifted_w_P).sum()
c_E = trans_cost_ratio*np.abs(w_E-shifted_w_E).sum()
prev_w_P = adjusted_w_P
P_portfolio_wealth *= 1+r_P-c_P
E_portfolio_wealth *= 1+r_E-c_E
P_portfolio_wealth_path.append(P_portfolio_wealth)
E_portfolio_wealth_path.append(E_portfolio_wealth)
plt.figure(figsize=(15,5))
p1,=plt.plot(P_portfolio_wealth_path)
p2,=plt.plot(E_portfolio_wealth_path)
plt.title(title,fontsize=20)
plt.xlabel('time step',fontsize=20)
plt.ylabel('account wealth',fontsize=20)
plt.legend([p1,p2],['active portfolio', 'equal weight portfolio'],loc='upper left')
plt.show()
plot_wealth_path(title="wealth curve with risk reversion of 5",lambda_R=5)
plot_wealth_path(title="wealth curve with risk reversion of 1",lambda_R=1)
plot_wealth_path(title="wealth curve with risk reversion of 0.2",lambda_R=0.2)
我们再看一下在期末,我们的组合权重、基准权重和主动权重的分布情况。记住,组合权重等于基准权重加上主动权重(假设没有基准择时)。
w_P = get_active_mv_weight(ret_df, lambda_R=1)
w_B = np.ones(5)/5
w_A = w_P - w_B
plt.figure(figsize=(15,5))
plt.subplot(1,3,1)
plt.bar(range(len(w_P)),w_P)
plt.title("total weight vector",fontsize=20)
plt.ylabel("weight",fontsize=20)
plt.xlabel("stock",fontsize=20)
plt.ylim(-0.05,0.25)
plt.xticks(range(len(w_P)),[x[:-4] for x in instruments])
plt.subplot(1,3,2)
plt.bar(range(len(w_B)),w_B,color='g')
plt.title("benchmark weight vector",fontsize=20)
plt.ylabel("weight",fontsize=20)
plt.xlabel("stock",fontsize=20)
plt.ylim(-0.05,0.25)
plt.xticks(range(len(w_B)),[x[:-4] for x in instruments])
plt.subplot(1,3,3)
plt.bar(range(len(w_A)),w_A,color='r')
plt.title("active weight vector",fontsize=20)
plt.ylabel("weight",fontsize=20)
plt.xlabel("stock",fontsize=20)
plt.ylim(-0.05,0.25)
plt.xticks(range(len(w_A)),[x[:-4] for x in instruments])
plt.tight_layout()
plt.show()