案例:双均线策略的改进
原始策略:
# 简单双均线策略
if fast_ma > slow_ma:
buy(100%) # 满仓买入
elif fast_ma < slow_ma:
sell(100%) # 满仓卖出
改进后策略:
# 加入风险管理的双均线策略
if fast_ma > slow_ma:
# 波动率调整仓位
position_size = target_vol / current_vol
position_size = min(position_size, 0.5) # 最大50%仓位
buy(position_size)
# 设置止损
stop_loss = entry_price * 0.95 # 5%止损
elif fast_ma < slow_ma:
sell(100%)
改进与效果:
7.2 绩效评估指标体系Performance Metrics |
|
定义:衡量每单位总风险所获得的超额收益
其中
解读标准:
| Sharpe Ratio | 评价 |
|---|---|
| < 0 | 差(不及无风险收益) |
| 0 - 0.5 | 一般 |
| 0.5 - 1.0 | 良好 |
| 1.0 - 2.0 | 优秀 |
| > 2.0 | 非常优秀 |
局限性:假设收益率正态分布,惩罚上行波动
import numpy as np
import pandas as pd
def calculate_sharpe_ratio(returns, risk_free_rate=0.03,
trading_days=252):
"""
计算年化夏普比率
Parameters:
returns: 日收益率Series或数组
risk_free_rate: 年化无风险利率
trading_days: 年化交易天数
Returns:
年化夏普比率
"""
# 超额收益
excess_returns = returns - risk_free_rate / trading_days
# 年化
annual_return = np.mean(excess_returns) * trading_days
annual_vol = np.std(excess_returns, ddof=1) * np.sqrt(trading_days)
sharpe = annual_return / annual_vol
return sharpe
# 示例使用
np.random.seed(42)
daily_returns = np.random.normal(0.001, 0.02, 1000)
sr = calculate_sharpe_ratio(daily_returns)
print(f"年化夏普比率: {sr:.4f}")
定义:仅考虑下行波动率,区分"好"波动与"坏"波动
其中
与夏普比率的区别:
| 指标 | 分母 | 惩罚对象 | 适用场景 |
|---|---|---|---|
| 夏普比率 | 总波动率 | 所有波动 | 对称收益分布 |
| 索提诺比率 | 下行波动率 | 仅负收益波动 | 偏态收益、期权策略 |
def calculate_sortino_ratio(returns, risk_free_rate=0.03,
trading_days=252):
"""计算索提诺比率"""
excess_returns = returns - risk_free_rate / trading_days
annual_return = np.mean(excess_returns) * trading_days
# 仅计算下行波动率
downside = excess_returns[excess_returns < 0]
downside_vol = np.std(downside, ddof=1) * np.sqrt(trading_days)
sortino = annual_return / downside_vol
return sortino
sortino = calculate_sortino_ratio(daily_returns)
print(f"索提诺比率: {sortino:.4f}")
最大回撤 (Maximum Drawdown, MDD):
卡玛比率:
def calculate_max_drawdown(price_series):
"""计算最大回撤"""
rolling_max = np.maximum.accumulate(price_series)
drawdown = (price_series - rolling_max) / rolling_max
max_dd = drawdown.min()
return max_dd, drawdown
def calculate_calmar_ratio(returns, price_series,
risk_free_rate=0.03, trading_days=252):
"""计算卡玛比率"""
annual_return = np.mean(returns - risk_free_rate / trading_days) * trading_days
max_dd, _ = calculate_max_drawdown(price_series)
calmar = annual_return / abs(max_dd)
return calmar, max_dd
# 示例
price = 100 * np.exp(np.cumsum(daily_returns))
calmar, mdd = calculate_calmar_ratio(daily_returns, price)
print(f"最大回撤: {mdd:.2%}")
print(f"卡玛比率: {calmar:.4f}")
定义:衡量相对于基准的超额收益与跟踪误差的比值
其中
应用场景:
def calculate_information_ratio(strategy_returns, benchmark_returns,
trading_days=252):
"""计算信息比率"""
# 超额收益
excess = strategy_returns - benchmark_returns
# 年化
annual_excess = np.mean(excess) * trading_days
tracking_error = np.std(excess, ddof=1) * np.sqrt(trading_days)
ir = annual_excess / tracking_error
return ir, annual_excess, tracking_error
# 模拟策略 vs 基准
benchmark_returns = np.random.normal(0.0008, 0.015, 1000)
strategy_returns = benchmark_returns + np.random.normal(0.0003, 0.005, 1000)
ir, alpha, te = calculate_information_ratio(strategy_returns, benchmark_returns)
print(f"信息比率: {ir:.4f}")
print(f"年化超额: {alpha:.2%}, 跟踪误差: {te:.2%}")
| 指标 | 风险度量 | 适用策略类型 | 优点 | 局限性 |
|---|---|---|---|---|
| 夏普比率 | 总波动率 | 一般投资策略 | 使用广泛,直观 | 假设正态分布 |
| 索提诺比率 | 下行波动率 | 期权/非对称策略 | 区分波动方向 | 数据需求大 |
| 卡玛比率 | 最大回撤 | CTA/趋势策略 | 关注极端损失 | 对回撤期敏感 |
| 信息比率 | 跟踪误差 | 相对收益策略 | 衡量选股能力 | 基准选择敏感 |
实践建议:
7.3 风险度量方法Risk Measurement Methods |
|
本周焦点:市场风险和信用风险
| 指标 | 公式 | 含义 | 优点 | 缺点 |
|---|---|---|---|---|
| 波动率 | 收益离散程度 | 简单直观 | 不区分上下 | |
| Beta | 系统性风险 | CAPM基础 | 假设线性 | |
| 下行偏差 | 仅考虑损失 | 更符合风险直觉 | 需要阈值 | |
| 最大回撤 | 最差情况损失 | 直观易懂 | 依赖路径 | |
| 跟踪误差 | 相对基准偏离 | 组合管理 | 仅相对度量 |
核心洞察:金融风险度量从"波动率"(Markowitz)演进到"尾部风险"(VaR/CVaR),再到"情景分析"。
定义:在给定置信水平和持有期内,预期的最大损失
直观理解:"95%置信水平下,日VaR为100万" = 在95%的情况下,每日损失不超过100万。
三种计算方法对比:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 参数法 | 计算快、简单 | 假设正态分布(金融数据厚尾) | 快速估算 |
| 历史模拟 | 无分布假设 | 依赖历史数据质量 | 实际应用 |
| Monte Carlo | 灵活、复杂结构 | 计算慢、模型风险 | 复杂衍生品 |
参数法 (方差-协方差法):
假设收益率服从正态分布,缺点是金融数据有厚尾(Tails)
历史模拟法:
# 1. 计算历史收益率
returns = df['Close'].pct_change().dropna()
# 2. 对历史收益率排序
sorted_returns = returns.sort_values()
# 3. 取5%分位数
var_95 = sorted_returns.quantile(0.05)
print(f"95% VaR (日): {var_95*100:.2f}%")
# → "95%概率下,日损失不超过2.3%"
Monte Carlo模拟:
# 1. 估计参数
mu = returns.mean()
sigma = returns.std()
# 2. 生成大量模拟路径
n_simulations = 100000
simulated_returns = np.random.normal(mu, sigma, n_simulations)
# 3. 取分位数
var_mc = np.percentile(simulated_returns, 5)
问题1:不满足次可加性 (Sub-additivity)
VaR不是一致性风险度量:
这违背了"组合分散化应降低风险"的基本金融原理。
例子 考虑
| 损失 |
0 | 100 |
|---|---|---|
| prob | 0.96 | 0.04 |
| 损失( |
0 | 100 | 200 |
|---|---|---|---|
| prob | 0.9216 | 0.0768 | 0.0016 |
本例中,
问题2:忽略尾部损失
VaR只告诉我们"最差情况的分位点",但超过VaR后的损失有多大?
↑ 损失分布
| ██
| ██████
| █████████████
|████████████████████
+------------------------→ 损失
↑ VaR ↑ 超过VaR后呢?
95%分位 (尾部风险未知)
问题3:错误的激励
鼓励做小概率发生较大损失的交易,比如:大量卖出深度虚值的期权。
定义:超过VaR的期望损失(条件期望)
直观理解:"在最差的5%情景中,平均损失是多少?"
Basel III新标准:从VaR转向Expected Shortfall (CVaR)
CVaR vs VaR:
| 维度 | VaR | CVaR |
|---|---|---|
| 尾部信息 | 只给阈值 | 尾部平均值 |
| 次可加性 | ||
| 优化便利性 | 非凸、难优化 | 凸、易优化 |
| 监管认可 | Basel I/II | Basel III |
# CVaR计算
var_95 = sorted_returns.quantile(0.05)
cvar_95 = sorted_returns[sorted_returns <= var_95].mean()
Artzner et al. (1999) 提出一致性风险度量的四条公理:
| 公理 | 定义 | VaR | CVaR |
|---|---|---|---|
| 正齐次性 | |||
| 平移不变性 | |||
| 单调性 | 若 |
||
| 次可加性 |
次可加性在金融中的含义:组合风险 ≤ 各资产风险之和 → 分散化降低风险
VaR为何不满足次可加性:两个独立债券的联合VaR可能 > 各自VaR之和(当损失分布非正态时)
Basel III 已将市场风险标准从 VaR 转向 Expected Shortfall (CVaR),因其满足一致性公理。
场景:持有沪深300(50%)、中证500(30%)、国债ETF(20%)的组合,市值 = 1000万,置信水平 = 95%
import numpy as np
import pandas as pd
from scipy.stats import norm
# 资产权重和参数
weights = np.array([0.5, 0.3, 0.2])
market_values = np.array([500, 300, 200]) # 万元
annual_returns = np.array([0.08, 0.10, 0.03])
annual_vols = np.array([0.22, 0.28, 0.06])
# 相关系数矩阵
corr_matrix = np.array([
[1.00, 0.85, -0.25], # 沪深300 vs
[0.85, 1.00, -0.30], # 中证500 vs
[-0.25, -0.30, 1.00] # 国债 vs
])
# 组合波动率
cov_matrix = np.outer(annual_vols, annual_vols) * corr_matrix
portfolio_vol = np.sqrt(weights @ cov_matrix @ weights)
# 参数法VaR
portfolio_return = weights @ annual_returns
var_95_annual = -(portfolio_return - 1.645 * portfolio_vol)
var_95_daily = var_95_annual / np.sqrt(252)
print(f"组合年化预期收益: {portfolio_return*100:.2f}%")
print(f"组合年化波动率: {portfolio_vol*100:.2f}%")
print(f"95% 年化VaR: {var_95_annual*100:.2f}% ({var_95_annual*1000:.0f}万)")
print(f"95% 日VaR: {var_95_daily*100:.2f}% ({var_95_daily*1000:.2f}万)")
分散化效果:各资产独立VaR之和 > 组合VaR(因国债与股票负相关)
成分VaR (Component VaR) 将总体VaR分解到各资产,回答"哪个资产贡献了最多风险?"
| 概念 | 定义 | 用途 |
|---|---|---|
| 边际VaR (MVaR) | 增加1单位某资产,VaR变化多少 | |
| 成分VaR (CVaR_comp) | 某资产对总VaR的绝对贡献 | |
| 成分VaR占比 | 风险预算分配 |
# 成分VaR计算
mvar = norm.ppf(0.95) * (cov_matrix @ weights) / portfolio_vol
cvar_comp = weights * mvar # 成分VaR
cvar_pct = cvar_comp / sum(cvar_comp) * 100 # 百分比
for i, asset in enumerate(['沪深300', '中证500', '国债ETF']):
print(f"{asset}: 成分VaR = {cvar_comp[i]*100:.2f}%, 占比 = {cvar_pct[i]:.1f}%")
# 典型结果:尽管国债占比20%,但因其低波动+负相关,风险贡献仅5-8%
止损是连接风险度量与风险控制的桥梁:
| 止损类型 | 原理 | 适用场景 | 参数设置 |
|---|---|---|---|
| 固定止损 | 价格跌破固定百分比/金额 | 方向性交易 | 单笔 < 资金的2% |
| 追踪止损 | 止损线随价格上移,锁定利润 | 趋势跟踪 | 回撤 < 最高价的10% |
| 波动率止损 | 基于ATR/历史波动率动态调整 | 高波动市场 | 2-3倍ATR |
| 时间止损 | 超过持仓时间仍未盈利→平仓 | 事件驱动 | 持仓N天后未触发→退出 |
| 组合止损 | 组合层面回撤触发全面减仓 | 整体风控 | 月回撤 > 10% |
# 追踪止损示例
def trailing_stop(entry_price, current_high, trailing_pct=0.10):
"""追踪止损:动态上移止损线"""
stop_price = current_high * (1 - trailing_pct)
return max(stop_price, entry_price * 0.95) # 不低于初始止损
# 波动率止损
def volatility_stop(position, atr, atr_multiplier=2.5):
"""基于ATR的动态止损"""
return position.entry_price - atr_multiplier * atr
极值理论 (Extreme Value Theory):专门建模尾部分布
两种主要方法:
1. 块最大值法 (Block Maxima):
2. 超越阈值法 (POT, Peaks Over Threshold):
金融应用:在极端市场条件下(如2008年、2020年新冠),EVT对尾部风险的估计比正态分布更准确。
7.4 投资组合优化Portfolio Optimization |
|
目标:在给定风险水平下最大化收益
有效前沿 (Efficient Frontier):
局限性:
核心理念:每个资产对组合总风险的贡献相等
风险贡献分解:
风险平价条件:
vs 传统60/40组合:
| 组合 | 股票权重 | 债券权重 | 股票风险贡献 | 债券风险贡献 |
|---|---|---|---|---|
| 60/40 | 60% | 40% | ~90% | ~10% |
| 风险平价 | ~25% | ~75% | 50% | 50% |
优势:分散化更均匀,对参数敏感度低,尾部风险更小
核心思想:将主观观点与市场均衡收益结合
其中:
优势:
实践应用:机构投资者最常用的组合构建方法
import numpy as np
import pandas as pd
def black_litterman(cap_weights, cov_matrix, P, Q, omega, tau=0.05):
"""Black-Litterman模型实现"""
n = len(cap_weights)
# 1. 从市值权重反推隐含收益
# CAPM: Π = δ * Σ * w_mkt
delta = 2.5 # 风险厌恶系数
pi = delta * cov_matrix @ cap_weights
# 2. 融合观点
# 先验:N(Π, τΣ)
# 观点:N(Q, Ω)
# 后验均值
M_inverse = np.linalg.inv(tau * cov_matrix)
posterior_cov = np.linalg.inv(M_inverse + P.T @ np.linalg.inv(omega) @ P)
posterior_mean = posterior_cov @ (M_inverse @ pi + P.T @ np.linalg.inv(omega) @ Q)
# 3. 优化新权重
# 最大化夏普比率
ones = np.ones(n)
inv_cov = np.linalg.inv(cov_matrix)
weights = inv_cov @ posterior_mean / (ones.T @ inv_cov @ posterior_mean)
return pd.Series(weights, index=cap_weights.index)
# 使用示例
cap_weights = pd.Series({'沪深300': 0.4, '国债': 0.4, '黄金': 0.2})
cov = pd.DataFrame(...) # 协方差矩阵
# 观点:沪深300未来表现优于国债3%
P = np.array([[1, -1, 0]])
Q = np.array([0.03])
omega = np.array([[0.01]]) # 观点不确定性
weights = black_litterman(cap_weights, cov, P, Q, omega)
Kelly公式(已知胜率和赔率):
其中:
金融中的Kelly公式(连续分布):
实践中的调整:
分散化Kelly:各资产独立的Kelly仓位,再用组合约束修正
核心思想:在给定风险水平下最大化预期收益,或在给定收益下最小化风险
数学模型:
其中
有效前沿特性:
| 特性 | 说明 |
|---|---|
| 前沿边界 | 所有有效组合的集合 |
| 最小方差组合 | 前沿上风险最小的点 |
| 有效部分 | 最小方差组合以上的部分 |
| 无效部分 | 最小方差组合以下的部分 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def efficient_frontier(returns, num_portfolios=10000):
"""计算有效前沿"""
n_assets = returns.shape[1]
mean_returns = returns.mean() * 252
cov_matrix = returns.cov() * 252
results = np.zeros((3, num_portfolios))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(n_assets)
weights /= weights.sum()
weights_record.append(weights)
port_return = np.dot(weights, mean_returns)
port_std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
results[0, i] = port_return
results[1, i] = port_std
results[2, i] = port_return / port_std # Sharpe
return results, weights_record
# 模拟数据
np.random.seed(42)
n_assets = 4
n_days = 252
returns = pd.DataFrame(
np.random.normal(0.001, 0.02, (n_days, n_assets)),
columns=['股票', '债券', '商品', '现金']
)
results, weights = efficient_frontier(returns)
max_sharpe_idx = results[2].argmax()
print(f"最大夏普组合: 收益={results[0,max_sharpe_idx]:.2%}, "
f"风险={results[1,max_sharpe_idx]:.2%}")
实践中前沿的漂移问题:
def rolling_frontier(returns, window=252):
"""滚动计算有效前沿,观察稳定性"""
frontiers = []
for i in range(window, len(returns)):
window_data = returns.iloc[i-window:i]
results, _ = efficient_frontier(window_data, 2000)
max_sr = results[2].max()
frontiers.append({
'date': returns.index[i],
'max_sharpe': max_sr,
'min_vol': results[1].min()
})
return pd.DataFrame(frontiers)
主要局限:
| 问题 | 描述 | 缓解方法 |
|---|---|---|
| 估计误差 | 输入参数敏感 | 收缩估计、贝叶斯方法 |
| 前沿漂移 | 参数随时间变化 | 滚动窗口、regime-switching |
| 集中度 | 权重过度集中 | 加入分散度约束 |
| 尾部风险 | 方差不足以衡量风险 | 结合CVaR优化 |
核心理念:使各资产对组合总风险的贡献相等,而非资本配置相等
风险贡献分解:
风险平价条件:
| 方法 | 输入需求 | 复杂度 | 分散度 |
|---|---|---|---|
| 等权重 | 无 | 低 | 资本分散 |
| 等风险贡献(ERC) | 协方差矩阵 | 中 | 风险分散 |
| 等波动率 | 波动率 | 低 | 风险近似分散 |
from scipy.optimize import minimize
def risk_parity_weights(cov_matrix):
"""计算风险平价权重(等风险贡献)"""
n = cov_matrix.shape[0]
def risk_contribution(w, cov):
"""计算各资产的风险贡献"""
port_vol = np.sqrt(w @ cov @ w)
rc = w * (cov @ w) / port_vol
return rc
def risk_parity_objective(w, cov):
"""目标:各资产风险贡献的方差最小化"""
rc = risk_contribution(w, cov)
target = np.mean(rc)
return np.sum((rc - target) ** 2)
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(n)]
result = minimize(
risk_parity_objective,
x0=np.ones(n) / n,
args=cov_matrix,
method='SLSQP',
bounds=bounds,
constraints=constraints
)
return result.x
# 示例
cov = np.array([[0.04, 0.01, 0.005],
[0.01, 0.09, 0.02],
[0.005, 0.02, 0.16]])
weights = risk_parity_weights(cov)
print("风险平价权重:", np.round(weights, 4))
7.5 AI增强风险管理AI-Enhanced Risk Management |
|
传统情景生成的问题:
LLM增强的情景生成:
优势:LLM可以生成"合理但历史上未曾出现"的情景,填补传统压力测试的盲区。
你是一名金融风险专家。请为以下投资组合生成5个压力测试情景:
组合配置:
- 沪深300 ETF: 40%
- 中证500 ETF: 20%
- 10年期国债: 25%
- 黄金: 10%
- 现金: 5%
当前宏观环境:
- GDP增速: 5.0%
- CPI: 2.5%
- 十年国债收益率: 3.2%
- 人民币汇率: 7.2
请生成5个互斥的情景,每个包括:
1. 情景名称和简要描述
2. 关键假设(利率变化、GDP变化、汇率变化)
3. 发生概率估计
4. 各资产的预期收益
输出格式:JSON列表
LLM vs 传统方法:
传统Delta对冲的问题:
DRL动态对冲:
状态空间:
S = {标的资产价格, Delta, Gamma, Vega, 剩余期限, 隐含波动率, 账户PnL, 对冲频率计数器}
动作空间:
A = {调整对冲比率: [-0.1, +0.1] 连续值} = 在现有对冲基础上调整
奖励函数:
R = -(PnL的波动率 + λ × 交易成本)
目标: 最小化对冲误差和交易成本的加权和
金融系统 = 网络:
GNN风险传导建模:
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class RiskPropagationGNN(torch.nn.Module):
"""图卷积网络建模风险传导"""
def __init__(self, in_features, hidden_dim, out_dim):
super().__init__()
self.conv1 = GCNConv(in_features, hidden_dim)
self.conv2 = GCNConv(hidden_dim, hidden_dim)
self.conv3 = GCNConv(hidden_dim, out_dim)
def forward(self, x, edge_index):
# x: 节点特征(资本充足率、杠杆率、流动性等)
# edge_index: 网络连接(同业拆借、衍生品敞口)
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, p=0.2, training=self.training)
x = self.conv2(x, edge_index)
x = F.relu(x)
# 输出:违约概率变化
x = self.conv3(x, edge_index)
return torch.sigmoid(x)
# 应用:模拟某大型银行违约后的风险传导
model = RiskPropagationGNN(in_features=10, hidden_dim=64, out_dim=1)
default_scenario = torch.tensor([[0.0], [1.0], [0.0], ...]) # 节点2违约
propagation = model(default_scenario, adjacency_matrix)
优势:
关键指标:
政策含义:GNN可以帮助监管机构识别"Too-Connected-To-Fail"的机构,提前采取缓释措施。
从新闻/研报文本构建情感风险指标(W4 NLP管线→W6风控应用):
数据源 → 文本预处理 → NER → FinBERT情感分类 → 风险预警指标
新闻 (路透/财新) → 每日情感得分
研报 (券商/评级) → 主题+情感倾向
社交媒体 (互动易) → 散户情绪快照
FinBERT 风险情感指数:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("ProsusAI/finbert")
model = AutoModelForSequenceClassification.from_pretrained("ProsusAI/finbert")
def risk_sentiment_index(headlines):
"""计算每日风险情绪指数:负向占比 - 正向占比"""
scores = []
for text in headlines:
inputs = tokenizer(text, return_tensors="pt", truncation=True,
max_length=512)
outputs = model(**inputs)
probs = outputs.logits.softmax(dim=-1) # [正, 负, 中性]
# 风险信号: 负向比例 - 正向比例
scores.append(probs[0][1].item() - probs[0][0].item())
return sum(scores) / len(scores)
风险预警触发规则:
| 信号 | 条件 | 风控响应 |
|---|---|---|
| 黄灯 | 连续3日情感<-0.3 | 风险敞口降至80% |
| 红灯 | 单日情感<-0.6 | 风险敞口降至50% |
| 黑灯 | 连续5日情感<-0.4 + 波动率↑ | 启动应急预案 |
文献支撑:FinBERT 由 Araci (2019) 提出,ProsusAI 团队于 2020 年在 HuggingFace 发布预训练模型,在金融情感分类任务上显著优于通用 BERT。
传统VaR局限:假设波动率恒定或依赖GARCH——对非线性、长记忆性建模不足
LSTM增强VaR:利用LSTM架构,从历史收益率序列学习波动率动态
LSTM vs GARCH 适用场景对比:
| 维度 | GARCH(1,1) | LSTM |
|---|---|---|
| 模型类型 | 参数化(3参数) | 非参数(深度学习) |
| 长记忆性 | 有限 | 可学习远距离依赖 |
| 波动率聚集 | 内置 | 从数据学习 |
| 杠杆效应 | GJR-GARCH/E-GARCH | 从数据学习 |
| 数据需求 | 500+日频 | 2000+日频 |
| 可解释性 | 高 | 低 |
Basel III + LLM应用:
| 监管要求 | LLM辅助方式 |
|---|---|
| 模型验证文档 | LLM辅助撰写验证报告 |
| 压力测试情景 | LLM生成合理极端情景 |
| 风险报告 | LLM自动生成风险摘要 |
| 合规审查 | LLM检查交易是否合规 |
| 反洗钱(AML) | LLM分析可疑交易模式 |
案例:LLM辅助模型风险审计
监管机构要求对风险模型进行独立审计
传统流程(4-6周):
阅读模型文档 → 理解假设 → 检查代码 →
测试敏感性 → 撰写审计报告
LLM辅助流程(1-2周):
LLM阅读文档 + 代码 → 自动生成审计问题 →
分析师验证 → LLM生成审计报告
深度强化学习 (DRL) 动态对冲相比传统Delta对冲的优势:
| 方面 | 传统Delta对冲 | DRL动态对冲 |
|---|---|---|
| 模型假设 | Black-Scholes假设 | 无模型,数据驱动 |
| 对冲频率 | 固定间隔 | 自适应决策 |
| 交易成本 | 忽略或简化 | 显式纳入优化 |
| 多维风险 | 仅Delta/Gamma | 可同时管理多种风险 |
| 适应性 | 静态模型 | 持续学习优化 |
DRL对冲框架:
状态:
[标的资产价格, Delta, Gamma,
剩余期限, IV, 账户余额]
↓
PPO/SAC 策略网络
↓
动作: [对冲比例 ∈ [0, 1]]
↓
奖励: -(PNL² + λ·交易成本)
import gymnasium as gym
import numpy as np
from gymnasium import spaces
class OptionHedgingEnv(gym.Env):
"""期权动态对冲环境"""
def __init__(self, option_type='call', T=30,
sigma=0.2, r=0.05, cost_rate=0.001):
super().__init__()
self.T = T
self.sigma = sigma
self.r = r
self.cost_rate = cost_rate
self.action_space = spaces.Box(0, 1, shape=(1,))
self.observation_space = spaces.Box(-5, 5, shape=(5,))
def step(self, action):
hedge_ratio = action[0]
dS = self.S * (self.r * self.dt +
self.sigma * np.random.normal() * np.sqrt(self.dt))
self.S += dS
hedge_pnl = self.hedge_position * dS
trade_cost = abs(hedge_ratio - self.hedge_ratio_prev) * self.S * self.cost_rate
self.day += 1
reward = -(hedge_pnl ** 2) - trade_cost * 100
done = self.day >= self.T
return self._get_state(), reward, done, False, {}
1. 联邦学习在风险管理中的应用
2. 可解释AI (XAI) 在风控中的监管要求
3. 大语言模型在风控报告自动化
4. 强化学习在动态风险管理
7.6 压力测试与情景分析Stress Testing & Scenario Analysis |
|
六大风险因子类别:
| 因子类别 | 因子 | 冲击幅度(典型) |
|---|---|---|
| 股票 | 股指下跌 | -20% ~ -40% |
| 利率 | 收益率曲线平移/扭曲 | ±100bp ~ ±300bp |
| 汇率 | 人民币贬值/升值 | ±5% ~ ±15% |
| 信用 | 信用利差扩大 | +100bp ~ +500bp |
| 商品 | 原油/黄金价格冲击 | ±20% ~ ±50% |
| 波动率 | 隐含波动率飙升 | +50% ~ +200% |
历史情景:
| 情景 | 时间 | 触发事件 | 最大跌幅 |
|---|---|---|---|
| 全球金融危机 | 2008 | 雷曼破产 | -65% (沪深300) |
| 欧债危机 | 2011 | 希腊债务违约 | -33% |
| 股灾 | 2015 | 去杠杆 | -45% |
| 新冠危机 | 2020 | 全球疫情 | -15% |
| 雪球事件 | 2024 | 集中敲入 | -20% |
假设情景(LLM可辅助生成):
关键区别:
逆向思维:不是"给定情景,损失多少",而是"给定损失上限,什么情景会导致"
问题: "什么情景会导致组合损失超过30%?"
正向压力测试:
给定: 股指下跌20%, 利率上升100bp
计算: 组合损失15%
反向压力测试:
给定: 组合损失30%
求解: 需要什么程度的市场冲击?
答案: 股指下跌35% + 信用利差扩大300bp 或 极端情况
LLM在反向压力测试中的优势:
巴塞尔III压力测试框架:
第一支柱:最低资本要求
├─ 市场风险:标准化方法 → FRTB ( Fundamental Review of the Trading Book)
├─ 信用风险:内部评级法(IRB) / 标准化法
└─ 操作风险:基本指标法 / 标准化法
第二支柱:监管审查
├─ ICAAP (内部资本充足评估程序)
├─ 压力测试程序
└─ 治理与内控
第三支柱:市场纪律
├─ 信息披露要求
├─ 风险暴露报告
└─ 资本结构报告
国家金融监督管理总局压力测试要求:
流动性风险 vs 市场风险:
| 维度 | 市场风险 | 流动性风险 |
|---|---|---|
| 来源 | 市场价格不利变动 | 无法以合理价格平仓 |
| 度量 | VaR/CVaR | 流动性覆盖率(LCR) |
| 时间尺度 | 日/周 | 小时/天 |
| 典型危机 | 2008, 2015 | LTCM, 2020信用债 |
流动性风险指标:
| 指标 | 公式 | 阈值 |
|---|---|---|
| 买卖价差 | (Ask-Bid)/Mid | < 1% 正常 |
| Amihud非流动性 | 越小越好 | |
| 流动性覆盖率 | > 100% | |
| 融资集中度 | 最大融资方占比 | < 25% |
AI在流动性风险管理中的应用:
衍生品交易中的担保品管理:
担保品优化:
| 担保品种类 | 折扣率(haircut) | 可质押率 |
|---|---|---|
| 国债 | 2-5% | 95-98% |
| 高等级信用债 | 5-15% | 85-95% |
| 股票(沪深300) | 15-30% | 70-85% |
| 股票(非成分) | 30-50% | 50-70% |
| 现金 | 0% | 100% |
AI优化担保品管理:
定义:交易对手未能履行合约义务导致损失的风险
信用风险量化:
其中:
信用风险模型演进:
| 模型 | 方法 | 应用 |
|---|---|---|
| 传统评分卡 | Logistic回归 | 零售信贷评分 |
| Merton模型 | 期权定价框架 | 公司债定价 |
| CreditMetrics | 评级迁移矩阵 | 投资组合信用VaR |
| CreditRisk+ | 精算模型 | 损失分布估计 |
| ML模型 | XGBoost/深度学习 | 违约预测、欺诈检测 |
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, accuracy_score
def credit_risk_scoring(features, labels):
"""
构建信用风险评分模型
使用逻辑回归构建可解释的信用评分卡
"""
X_train, X_test, y_train, y_test = train_test_split( features, labels, test_size=0.3, random_state=42 )
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
model = LogisticRegression(class_weight='balanced')
model.fit(X_train_scaled, y_train)
y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]
y_pred = model.predict(X_test_scaled)
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print(f"AUC-ROC: {roc_auc_score(y_test, y_pred_proba):.4f}")
# 系数解读(原始尺度)
coef_df = pd.DataFrame({'feature': features.columns, 'coefficient': model.coef_[0], 'odds_ratio': np.exp(model.coef_[0])})
return model, coef_df
# 模拟信用数据
np.random.seed(42)
n_samples = 1000
features = pd.DataFrame({'income': np.random.normal(50, 20, n_samples), 'debt_ratio': np.random.beta(2, 5, n_samples), 'payment_history': np.random.uniform(0, 1, n_samples),
'months_employed': np.random.exponential(60, n_samples)})
labels = (features['payment_history'] * 0.5 + (1 - features['debt_ratio']) * 0.3 + np.random.normal(0, 0.1, n_samples) > 0.5).astype(int)
操作风险类型(巴塞尔协议分类):
| 类别 | 示例 | 金融影响 |
|---|---|---|
| 内部欺诈 | 交易员违规、内幕交易 | 巴林银行、法兴银行 |
| 外部欺诈 | 黑客攻击、伪造 | 网络安全事件 |
| 系统故障 | 交易系统宕机 | 算法错误导致巨亏 |
| 流程管理 | 结算失败、合规遗漏 | 监管处罚 |
| 人员风险 | 关键人员离职 | 策略失效 |
操作风险资本计量:
AI在操作风险中的应用:
压力测试类型:
| 类型 | 方法 | 示例 |
|---|---|---|
| 情景分析 | 假设特定情景 | 利率上升300bp |
| 敏感性分析 | 单因子变动 | 波动率增加50% |
| 逆向压力测试 | 从损失倒推情景 | 什么情景导致破产? |
| 历史情景 | 重复历史危机 | 2008年金融危机重现 |
历史情景示例:
historical_scenarios = {
'2008_金融危机': {
'equity': -0.50, # 股市下跌50%
'credit_spread': 0.06, # 信用利差扩大600bp
'vol_index': 0.35, # 波动率升至35
'fx_emerging': -0.20 # 新兴市场货币贬值20%
},
'2020_新冠': {
'equity': -0.34,
'credit_spread': 0.04,
'vol_index': 0.45,
'fx_emerging': -0.15
},
'2015_A股': {
'equity': -0.45,
'credit_spread': 0.03,
'vol_index': 0.50,
'fx_emerging': -0.05
}
}
ERM (Enterprise Risk Management) 框架:
三道防线模型:
| 防线 | 角色 | 职责 |
|---|---|---|
| 第一道 | 业务部门 | 识别和管理日常风险 |
| 第二道 | 风控部门 | 制定政策、监控风险限额 |
| 第三道 | 内部审计 | 独立评估风控有效性 |
import numpy as np
import pandas as pd
def stress_test_portfolio(positions, risk_factors, scenarios):
"""
投资组合压力测试
Parameters:
positions: dict {资产名: 市值}
risk_factors: dict {资产名: {因子名: 暴露}}
scenarios: dict {情景名: {因子名: 变化率}}
Returns:
DataFrame: 各情景下的组合损益
"""
results = []
for scenario_name, shocks in scenarios.items():
total_pnl = 0
details = {}
for asset, exposure in positions.items():
asset_factors = risk_factors[asset]
asset_pnl = 0
for factor, beta in asset_factors.items():
if factor in shocks:
factor_pnl = exposure * beta * shocks[factor]
asset_pnl += factor_pnl
total_pnl += asset_pnl
details[asset] = asset_pnl
results.append({
'scenario': scenario_name,
'total_pnl': total_pnl,
'pnl_pct': total_pnl / sum(positions.values()),
**details
})
return pd.DataFrame(results)
# 示例
positions = {'股票': 1e8, '债券': 5e7, '商品': 2e7}
risk_factors = {'股票': {'equity': 1.0, 'rate': 0.2, 'credit': 0.3}, '债券': {'equity': 0.1, 'rate': 0.8, 'credit': 0.5}, '商品': {'equity': 0.3, 'rate': 0.1, 'credit': 0.1}}
scenarios = {'2008危机': {'equity': -0.5, 'rate': -0.02, 'credit': 0.06}, '利率冲击': {'equity': -0.1, 'rate': 0.01, 'credit': 0.02}, '温和衰退': {'equity': -0.2, 'rate': -0.005, 'credit': 0.03}}
result = stress_test_portfolio(positions, risk_factors, scenarios)
print(result[['scenario', 'total_pnl', 'pnl_pct']])
风险预算框架:
组合总风险预算 (100%)
↓
┌──────────────┼──────────────┐
↓ ↓ ↓
股票部门 债券部门 另类部门
(40%) (30%) (30%)
↓ ↓ ↓
行业/风格 久期/信用 策略/产品
细分限额 细分限额 细分限额
常用风险限额类型:
| 限额类型 | 示例 | 监控频率 |
|---|---|---|
| VaR限额 | 日VaR < 5000万 | 每日 |
| 止损限额 | 单月亏损 < 10% | 每月 |
| 集中度限额 | 单票 < 5% | 每周 |
| 杠杆限额 | 总杠杆 < 3x | 每日 |
| 流动性限额 | 5日变现 > 80% | 每月 |
巴塞尔协议III框架:
| 风险类型 | 计量方法 | 资本要求 |
|---|---|---|
| 信用风险 | 标准法/内部评级法(IRB) | 风险加权资产(RWA)的8% |
| 市场风险 | 标准法/内部模型法(IMA) | VaR + 压力VaR |
| 操作风险 | 标准法/高级计量法(AMA) | 按收入比例 |
中国版巴塞尔协议实施:
杠杆率与流动性覆盖率:
7.7 课堂实践项目Hands-on Projects |
|
选题一:量化策略绩效诊断与改进
目标:对Week 6创建的量化策略进行绩效诊断,识别问题并提出改进方案
任务:
AI协作点:策略诊断分析、改进建议生成、代码实现
提示:
backtrader计算绩效指标选题二:VaR/CVaR计算与回测验证
目标:实现VaR/CVaR计算,并进行回测验证
任务:
AI协作点:VaR计算实现、回测方法设计、结果分析
提示:
选题三:Black-Litterman组合优化
目标:实现Black-Litterman模型,构建最优投资组合
任务:
AI协作点:模型实现、参数设置、结果解读
提示:
选题四:LLM辅助风险情景生成
目标:使用LLM生成投资组合的压力测试情景
任务:
AI协作点:提示词设计、情景生成、影响分析
提示:
选题五:止损策略优化
目标:设计和优化止损策略,降低策略回撤
任务:
AI协作点:止损策略设计、参数优化、效果评估
提示:
选题六:风险预算与仓位管理
目标:实现风险预算框架,优化仓位管理
任务:
AI协作点:风险贡献计算、优化算法、结果分析
提示:
推荐AI工具:
| 工具类型 | 代表工具 | 应用场景 |
|---|---|---|
| 代码助手 | GitHub Copilot, Cursor | 策略代码编写 |
| 对话AI | ChatGPT, Claude | 策略设计讨论 |
| 数据分析 | Julius, Code Interpreter | 数据探索与可视化 |
| 文献检索 | Elicit, Consensus | 相关研究查找 |
有效协作技巧:
示例提示词:
我正在研究双均线策略的改进方案。当前策略的问题是:
1. 最大回撤过大(-45%)
2. 波动率过高(40%)
3. 夏普比率较低(0.63)
请帮我设计一个风险管理改进方案,包括:
1. 仓位管理策略(如波动率调整)
2. 止损机制(如追踪止损)
3. 信号过滤器(如趋势强度)
请提供具体的Python实现代码,并解释每个改进点的原理。
本周知识体系:
量化交易策略的风险管理(连接Week 6)
↓
风险度量 (VaR/CVaR/绩效指标)
↓
投资组合优化 (Markowitz/风险平价/Black-Litterman)
↓
AI增强风控 (LLM情景/DRL对冲/GNN传导)
↓
风险治理 (压力测试/ERM框架/巴塞尔协议)
↓
实践应用 (策略改进/组合优化/情景分析)
核心能力建设:
| 能力 | 掌握程度 | 应用场景 |
|---|---|---|
| 策略诊断 | 识别策略问题和改进方向 | 量化策略优化 |
| 风险度量 | VaR/CVaR计算与解读 | 日常风控报告 |
| 组合优化 | 多模型对比与选择 | 资产配置决策 |
| AI工具应用 | LLM/DRL/GNN基础 | 前沿风控实践 |
| 风险治理 | 框架理解与实施 | 合规与监管 |
延伸思考:
|
核心收获
预习准备
|
下周预告
推荐阅读
|
经典教材
CreditMetrics模型:
核心: 评级迁移矩阵 → 信用VaR
评级迁移矩阵 (1年):
AAA → AA: 5%, AAA → A: 1%, AAA → Default: 0.01%
AA → A: 8%, AA → BBB: 2%, ...
BBB → BB: 4%, BBB → Default: 0.5%
信用VaR = 组合当前价值 - 置信水平下的组合最坏价值
Merton模型 (KMV):
信用风险传染模型:
GNN捕获企业间网络效应(供应链、股权、借贷关系)
Basel III操作风险分类:
| 类别 | 示例 | AI检测方法 |
|---|---|---|
| 内部欺诈 | 交易员隐瞒亏损 | 异常PnL模式检测 |
| 外部欺诈 | 黑客攻击/支付欺诈 | GNN交易图异常检测 |
| 系统故障 | 交易系统宕机 | 实时监控+告警 |
| 执行/流程错误 | 下单数量/价格错误 | 订单合理性规则+ML |
操作风险量化 (LDA方法):
频率(λ)∼Poisson, 严重度∼LogNormal, 通过Monte Carlo模拟计算
流动性风险度量:
| 指标 | 公式 | 含义 |
|---|---|---|
| Amihud非流动性 | 单位成交额的价格冲击 | |
| 买卖价差 | 即时交易成本 | |
| 市场深度 | 前5档买卖量之和 | 大单吸收能力 |
中国市场特殊性:
三大支柱:
| 支柱 | 内容 | 中国实施 |
|---|---|---|
| P1 最低资本 | 信用+市场+操作风险资本 | 银保监《资本管理办法》 |
| P2 监督检查 | ICAAP内部资本评估 | 银保监年度检查 |
| P3 市场纪律 | 公开信息披露 | 上市银行年报+季报 |
FRTB (交易账户根本审查):
AI在资本管理中的应用:
工具
### Black-Litterman模型 **核心思想**:将市场均衡收益与投资者主观观点结合 **模型公式**: $$\mu_{BL} = [(\tau\Sigma)^{-1} + P^T\Omega^{-1}P]^{-1}[(\tau\Sigma)^{-1}\Pi + P^T\Omega^{-1}Q]$$ 其中: - $\Pi$: 市场隐含均衡收益(CAPM逆推) - $P, Q$: 投资者观点的表达矩阵和收益向量 - $\Omega$: 观点不确定性(对角线矩阵) - $\tau$: 均衡不确定性的缩放因子 **与Markowitz对比**: | 方面 | Markowitz | Black-Litterman | |------|-----------|----------------| | 输入敏感性 | 极高 | 低(受均衡约束)| | 观点融入 | 无 | 显式表达 | | 权重稳定性 | 差 | 好 | | 实务使用 | 教学为主 | 机构主流 | ---
**PPO训练结果**(论文数据): | 策略 | 对冲误差 (RMSE) | 交易成本 | 总成本 | |------|----------------|---------|-------| | Delta对冲(日频) | 2.45% | 0.12% | 2.57% | | Delta对冲(周频) | 3.78% | 0.04% | 3.82% | | DRL-PPO | 1.89% | 0.15% | 2.04% | DRL策略在对冲精度和成本之间找到更好的平衡 ---
```python import torch.nn as nn class VolatilityLSTM(nn.Module): """LSTM预测已实现波动率,用于VaR计算""" def __init__(self, input_dim=1, hidden_dim=64, num_layers=2): super().__init__() self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True, dropout=0.2) self.fc = nn.Sequential( nn.Linear(hidden_dim, 32), nn.ReLU(), nn.Linear(32, 1), nn.Softplus() # 保证波动率为正 ) def forward(self, x): # x: (batch, seq_len, features) — 历史日收益率序列 lstm_out, _ = self.lstm(x) last_hidden = lstm_out[:, -1, :] return self.fc(last_hidden) # 预测波动率 → 计算VaR # VaR_t = -z_α × σ̂_LSTM × √h ``` ---
> **关键文献**:Kim & Won (2018, *Expert Systems with Applications*) "Forecasting the volatility of stock price index: A hybrid model integrating LSTM with multiple GARCH-type models" — 提出 LSTM-GARCH 混合模型,在 KOSPI 200 上预测误差降低约 20%。
### 实践要求与评分标准 **时间安排**:30-45分钟 **提交内容**: <div style="columns: 2; column-gap: 40px;"> <font size=5> 1. **实践报告** - 选题背景和目标 - 方法论和实现过程 - 结果分析和讨论 - 改进建议 2. **代码实现** - 完整可运行的代码 - 数据获取和处理 - 核心算法实现 </font> </div> <div style="columns: 2; column-gap: 40px;"> <font size=5> 3. **AI协作记录** - 与AI的对话记录 - AI建议的采纳情况 - AI辅助的具体环节 4. **课堂展示** - 5分钟PPT展示 - 关键结果和发现 - 讨论和Q&A </font> </div> **评分标准**: | 评分维度 | 权重 | 评分要点 | |---------|------|---------| | 选题质量 | 20% | 问题明确、目标具体、有实际意义 | | 方法论 | 25% | 方法选择合理、实现正确、有创新性 | | 结果分析 | 25% | 分析深入、结论可靠、有洞察力 | | AI协作 | 15% | 有效利用AI、记录完整、有反思 | | 展示表达 | 15% | 表达清晰、逻辑连贯、回答问题 | ---
### 课堂展示准备 **展示时间**:5分钟/组 **展示结构**: 1. **问题背景**(1分钟) - 选题是什么?为什么重要? - Week 6策略存在什么问题? 2. **方法与实现**(2分钟) - 采用了什么方法? - 如何实现的? 3. **关键结果**(1.5分钟) - 主要发现是什么? - 改进效果如何? 4. **讨论与反思**(0.5分钟) - 有什么局限性? - 未来改进方向? **展示技巧**: - 使用图表和数据支持观点 - 突出关键发现和创新点 - 准备回答技术问题 - 保持简洁和清晰 ---
**论文** - Markowitz (1952): "Portfolio Selection" - Black & Litterman (1992): "Global Portfolio Optimization" - Artzner et al. (1999): "Coherent Measures of Risk" **前沿** - Kim et al. (2024): "LLM-Generated Stress Scenarios for Risk Management" - Hambly et al. (2023): "Deep Reinforcement Learning for Hedging" - Ronnqvist & Sarlin (2017): "Bank Networks from Text: Interbank Risk"