资产配置:寻找有效前沿的方法
立即解锁
发布时间: 2025-09-01 00:33:35 阅读量: 10 订阅数: 32 AIGC 

### 资产配置:寻找有效前沿的方法
#### 1. 扩展 pandas 方法计算指标
通过 `qs.extend_pandas()` 扩展后,可直接从包含回报序列的 DataFrame 访问相关方法。例如,使用以下代码快速计算夏普比率和索提诺比率:
```python
print(f"Sharpe ratio: {portfolio_returns.sharpe():.2f}")
print(f"Sortino ratio: {portfolio_returns.sortino():.2f}")
```
输出结果如下:
```plaintext
Sharpe ratio: 1.36
Sortino ratio: 1.96
```
这些值与之前使用 `qs.reports.metrics` 函数计算的结果相匹配。若要获取可用方法的完整列表,可运行以下代码:
```python
[method for method in dir(qs.stats) if method[0] != "_"]
```
#### 2. 使用蒙特卡罗模拟寻找有效前沿
根据现代投资组合理论,有效前沿是风险 - 回报谱中的一组最优投资组合。这些组合具有以下特点:
- 对于给定的风险水平,提供最高的预期回报。
- 对于给定的预期回报水平,提供最低的风险(波动率)。
位于有效前沿曲线下方的所有投资组合都被认为是次优的,因此最好选择前沿上的组合。
##### 2.1 操作步骤
以下是使用蒙特卡罗模拟寻找有效前沿的具体步骤:
1. **导入库**:
```python
import yfinance as yf
import numpy as np
import pandas as pd
```
2. **设置参数**:
```python
N_PORTFOLIOS = 10 ** 5
N_DAYS = 252
ASSETS = ["META", "TSLA", "TWTR", "MSFT"]
ASSETS.sort()
n_assets = len(ASSETS)
```
3. **从雅虎财经下载股票价格**:
```python
prices_df = yf.download(ASSETS,
start="2021-01-01",
end="2021-12-31",
adjusted=True)
```
4. **计算年化平均回报和相应的标准差**:
```python
returns_df = prices_df["Adj Close"].pct_change().dropna()
avg_returns = returns_df.mean() * N_DAYS
cov_mat = returns_df.cov() * N_DAYS
```
5. **模拟随机投资组合权重**:
```python
np.random.seed(42)
weights = np.random.random(size=(N_PORTFOLIOS, n_assets))
weights /= np.sum(weights, axis=1)[:, np.newaxis]
```
6. **计算投资组合指标**:
```python
portf_rtns = np.dot(weights, avg_returns)
portf_vol = []
for i in range(0, len(weights)):
vol = np.sqrt(
np.dot(weights[i].T, np.dot(cov_mat, weights[i]))
)
portf_vol.append(vol)
portf_vol = np.array(portf_vol)
portf_sharpe_ratio = portf_rtns / portf_vol
```
7. **创建包含所有数据的 DataFrame**:
```python
portf_results_df = pd.DataFrame(
{"returns": portf_rtns,
"volatility": portf_vol,
"sharpe_ratio": portf_sharpe_ratio}
)
```
8. **定位构成有效前沿的点**:
```python
N_POINTS = 100
ef_rtn_list = []
ef_vol_list = []
possible_ef_rtns = np.linspace(portf_results_df["returns"].min(),
portf_results_df["returns"].max(),
N_POINTS)
possible_ef_rtns = np.round(possible_ef_rtns, 2)
portf_rtns = np.round(portf_rtns, 2)
for rtn in possible_ef_rtns:
if rtn in portf_rtns:
ef_rtn_list.append(rtn)
matched_ind = np.where(portf_rtns == rtn)
ef_vol_list.append(np.min(portf_vol[matched_ind]))
```
9. **绘制有效前沿**:
```python
import matplotlib.pyplot as plt
MARKERS = ["o", "X", "d", "*"]
fig, ax = plt.subplots()
portf_results_df.plot(kind="scatter", x="volatility",
y="returns", c="sharpe_ratio",
cmap="RdYlGn", edgecolors="black",
ax=ax)
ax.set(xlabel="Volatility",
ylabel="Expected Returns",
title="Efficient Frontier")
ax.plot(ef_vol_list, ef_rtn_list, "b--")
for asset_index in range(n_assets):
ax.scatter(x=np.sqrt(cov_mat.iloc[asset_index, asset_index]),
y=avg_returns[asset_index],
marker=MARKERS[asset_index],
s=150, color="black",
label=ASSETS[asset_index])
ax.legend()
plt.show()
```
##### 2.2 结果分析
运行上述代码会生成一个包含所有随机创建的投资组合、四个代表单个资产的点以及有效前沿的图表。从分析有效前沿中可以得出以下见解:
- 有效前沿线左侧的任何点都是无法实现的,因为在这样的波动率水平下无法获得相应的预期回报。
- 仅由微软股票组成的投资组合的表现非常接近有效前沿。
理想情况下,应寻找提供卓越回报且组合标准差低于单个资产标准差的投资组合。
##### 2.3 寻找最大夏普比率和最小波动率组合
模拟 100,000 个随机投资组合后,可使用 `np.argmin` 和 `np.argmax` 函数找出具有最高夏普比率(最大单位风险预期回报,即切点组合)或最小波动率的组合。代码如下:
```python
max_sharpe_ind = np.argmax(portf_results_df["sharpe_ratio"])
max_sharpe_portf = portf_results_df.loc[max_sharpe_ind]
min_vol_ind = np.argmin(portf_results_df["vola
```
0
0
复制全文
相关推荐









