3. 风险因子识别:宏观经济因子、行业因子与个体因子的识别与筛选方法

在金融压力测试样本构建中,风险因子的识别与筛选是决定测试结果有效性的核心环节。风险因子需要覆盖宏观、中观、微观三个层次,确保压力情景能够全面传导至资产组合。本节将系统阐述三类因子的识别逻辑、筛选标准及实操方法。

3.1 风险因子三层架构

风险因子按照影响范围与传导路径,可划分为三个层级:

层级 因子类别 典型变量 数据频率 主要来源
宏观层 宏观经济因子 GDP增速、基准利率、汇率、失业率、CPI 季度/月度 国家统计局、央行、IMF
中观层 行业因子 行业景气指数、产能利用率、PPI、行业违约率 月度/季度 行业协会、Wind、国家统计局
微观层 个体因子 资产负债率、流动比率、信用评级、营收增长率 季度/年度 企业财报、评级机构、交易所
关键原则: 三层因子之间需满足“宏观驱动中观、中观传导微观”的因果链。筛选时优先保留与资产组合历史损失相关性显著、且在经济衰退期具有明确恶化路径的因子。

3.2 宏观经济因子的识别与筛选

宏观经济因子是压力测试的“第一推动力”。筛选步骤如下:

  1. 候选池构建: 收集 GDP、CPI、PPI、基准利率、短期利率、长期利率、汇率(有效汇率指数)、失业率、M2、社会融资规模等 10-15 个核心变量。
  2. 平稳性检验: 对每个变量进行 ADF 单位根检验,非平稳序列需取一阶差分或对数差分。
  3. 共线性诊断: 计算变量间相关系数矩阵,剔除 |r| > 0.85 的高度相关变量(如 M2 与社会融资规模通常只保留一个)。
  4. 经济意义筛选: 结合压力情景设计,优先保留在衰退期具有明确恶化方向且幅度可量化的因子(如 GDP 增速、失业率、基准利率)。
  5. 滞后阶数确定: 通过 AIC/BIC 准则确定因子对资产损失的最优滞后阶数(通常 1-4 个季度)。
实操建议: 对于银行信贷组合,建议至少保留 GDP 增速、基准利率、失业率三个核心宏观因子。这三个因子在巴塞尔委员会的压力测试指引中被列为“最低要求”。

3.3 行业因子的识别与筛选

行业因子起到承上启下的作用,将宏观冲击转化为特定行业的风险暴露。筛选方法包括:

  • 行业敏感性分析: 计算各行业营收/利润对 GDP 增速的弹性系数,弹性绝对值 > 1.5 的行业为高敏感行业(如房地产、钢铁、汽车)。
  • 行业景气指数: 优先采用官方发布的行业景气指数(如 PMI 分行业指数),确保数据连续性和可比性。
  • 行业集中度: 对于资产组合中占比超过 5% 的行业,必须纳入对应的行业因子。
  • 行业违约率历史: 收集各行业过去 3-5 个经济周期的违约率数据,筛选与宏观因子同步性强的行业变量。
行业 GDP弹性系数 景气指数来源 建议纳入压力测试
房地产 2.1 国房景气指数 是
钢铁 1.8 中钢协景气指数 是
医药 0.6 医药工业景气指数 可选
食品饮料 0.4 消费品景气指数 可选

3.4 个体因子的识别与筛选

个体因子反映单一借款人或发行人的信用质量,是压力测试样本构建的最终落脚点。筛选流程如下:

  1. 财务指标初筛: 从资产负债率、流动比率、速动比率、利息保障倍数、ROA、营收增长率、经营性现金流/总负债等 20+ 个指标中,通过单变量分析保留与违约状态显著相关的指标(t 检验 p < 0.05)。
  2. 多变量降维: 使用主成分分析(PCA)或 LASSO 回归,将高维财务指标压缩至 3-5 个综合因子。
  3. 非财务因子补充: 加入信用评级(外部评级或内部评分)、企业规模(总资产对数)、所有制性质、上市状态等定性/定量变量。
  4. 因子稳定性检验: 将样本按时间分为训练期和验证期,确保筛选出的因子在两个时期均保持显著。
常见陷阱: 个体因子筛选时容易过度拟合历史数据。建议采用交叉验证(5-fold CV)控制模型复杂度,并避免使用未来信息(如使用 t 期的财务指标预测 t 期的违约)。

3.5 因子筛选的统计与机器学习方法

以下表格总结了常用的因子筛选技术及其适用场景:

方法 类型 适用场景 输出形式 注意事项
Pearson/Spearman 相关 统计 初步共线性诊断 相关系数矩阵 仅捕捉线性关系
LASSO 回归 统计+ML 高维因子压缩 非零系数因子集 需调优 λ 参数
随机森林特征重要性 ML 非线性关系识别 重要性排序 可解释性较弱
逐步回归(AIC/BIC) 统计 中等维度因子选择 最优子集 易过拟合,需交叉验证
主成分分析(PCA) 统计 降维且保留方差 主成分得分 主成分经济含义模糊

3.6 风险因子筛选流程总图

下图展示了从宏观到个体的完整因子筛选流程,以及各环节的输入输出关系:

风险因子三层筛选流程 风险因子三层筛选流程 宏观因子候选池 平稳性检验 + 共线性诊断 核心宏观因子 (GDP/利率/失业率) 行业因子候选池 敏感性分析 + 景气指数 高敏感行业因子 (弹性>1.5) 个体因子候选池 单变量筛选 + PCA/LASSO 核心个体因子 (3-5个综合因子) 传导 传导 压力测试样本因子集 宏观(3-5) + 行业(2-4) + 个体(3-5) = 8-14个核心因子 筛选要点说明: 1. 每层因子数量控制在 3-5 个,避免维度灾难 2. 优先保留经济含义明确、历史数据长度 > 10 年的因子 3. 最终因子集需通过压力情景合理性检验(极端值不超出历史 3 倍标准差)

3.7 因子筛选的代码实现示例

以下 Python 代码展示了使用 LASSO 回归进行因子筛选的典型流程:

import pandas as pd
import numpy as np
from sklearn.linear_model import LassoCV
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 加载数据:假设 df 包含宏观、行业、个体因子及违约标签
# df 列:'GDP_growth', 'interest_rate', 'unemployment', 'industry_index', 
#        'debt_ratio', 'current_ratio', 'rating_score', 'default_flag'

# 分离特征和目标
X = df.drop('default_flag', axis=1)
y = df['default_flag']

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.3, random_state=42
)

# LASSO 交叉验证选择最优 lambda
lasso = LassoCV(cv=5, random_state=42, max_iter=10000)
lasso.fit(X_train, y_train)

# 输出非零系数对应的因子
selected_features = X.columns[lasso.coef_ != 0]
print("筛选出的因子:", selected_features.tolist())

# 输出各因子系数
coef_df = pd.DataFrame({
    'feature': X.columns,
    'coefficient': lasso.coef_
})
print(coef_df[coef_df['coefficient'] != 0])
代码说明: LassoCV 自动通过 5 折交叉验证选择最优正则化参数 λ,将不重要的因子系数压缩至零。输出结果中非零系数的因子即为最终保留的风险因子。建议结合业务逻辑人工复核,剔除系数符号与经济直觉相反的因子。

3.8 因子筛选后的验证与校准

完成因子筛选后,需进行以下验证:

  • 回测验证: 使用历史压力事件(如 2008 年金融危机、2020 年疫情)检验因子集能否正确驱动资产损失。
  • 敏感性分析: 对每个因子施加 ±2 个标准差冲击,观察资产损失的变化方向与幅度是否符合预期。
  • 稳定性检验: 滚动窗口(如 3 年窗口、步长 1 年)重新筛选因子,确保核心因子在不同时间段保持稳定。
  • 专家校准: 邀请业务专家对因子集进行评审,确认遗漏的关键变量(如政策变量、地缘政治风险)。
重要提醒: 因子筛选不是一次性工作。随着经济结构变化和资产组合调整,建议每 1-2 年重新评估一次因子集,确保压力测试样本始终反映当前风险环境。