资产组合配置python_复杂度



之前的文章主要阐述了投资组合资产配置的目标和一般理论,这一篇我们举几个例子具体操作一下。

总结一下上一篇的基本内容:

  • 投资组合构建和配置是按照层次进行的,资产配置在每一个层次都会展开
  • 假设每一个资产的回报/风险比例都是一样的
  • 估计资产的相关系数矩阵,作为投资组合优化输入,优化目标是最大化投资组合回报/风险比例。(其实是协方差矩阵,但是由于我们进行了波动率规则化,所以两个矩阵现在是一样的)
  • 优化得到 风险权重
  • 估计资产波动率,计算现金权重

下面我们举例说明计算过程。

层次1举例:股票、债券和替代品

这是我们的第一个层次,包含三个”虚拟产品”,这里的产品其实仅仅是三个分组。首先,我们假设这三个产品的回报风险比相等。然后,我们需要估计这三个产品的相关系数矩阵。但是,由于这个层次非常宏观,我们甚至可以直接估计风险权重,即略过优化过程。

这里我按照经验估计三种产品的相关系数矩阵,其中a为股票,b为债券,c为其他替代品。
a b c
a 1.0 -0.2 0.1
b -0.2 1.0 0.0
c 0.1 0.0 1.0

上面的相关系数矩阵意味着:股票类和债权类存在一定的负相关,和其他替代品存在一定的正相关(线性)。

进行一般的投资组合优化。这里我们采用以下Python包:


https://pyportfolioopt.readthedocs.io/en/latest/pyportfolioopt.readthedocs.io

tickers = ['a', 'b', 'c']
mu = pd.Series(index=tickers, data=[0.15, 0.08, 0.1])
# 假设回报/风险相等,规范化波动率为1,所以回报和波动率是相等的
vol = pd.Series(index=tickers, data=[0.15, 0.08, 0.1])
# 这里cov 其实 跟 corr 相等的
cov = pd.DataFrame(index=tickers, columns=tickers, data=np.array([[1 , -0.2  , 0.1],
                                                                  [-0.2 , 1 , 0],
                                                                  [0.1 , 0 , 1]]))

ef = EfficientFrontier(mu, cov, weight_bounds=(0, 1))
weights = ef.max_sharpe()
risk = ef.clean_weights()
# 风险权重: OrderedDict([('a', 0.47789), ('b', 0.29886), ('c', 0.22325)])


这里我们进行了最简单的优化,得到风险权重。下面我们需要对三个资产的波动率进行估计。同样由于宏观层面,我们可以简单估计。当然,当你完成所有层次的资产分配后,可以重新估计相关系数和波动率,反复迭代,直到收敛。(我的经验是,不需要这个过程。)

我们对波动率做如下估计:vol = pd.Series(index=tickers, data=[0.15, 0.08, 0.25])

然后计算现金权重:


s = risk / vol
cash = s / sum(s)
# 现金权重:
# a    0.348030
# b    0.408092
# c    0.243878


这样我们就得到了第一层的现金权重。

层次2举例:股票类

经过层次1配置,我们得到股票类现金权重34.8%,也即是说,如果我们有100元进行配置,配置34.8元购买股票类产品。

下面我们重复层次1的过程,假设股票类我们分成:发达国家、发展中国家和新兴国家三类。假设我们估计波动率相等,相关系数相等,我们就会得到一个相等的风险权重:`33.3%`

由于我们假设波动率相等,所以现金权重和风险权重也相等,即 33.3%。

但是这里是第二层,我们需要将这层的现金权重乘以该层自身的现金权重,得到最终的现金权重:0.33 * 0.348 = 0.115,即每一个资产配置11.5%的全部现金。

其他层次

其他平行层次和进一步的层次我们都是采用相同的手法进行配置,直到达到我们需要的粒度,比如股票或者ETF。

一点心得

我一直相信的是大道至简,投资组合这个事情尤其是。我们当然可以采用复杂的优化模型,可以尝试复杂的估计模型,但是不能忽略的是,模型本身也是风险,也是不稳定的,特别是金融模型。所以,我们的投资架构应该是简单、确保有效的,然后才是增加框架里的复杂度,而不是反过来。

另外就是,这个框架的目的是合理的配置资产,提高多样性,保证结构的合理,这里的资产不仅仅是股票、ETF,也可以是分组,也可以是某个策略。

我们在这里阐述过如何聚合信号:王哲:量化投资:信号聚合框架 ,聚合后的策略同样可以作为资产融合进我们的框架,进行合理配置。

当然,随着投资组合变得更加复杂,各种参数的估计需要更多的功夫。比如波动率、回报率、相关系数矩阵。