如何优雅地给客户推荐基金

如何优雅地给客户推荐基金
2024年09月11日 17:53 ETF令狐冲

在当下这个特殊时期,推荐基金时,大家一定要注意三个原则。

第一,主推被动基金,亏了就是市场的问题。

第二,主打资产配置,尽可能帮助客户分散风险,当然主要还是帮客户分散未来可能的不满情绪。

第三,一定要有理论依据,最好有投资大师背书,亏钱了,可能是市场的问题,可能是碰到小概率事件了,但一定不是我的问题,因为我就是一个抄作业的。

对于前两点,我相信大部分人都已经被市场教育过了,越来越重视被动投资,和资产配置风险分散了。

但是呢,对于这第三点,相信很多朋友还是摸不到头脑。

比如,你推荐了一个沪深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

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部