凸优化与分层风险平价在资产配置中的应用
立即解锁
发布时间: 2025-09-04 00:57:40 阅读量: 9 订阅数: 40 AIGC 

### 凸优化与分层风险平价在资产配置中的应用
在资产配置领域,寻找有效前沿和确定最优投资组合是关键问题。本文将介绍使用凸优化和分层风险平价(HRP)算法来解决这些问题的方法,并展示如何使用相关Python库实现这些方法。
#### 1. 使用CVXPY进行凸优化寻找有效前沿
在之前的方法中,我们使用SciPy库进行数值优化来寻找有效前沿,以最小化投资组合的波动率为目标。这里,我们将问题重新表述为风险厌恶框架,投资者希望最大化风险调整后的回报。
##### 1.1 问题重述
在风险厌恶框架下,目标是最大化以下表达式:
\[
\max_{\omega} \omega^T \mu - \gamma \omega^T \Sigma \omega
\]
约束条件为:
\[
\sum_{i=1}^{n} \omega_i = 1, \quad \omega_i \geq 0
\]
其中,$\omega$ 是资产权重向量,$\mu$ 是资产的平均回报率向量,$\Sigma$ 是资产回报率的协方差矩阵,$\gamma$ 是风险厌恶参数。$\gamma$ 值越高,投资者越厌恶风险。
##### 1.2 准备工作
在开始之前,需要运行之前使用蒙特卡罗模拟和SciPy优化寻找有效前沿的代码,以确保数据的一致性。
##### 1.3 具体步骤
以下是使用CVXPY进行凸优化寻找有效前沿的具体步骤:
1. **导入库**:
```python
import cvxpy as cp
```
2. **将年化平均回报率和协方差矩阵转换为NumPy数组**:
```python
avg_returns = avg_returns.values
cov_mat = cov_mat.values
```
3. **设置优化问题**:
```python
weights = cp.Variable(n_assets)
gamma_par = cp.Parameter(nonneg=True)
portf_rtn_cvx = avg_returns @ weights
portf_vol_cvx = cp.quad_form(weights, cov_mat)
objective_function = cp.Maximize(
portf_rtn_cvx - gamma_par * portf_vol_cvx
)
problem = cp.Problem(
objective_function,
[cp.sum(weights) == 1, weights >= 0]
)
```
4. **计算有效前沿**:
```python
N_POINTS = 25
portf_rtn_cvx_ef = []
portf_vol_cvx_ef = []
weights_ef = []
gamma_range = np.logspace(-3, 3, num=N_POINTS)
for gamma in gamma_range:
gamma_par.value = gamma
problem.solve()
portf_vol_cvx_ef.append(cp.sqrt(portf_vol_cvx).value)
portf_rtn_cvx_ef.append(portf_rtn_cvx.value)
weights_ef.append(weights.value)
```
5. **绘制不同风险厌恶参数下的资产配置**:
```python
weights_df = pd.DataFrame(weights_ef,
columns=ASSETS,
index=np.round(gamma_range, 3))
ax = weights_df.plot(kind="bar", stacked=True)
ax.set(title="Weights allocation per risk-aversion level",
xlabel=r"$\gamma$",
ylabel="weight")
ax.legend(bbox_to_anchor=(1,1))
```
从图中可以看出,当风险厌恶参数 $\gamma$ 非常小时,投资者会将100%的资源分配给特斯拉;随着风险厌恶程度的增加,对特斯拉的分配逐渐减少,更多的权重分配给微软和其他资产;当 $\gamma$ 达到一定值时,对特斯拉的分配为0%。
6. **绘制有效前沿和单个资产**:
```python
fig, ax = plt.subplots()
ax.plot(portf_vol_cvx_ef, portf_rtn_cvx_ef, "g-")
for asset_index in range(n_assets):
plt.scatter(x=np.sqrt(cov_mat[asset_index, asset_index]),
y=avg_returns[asset_index],
marker=MARKERS[asset_index],
label=ASSETS[asset_index],
s=150)
ax.set(title="Efficient Frontier",
xlabel="Volatility",
ylabel="Expected Returns")
ax.legend()
```
生成的有效前沿与使用蒙特卡罗模拟生成的前沿相似。之前我们发现仅由微软股票组成的投资组合非常接近有效前沿,现在我们可以说仅由特斯拉股票组成的投资组合也是如此。
##### 1.4 进一步分析
- **比较两种资产配置问题的结果**:可以绘制两种有效前沿进行比较,一种是通过最小化每个预期回报水平的波动率计算得到的,另一种是使用凸优化最大化风险调整后的回报得到的。
```python
x_lim = [0.2, 0.6]
y_lim = [0.4, 0.6]
fig, ax = plt.subplots(1, 2)
ax[0].plot(vols_range, rtns_range, "g-", linewidth=3)
ax[0].set(title="Efficient Frontier - Minimized Volatility",
xlabel="Volatility",
ylabel="Expected Returns",
xlim=x_lim,
ylim=y_lim)
ax[1].plot(portf_vol_cvx_ef, portf_rtn_cvx_ef, "g-", linewidth=3)
ax[1].set(title="Efficient Frontier - Maximized Risk-Adjusted Return",
xlabel="Volatility",
ylabel="Expected Returns",
```
0
0
复制全文
相关推荐










