2. 人群切片概念:什么是人群切片、切片维度与复盘应用
在金融风控与量化投资组合管理中,人群切片(Cohort Slicing / Segment Slicing)是指将投资者或交易账户按照特定属性维度划分为若干同质子群体,并在每个子群体内部独立进行风险归因与绩效复盘。切片的核心假设是:不同人群的风险驱动因子、行为模式、收益来源存在显著差异,只有通过切片才能避免“平均化谬误”,精准定位风险暴露。
2.1 什么是人群切片
人群切片不是简单的分组统计,而是一种结构化复盘方法论。它要求分析者先定义切片维度,再对每个切片独立计算风险指标(如波动率、最大回撤、VaR、边际贡献),最后通过切片间的横向对比发现异常风险集中点。
核心公式(切片内风险贡献):
其中
RCi,s = wi,s × βi,s × σs其中
RCi,s 为切片 s 中资产 i 的风险贡献,wi,s 为权重,βi,s 为切片内 beta,σs 为切片组合波动率。
切片粒度决定了归因精度:切片过粗会掩盖子群体异质性,切片过细则导致样本量不足、统计显著性下降。实践中通常采用三级粒度:
| 粒度级别 | 切片数量 | 适用场景 | 风险 |
|---|---|---|---|
| 粗粒度 | 2–5 | 管理层概览、周报 | 可能遗漏尾部风险 |
| 中粒度 | 6–15 | 月度归因、因子暴露分析 | 需注意样本量阈值 |
| 细粒度 | 16–50 | 专项风控、异常交易排查 | 多重比较偏差 |
2.2 核心切片维度
实践中常用的切片维度可分为静态属性与动态行为两大类。静态维度在切片周期内不变,动态维度随交易行为变化。以下为最核心的五个维度:
- 年龄(Age Cohort):通常按 25–35、35–45、45–60、60+ 分组。不同年龄段的投资期限、收入稳定性、风险承受能力差异显著。
- 资产规模(Asset Tier):按可投资资产分为 0–50 万、50–200 万、200–1000 万、1000 万+。资产规模直接影响组合分散化程度和杠杆使用。
- 风险偏好(Risk Profile):通过问卷或历史行为映射为保守、稳健、进取、激进。风险偏好是因子暴露(如价值、动量、低波)的最强预测变量。
- 交易频率(Turnover Bucket):低频(月均 < 3 次)、中频(3–15 次)、高频(> 15 次)。高频群体更容易受交易成本与短期动量因子影响。
- 持仓集中度(Concentration Level):前 3 大持仓占比 < 30%、30%–60%、> 60%。集中度高的切片尾部风险显著放大。
维度选择原则:优先选择与风险因子有明确因果关系的维度,而非所有可用字段。例如“性别”在多数组合中不显著,而“持仓集中度”直接驱动尾部风险。
2.3 切片在复盘中的应用场景
人群切片在组合风险归因复盘中有四个典型应用场景,每个场景对应不同的切片策略与输出指标:
| 场景 | 切片维度 | 核心指标 | 典型发现 |
|---|---|---|---|
| 1. 风险集中度排查 | 持仓集中度 × 资产规模 | 切片 VaR、边际贡献 | 高集中度 + 小资产切片 VaR 超阈值 2 倍 |
| 2. 因子暴露异质性 | 风险偏好 × 年龄 | 因子载荷、因子贡献占比 | 年轻进取组动量因子暴露是保守组的 3 倍 |
| 3. 交易成本归因 | 交易频率 × 资产规模 | 交易成本占比、滑点比率 | 高频小资产组交易成本吞噬 40% 收益 |
| 4. 回撤归因与预警 | 年龄 × 风险偏好 | 最大回撤、回撤恢复天数 | 老年保守组回撤恢复天数比均值长 60% |
2.4 切片复盘的常见陷阱与规避
⚠ 陷阱 1:幸存者偏差切片
只对存续账户切片,忽略已清仓或爆仓账户,导致风险低估。规避方法:切片前必须包含全量历史账户,对已关闭账户单独标记为“终止切片”。
只对存续账户切片,忽略已清仓或爆仓账户,导致风险低估。规避方法:切片前必须包含全量历史账户,对已关闭账户单独标记为“终止切片”。
⚠ 陷阱 2:多重比较谬误
同时对比 20 个切片时,即使无真实差异,也会出现 1 个切片显著偏离(p=0.05)。规避方法:使用 Bonferroni 校正或 FDR 控制,或先做全局 F 检验再进入切片对比。
同时对比 20 个切片时,即使无真实差异,也会出现 1 个切片显著偏离(p=0.05)。规避方法:使用 Bonferroni 校正或 FDR 控制,或先做全局 F 检验再进入切片对比。
⚠ 陷阱 3:切片内样本量不足
细粒度切片可能只有 10–30 个账户,VaR 估计方差极大。规避方法:设定最小样本量阈值(如 ≥ 50),低于阈值的切片合并到相邻切片。
细粒度切片可能只有 10–30 个账户,VaR 估计方差极大。规避方法:设定最小样本量阈值(如 ≥ 50),低于阈值的切片合并到相邻切片。
2.5 切片归因的代码实现框架
以下为 Python 伪代码框架,展示如何对人群切片进行风险归因计算:
import pandas as pd
import numpy as np
def slice_risk_attribution(portfolio_df, slice_col, risk_metric='VaR_95'):
"""
对组合按 slice_col 切片,计算每个切片的风险指标与边际贡献。
Parameters
----------
portfolio_df : DataFrame
必须包含列: ['account_id', 'asset_id', 'weight', 'return', slice_col]
slice_col : str
切片维度列名,如 'age_group'
risk_metric : str
风险指标,支持 'VaR_95', 'VaR_99', 'std', 'max_drawdown'
Returns
-------
result_df : DataFrame
每个切片的风险指标与边际贡献
"""
slices = portfolio_df[slice_col].unique()
results = []
for s in slices:
mask = portfolio_df[slice_col] == s
slice_df = portfolio_df[mask].copy()
# 计算切片内组合权重与收益率
weights = slice_df.groupby('asset_id')['weight'].sum().values
returns = slice_df.groupby('asset_id')['return'].mean().values
# 计算切片组合波动率与 VaR
cov_matrix = np.cov(returns) # 简化示例
portfolio_vol = np.sqrt(weights.T @ cov_matrix @ weights)
if risk_metric == 'VaR_95':
risk_value = 1.65 * portfolio_vol
elif risk_metric == 'VaR_99':
risk_value = 2.33 * portfolio_vol
elif risk_metric == 'std':
risk_value = portfolio_vol
else:
raise ValueError(f"Unknown risk_metric: {risk_metric}")
# 边际风险贡献
marginal_contrib = (cov_matrix @ weights) / portfolio_vol
component_contrib = weights * marginal_contrib
results.append({
'slice': s,
'risk_value': risk_value,
'n_accounts': slice_df['account_id'].nunique(),
'top3_asset_contrib': sorted(component_contrib, reverse=True)[:3]
})
return pd.DataFrame(results)
生产环境注意:上述代码为教学简化版。实际生产需处理协方差矩阵奇异、缺失收益率、多空权重、杠杆调整等细节。建议使用
riskfolio-lib 或 pyportfolioopt 等成熟库。