/ / /
第25讲:持仓集中度风险 (Position Concentration Risk)
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

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

💡

查看全集:💎Quantopia量化分析56讲

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

1.1 直觉理解

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

1.2 赌博模拟示例

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}")

关键输出

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

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

2.1 资产相关性影响

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}

其中:

特殊情况:

2.1 分散化效果模拟

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 真实股票组合分析

# 获取不同行业股票数据
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只不同行业股票数据,计算其相关系数矩阵
  1. 模拟一个包含20只假想资产的组合,比较相关系数从0到0.9时的波动率变化
  1. 计算等权重投资SP500成分股的理论最低波动率(假设所有股票完全不相关)

关键结论

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

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

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

3.1 理论边界条件

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

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

其中:

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

关键推论

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 实践中的风险放大器

隐性相关结构

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

# 分析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))

流动性黑洞效应

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

# 比较大盘股与小盘股流动性指标
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 数学证明

假设新增资产满足:

ρnew>1+i=1nj=1nρijn(n+1)\rho_{new} > \frac{1 + \sum_{i=1}^n \sum_{j=1}^n \rho_{ij}}{n(n+1)}

组合波动率变化推导过程:

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

σ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}

第二步,对权重求导:

σp+1ww=0>0\frac{\partial \sigma_{p+1}}{\partial w} \bigg|_{w=0} > 0

第三步,判断条件:

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

其中:

3.4 案例分析

情景设定

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:

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

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只公用事业股,计算组内与跨组相关系数
  1. 模拟当组合从20只扩展到100只资产时,假设每新增10只资产相关系数提高0.1,绘制波动率变化曲线
  1. 计算包含n只资产组合的理论最大允许平均相关系数,使得继续分散仍能降低风险

附:练习合集