在当下这个特殊时期,推荐基金时,大家一定要注意三个原则。
第一,主推被动基金,亏了就是市场的问题。
第二,主打资产配置,尽可能帮助客户分散风险,当然主要还是帮客户分散未来可能的不满情绪。
第三,一定要有理论依据,最好有投资大师背书,亏钱了,可能是市场的问题,可能是碰到小概率事件了,但一定不是我的问题,因为我就是一个抄作业的。
对于前两点,我相信大部分人都已经被市场教育过了,越来越重视被动投资,和资产配置风险分散了。
但是呢,对于这第三点,相信很多朋友还是摸不到头脑。
比如,你推荐了一个沪深300+标普500的组合,客户问了,具体该怎么分配仓位啊?
于是你一拍脑袋,55开吧,均衡配置嘛。
但是一年之后,沪深300涨了30%,标普500跌了50%,客户过来找你,问,你当时为什么让我55开配置,为什么不让我多配置沪深300呢?
你的依据是什么?
虽然,你心里会想,券商分析师预测企业盈利的时候,有什么依据呢?不也是拍脑袋吗?
但你肯定不能这样跟客户说。
实际上,这个提问就是无解的,毕竟谁能判断出未来的走势呢?
既然解决不了问题,那就解决问题本身,把皮球踢给理论。
如果在客户买入的时候,你就说了,各资产权重的计算,基于风险平价理论,桥水的全天候策略就是这么做的,我只是复制他们的策略。
这不就能完美避免后续的麻烦了嘛?
好了,前面铺垫的有点多,现在我就告诉大家,优雅的、没有后续麻烦的、基于风险平价理论的资产配置,到底应该怎么做。
所谓风险平价,就是要求,每一个底层资产,在组合中贡献的风险(波动率)尽可能一致。
举个简单的例子,A资产的波动率是1%,B资产的波动率是3%,那么分别赋予A、B资产3份和1份的权重,就能实现风险平价。
当然,这个例子比较简单,里面只有两类资产,在实操中,如果资产数量很多,会涉及到各种动态平衡调整,这个过程需要通过代码实现。
先看结论吧,我选择了沪深300、标普500、纳斯达克100、日经225、德国DAX、孟买Sensex30、黄金、原油、中国10年期国债,9个资产作为底层。
按照最基础的风险平价理论,月度调整仓位,并采用月度收益率数据。
策略的走势如下(风险平价为蓝色)——
从2009年至2023年年末,风险平价策略的区间收益超过215%,合年化收益8%。(以指数为基准测算收益,不考虑汇率)
看起来收益率好像比较中庸,但是它的高阶数据非常好看。
第一,最大回撤只有7%,比10年期国债的5.8%稍高一些,但是大幅低于其余股票指数和商品指数。
第二,夏普比率非常高。
以2.4%的无风险收益率计算,风险平价策略的夏普比率接近0.3,超过其余所有底层资产。
把这两点相结合,你就会发现这个风险平价组合很神奇。
收益不高,但够用,基本能替代信托,并大幅高于银行理财。
同时防守做的也不错,2015年、2020年都经历了,最大回撤也只有7%。
咱们把格局打开,这个表现,用来承接理财替代的需求也不是不行啊。
为什么高阶数据表现好,其实我们可以看一下组合对于每一类资产的权重分配。
债券的权重一直比较高,最高能有70%以上,最低也有30%左右。
毕竟这是一个基于风险平价的策略,债券资产的波动较小,所以权重更高也很正常。
反之,原油的权重贡献一直较小,理由跟上面一样,波动太大了。
其余资产,权重则相对平均。
债券打底做防守,各类资产提供弹性,资产配置层面类似于一个全球配置的固收+。
这种产品,摆到客户面前,宣传语我都想好了。
股债平衡、全球视野、大类资产配置,大师作品,量化赋能……
再也不用担心给客户推荐产品了。
最后,给大家贴一段最核心的代码,包括风险平价是怎么算的,以及权重是怎么在各资产之间平衡的。
如果大家看不懂,想要保姆级教程的,可以后台私信我进群。
def risk_parity_objective(weights, volatilities, covariance_matrix):
# 计算组合风险
portfolio_variance = np.dot(weights.T, np.dot(covariance_matrix, weights))
portfolio_volatility = np.sqrt(portfolio_variance)
# 计算每个资产的边际风险贡献
mrc = weights * volatilities / portfolio_volatility
# 返回风险相等,也就是各资产风险方差和最小
return np.var(mrc)
dict_outer = {}
for i in range(len(list_M_last_date) - 1 ):
start_date = list_M_last_date[i]
end_date = list_M_last_date[i + 1]
df1 = df_filled[df_filled.index
df1 = df1[df1.index > start_date]
df1 = df1 / df1.shift(1) - 1
df1.dropna(inplace = True)
standard_date = df1.index[-1]
#每天的涨跌幅数据
returns returns = np.array(df1.T)
#过去一段时间,每天的涨跌幅的,标准差
volatilities = np.std(returns, axis=1)
# 计算协方差矩阵
covariance_matrix = np.cov(returns)
# 计算资产数量 n_assets = len(volatilities)
# 初始化权重为等权重
weights = np.ones(n_assets) / n_assets
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
# 权重的边界,每个权重都在0和1之间
bounds = tuple((0, 1) for _ in range(n_assets))
# 优化过程 result = minimize(risk_parity_objective, weights, args=(volatilities, covariance_matrix),
method='SLSQP', bounds=bounds, constraints=constraints)
# 最优权重
optimal_weights = result.x
dict_inner = {key: value for key, value in zip(list_market_index, optimal_weights)}
dict_outer[standard_date] = dict_inner
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有