跳到主内容
研究主线组合风险基础 · 第24–26讲2/3模块导览 →
讲义

第25讲:持仓集中度风险 (Position Concentration Risk)

从相关性和边际风险条件解释集中与分散,模拟资产数量变化,并讨论流动性、行业聚集和管理成本。

完成状态保存在当前浏览器,可随时取消。

一、核心概念:分散投资降低风险#

1.1 直觉理解#

假设你在21点游戏中拥有1%的优势,若将所有资金押注在一局游戏,尽管胜率51%,但仍有49%概率血本无归。通过将资金分散到100局独立游戏中,虽然期望收益相同,但总收益的波动性(风险)会大幅降低。

1.2 赌博模拟示例#

code
import numpy as np
import matplotlib.pyplot as plt

# 模拟1000次单局赌博
universes = 1000
single_bet = np.random.binomial(n=1, p=0.51, size=universes)
print(f"单局均值:{np.mean(single_bet):.2f}, 标准差:{np.std(single_bet):.2f}")

# 模拟100次分散赌博
diversified = np.random.binomial(n=100, p=0.51, size=universes)
print(f"百局均值:{np.mean(diversified):.2f}, 标准差:{np.std(diversified):.2f}")

关键输出

code
单局均值:0.51, 标准差:0.50
百局均值:51.00, 标准差:5.00

二、投资组合的波动性分析#

2.1 资产相关性影响#

code
import yfinance as yf

# 获取科技股与能源股数据
tech = yf.download(['AAPL', 'MSFT', 'GOOG'], start='2020-01-01', end='2023-01-01')['Close']
energy = yf.download(['XOM', 'CVX'], start='2020-01-01', end='2023-01-01')['Close']

# 计算相关系数矩阵
tech_returns = tech.pct_change().corr()
energy_returns = energy.pct_change().corr()
print("科技股相关系数:\n", tech_returns)
print("\n能源股相关系数:\n", energy_returns)

2.2 组合波动公式#

投资组合方差公式:

σp2=i=1nwi2σi2+ijwiwjσiσjρij\sigma_p^2 = \sum_{i=1}^n w_i^2\sigma_i^2 + \sum_{i\neq j}w_iw_j\sigma_i\sigma_j\rho_{ij}

其中:

  • σp2\sigma_p^2 为投资组合方差

  • wiw_iwjw_j 为资产权重

  • σi\sigma_iσj\sigma_j 为个别资产的标准差

  • ρij\rho_{ij} 为资产i和j之间的相关系数

  • n 为资产数量

特殊情况:

  • ρ\rho = 1 时,表示资产完全正相关,组合风险等于加权平均风险

  • ρ\rho = 0 时,表示资产不相关,组合风险随资产数量增加而降低

2.1 分散化效果模拟#

code
def simulate_portfolio(n_assets, correlation):
    np.random.seed(42)
    means = [1.01] * n_assets
    cov = (0.03**2) * (np.eye(n_assets)*1 + np.ones((n_assets,n_assets))*(correlation -1)/n_assets)

    returns = np.random.multivariate_normal(means, cov, 252)
    portfolio = returns.mean(axis=1)
    return portfolio.std()

print(f"10只不相关资产波动率: {simulate_portfolio(10, 0):.4f}")
print(f"10只相关资产波动率: {simulate_portfolio(10, 0.8):.4f}")

2.2 真实股票组合分析#

code
# 获取不同行业股票数据
stocks = yf.download(['AAPL', 'XOM', 'JPM', 'WMT'], start='2020-01-01', end='2023-01-01')['Close']
returns = stocks.pct_change().dropna()

# 计算组合波动性
weights = np.array([0.25]*4)
cov_matrix = returns.cov() * 252  # 年化协方差
portfolio_vol = np.sqrt(weights.T @ cov_matrix @ weights)
print(f"四行业组合年化波动率: {portfolio_vol:.2%}")

练习题#

  1. 使用yfinance下载5只不同行业股票数据,计算其相关系数矩阵

  2. 模拟一个包含20只假想资产的组合,比较相关系数从0到0.9时的波动率变化

  3. 计算等权重投资SP500成分股的理论最低波动率(假设所有股票完全不相关)

关键结论#

  • 组合风险随资产数量增加呈1/n​衰减

  • 行业分散可使相关系数降低至0.2-0.5区间

  • 实际组合构建需平衡交易成本与分散收益

注意:实际投资需考虑交易成本、流动性等因素,理论模型需结合市场微观结构分析

三、悖论——(过度)分散持仓也会升高风险#

重要提醒:真正的风险分散需要底层逻辑的多样性,而非简单增加资产数量

3.1 理论边界条件#

根据马科维茨投资组合理论,组合波动率随资产数量增加呈渐进式下降:

limnσp=ρˉσˉ\lim_{n \to \infty} \sigma_p = \sqrt{\bar{\rho}} \cdot \bar{\sigma}

其中:

  • ρˉ\bar{\rho}表示资产间平均相关系数

  • σˉ\bar{\sigma}表示资产平均波动率

这个公式说明组合的极限波动率由两个关键因素决定:平均相关系数的平方根与平均波动率的乘积。

关键推论

  • 当资产间存在正相关性时,波动率存在下限

  • 若新增资产相关系数持续升高,可能出现风险反弹

code
def diversification_paradox(n_max=100, base_rho=0.3):
    """ 展示相关系数变化时的分散化效果 """
    n_assets = np.arange(2, n_max)
    vol_list = []

    for n in n_assets:
        # 每增加5个资产,平均相关系数上升0.02
        rho = base_rho + (n//5)*0.02
        vol = np.sqrt( (1 + rho*(n-1))/n ) * 0.2
        vol_list.append(vol)

    plt.plot(n_assets, vol_list)
    plt.xlabel('Number of Assets'); plt.ylabel('Portfolio Volatility')
    plt.title('Diversification Paradox Simulation')
    plt.show()

diversification_paradox(n_max=50, base_rho=0.2)

3.2 实践中的风险放大器#

隐性相关结构#

当组合包含看似分散实则关联的资产时:

code
# 分析FAANG股票与云计算ETF的相关性
tech = yf.download(['META', 'AMZN', 'NFLX', 'GOOG', 'MSFT', 'SNOW', 'DDOG'],
                   start='2020-01-01', end='2023-01-01')['Adj Close']
corr_matrix = tech.pct_change().corr()
print("科技股隐性相关系数矩阵:\n", corr_matrix.round(2))

流动性黑洞效应#

分散投资小盘股的潜在风险:

code
# 比较大盘股与小盘股流动性指标
def calculate_liquidity(symbols):
    data = yf.download(symbols, start='2023-01-01', end='2023-06-01')
    return data['Volume'].mean(axis=0).sort_values()

large_cap = calculate_liquidity(['AAPL', 'MSFT', 'GOOG'])
small_cap = calculate_liquidity(['FIZZ', 'KNSA', 'RDNT'])
print("大盘股日均成交量:\n", large_cap)
print("\n小盘股日均成交量:\n", small_cap)

3.3 边际风险条件#

令新资产权重为 ww,其余 1w1-w 保持原组合内部的相对权重不变。组合方差为:

第一步,新组合波动率表达式:

σp+12=(1w)2σp2+w2σn+12+2w(1w)ρnewσpσn+1\sigma_{p+1}^2 = (1-w)^2\sigma_p^2 + w^2\sigma_{n+1}^2 + 2w(1-w)\rho_{new}\sigma_p\sigma_{n+1}

w=0w=0 处对方差求导:

σp+12ww=0=2σp2+2ρnewσpσn+1\frac{\partial \sigma_{p+1}^2}{\partial w} \bigg|_{w=0} = -2\sigma_p^2 + 2\rho_{new}\sigma_p\sigma_{n+1}

因此,新增一小部分资产会立即提高组合风险,当且仅当:

ρnew>σpσn+1\rho_{new} > \frac{\sigma_p}{\sigma_{n+1}}

其中:

  • ρnew\rho_{new} 是新增资产收益与原组合收益的相关系数

  • n 是原有资产数量

  • σp\sigma_p 是原有组合波动率

  • σn+1\sigma_{n+1} 是新增资产波动率

  • w 是新增资产权重

3.4 案例分析#

情景设定

  • 初始组合:10只不同行业蓝筹股

  • 相关系数矩阵:平均ρ=0.25

  • 新增资产:每次添加5只同行业股票

code
def risk_acceleration_test():
    np.random.seed(42)
    base_assets = 10
    added_groups = 4
    results = []

    current_rho = 0.25
    for _ in range(added_groups):
        # 每次添加资产使平均相关系数上升
        current_rho += 0.15
        n = base_assets + 5*(_+1)
        vol = np.sqrt( (1 + current_rho*(n-1))/n ) * 0.18
        results.append(vol)

    plt.plot(range(added_groups), results, marker='o')
    plt.xticks(range(added_groups), ['+5 Tech','+5 Fin','+5 Energy','+5 Retail'])
    plt.ylabel('Portfolio Volatility'); plt.title('Industry Concentration Risk')
    plt.show()

risk_acceleration_test()

3.5 平衡策略#

黄金分割法则

n=argminn(0.4n+0.003n)n^* = \arg\min_n \left( \frac{0.4}{\sqrt{n}} + 0.003n \right)

关于n求最优解,需要对方程求导并令其等于0:

  • 0.4n\frac{0.4}{\sqrt{n}} 表示分散化收益项

  • 0.003n0.003n 表示管理成本项

这是一个权衡最优资产数量的数学表达式,其中包含了分散化带来的边际收益递减和管理成本线性增加两个因素。

code
n = np.arange(20, 100)
cost = 0.4/np.sqrt(n) + 0.003*n
plt.plot(n, cost)
plt.xlabel('Number of Assets'); plt.ylabel('Combined Cost')
plt.vlines(x=45, ymin=0, ymax=0.25, colors='r', linestyles='dashed')
plt.show()

练习题#

  1. 下载10只科技股和5只公用事业股,计算组内与跨组相关系数

  2. 模拟当组合从20只扩展到100只资产时,假设每新增10只资产相关系数提高0.1,绘制波动率变化曲线

  3. 计算包含n只资产组合的理论最大允许平均相关系数,使得继续分散仍能降低风险