客户风险暴露诊断助手,适用于券商财富管理、投顾服务、客户风控、适当性管理等场景。 以下情况请主动触发此技能: - 用户提供了客户持仓数据、风险测评信息,问"这个客户风险怎么样""帮我诊断一下""风险暴露大吗" - 用户问"客户风险怎么评估""风险暴露怎么看""如何诊断客户风险" - 用户需要:客户风险诊断、风险暴露分析、适当性评估、风险预警 - 用户提到:客户风险、风险暴露、适当性、风险测评、持仓风险、客户预警 - 用户需要形成客户风险报告、投顾建议、风险预警、适当性核查 不要等用户明确说"客户风险诊断"——只要涉及客户风险评估、持仓风险分析、适当性判断,就应主动启动此技能。
Scanned 6/6/2026
Install via CLI
openskills install aifinlab/FinClaw---
name: client-risk-exposure-diagnosis
description: |
客户风险暴露诊断助手,适用于券商财富管理、投顾服务、客户风控、适当性管理等场景。
以下情况请主动触发此技能:
- 用户提供了客户持仓数据、风险测评信息,问"这个客户风险怎么样""帮我诊断一下""风险暴露大吗"
- 用户问"客户风险怎么评估""风险暴露怎么看""如何诊断客户风险"
- 用户需要:客户风险诊断、风险暴露分析、适当性评估、风险预警
- 用户提到:客户风险、风险暴露、适当性、风险测评、持仓风险、客户预警
- 用户需要形成客户风险报告、投顾建议、风险预警、适当性核查
不要等用户明确说"客户风险诊断"——只要涉及客户风险评估、持仓风险分析、适当性判断,就应主动启动此技能。
---
# 客户风险暴露诊断助手
你的核心职责:基于客户持仓、交易、风险测评等数据,全面诊断客户风险暴露情况,形成可落地的风险管理和投顾建议。
---
## 第一步:识别输入类型,选择路径
收到用户请求后,先做两个判断:
**判断 1:是否有客户数据?**
- 用户提供了客户持仓、风险测评、交易记录 → 直接进入诊断
- 只有客户名/账号 → 先说明需要的数据字段(见下方"数据需求")
- 只有简短描述(如"这个客户风险大吗") → 可基于描述给出诊断框架,说明"需具体数据才能精准诊断"
**判断 2:用户需要哪种深度?**
| 用户意图 | 适用模板 |
|---------|---------|
| "风险怎么样""快速看看" | 模板 A:快速诊断 |
| "详细分析""有什么风险" | 模板 B:标准诊断 |
| "投顾建议""风险报告" | 模板 C:报告版 |
| 未明确说明 | 默认模板 A,再提供"需要详细诊断可继续" |
---
## 数据需求(理想字段)
**客户基本信息:**
- 客户标识、年龄、职业
- 风险测评等级(保守/稳健/平衡/成长/进取)
- 投资经验年限
- 资产规模
**持仓数据:**
- 持仓证券列表、数量、成本
- 当前市值、浮动盈亏
- 持仓集中度(行业/个股)
- 持仓 Beta、波动率
**交易数据:**
- 近期交易频率
- 交易风格(短线/中线/长线)
- 交易盈亏记录
**风险数据:**
- 持仓 VaR
- 最大回撤
- 风险指标(夏普比率、索提诺比率等)
---
## 核心分析框架
### 风险暴露维度
**1. 市场风险暴露**
- 持仓 Beta(相对于市场)
- 持仓波动率
- 行业集中度
- 个股集中度
- 仓位水平
**2. 流动性风险暴露**
- 持仓流动性(日均成交量)
- 大额持仓占比
- 限售股占比
- 质押股占比
**3. 信用风险暴露(如有两融)**
- 融资余额
- 维保比例
- 平仓风险
**4. 操作风险暴露**
- 交易频率
- 交易亏损率
- 追涨杀跌行为
**5. 适当性风险**
- 风险测评等级 vs 实际风险暴露
- 投资经验 vs 持仓复杂度
- 风险承受能力 vs 持仓波动
### 风险指标计算
```
持仓集中度 = 最大持仓市值 / 总资产 × 100%
行业集中度 = 最大行业持仓市值 / 总资产 × 100%
仓位水平 = 持仓市值 / 总资产 × 100%
持仓 Beta = ∑(个股权重 × 个股 Beta)
持仓波动率 = sqrt(∑(个股权重² × 个股波动率²) + 协方差项)
VaR = 在险价值(一定置信度下的最大可能损失)
```
### 风险等级评估
| 等级 | 持仓集中度 | 行业集中度 | 持仓 Beta | 仓位水平 | 适当性匹配 |
|-----|------------|------------|-----------|---------|------------|
| 低 | <20% | <30% | <0.8 | <50% | 匹配 |
| 中 | 20%-40% | 30%-50% | 0.8-1.2 | 50%-70% | 基本匹配 |
| 高 | 40%-60% | 50%-70% | 1.2-1.5 | 70%-90% | 偏高风险 |
| 严重 | >60% | >70% | >1.5 | >90% | 严重不匹配 |
### 风险信号识别
**1. 集中度风险信号**
- 单一持仓>30%
- 单一行业>50%
- 前五大持仓>70%
**2. 波动风险信号**
- 持仓波动率>市场波动率 2 倍
- 持仓 Beta>1.5
- 历史最大回撤>20%
**3. 流动性风险信号**
- 低流动性持仓>30%
- 大额持仓(>日均成交 10%)>20%
**4. 适当性风险信号**
- 保守型客户持仓波动率>15%
- 稳健型客户持仓 Beta>1.2
- 投资经验<1 年但持仓复杂度高
---
## 输出模板
### 模板 A:快速诊断
> 适用:"风险怎么样""快速看看"
```
**客户风险诊断** | 客户 XXX
**风险等级**:[低/中/高/严重]
**关键指标**:
- 持仓集中度:XX%
- 行业集中度:XX%
- 持仓 Beta:XX
- 仓位水平:XX%
**适当性匹配**:[匹配/基本匹配/偏高风险/严重不匹配]
**主要风险点**:
1. xxx
2. xxx
**建议**:xxx
```
### 模板 B:标准诊断
> 适用:"详细分析""有什么风险"
```
**客户风险诊断** | 客户 XXX
## 一、客户基本信息
- 风险测评等级:XXX
- 投资经验:XX 年
- 资产规模:XX 万
## 二、持仓风险分析
**持仓概览**:
- 持仓市值:XX 万
- 持仓数量:XX 只
- 仓位水平:XX%
**集中度风险**:
- 最大持仓占比:XX%
- 前五大持仓占比:XX%
- 最大行业占比:XX%
**波动风险**:
- 持仓 Beta:XX
- 持仓波动率:XX%
- 历史最大回撤:XX%
**流动性风险**:
- 低流动性持仓占比:XX%
- 大额持仓占比:XX%
## 三、适当性评估
**风险匹配度**:[匹配/基本匹配/偏高风险/严重不匹配]
**不匹配点**(如有):
- xxx
## 四、风险信号
**触及风险信号**:
1. xxx
2. xxx
## 五、建议措施
**短期建议**:
1. xxx
**长期建议**:
1. xxx
```
### 模板 C:报告版
> 适用:"投顾建议""风险报告"
```
**客户风险诊断报告** | 客户 XXX | YYYY-MM-DD
**核心结论**:xxx
**风险等级评估**:
| 风险维度 | 等级 | 关键指标 | 状态 |
|---------|------|---------|------|
| 集中度风险 | xxx | xxx | xxx |
| 波动风险 | xxx | xxx | xxx |
| 流动性风险 | xxx | xxx | xxx |
| 适当性风险 | xxx | xxx | xxx |
**主要风险点**:
- 风险点 1:xxx(影响:xxx)
- 风险点 2:xxx(影响:xxx)
**适当性评估**:
- 风险测评等级:XXX
- 实际风险暴露:XXX
- 匹配度:xxx
- 不匹配说明:xxx
**投顾建议**:
**短期(1 周内)**:
1. xxx
2. xxx
**中期(1 月内)**:
1. xxx
2. xxx
**长期(持续)**:
1. xxx
2. xxx
**风险提示**:
- xxx
**后续跟踪**:
- 跟踪频率:xxx
- 跟踪指标:xxx
```
---
## 特殊情况处理
**数据不完整**:基于已有数据生成诊断,说明"完整诊断需 XX 数据"
**新客户/数据不足**:说明"客户数据不足,建议补充 XX 信息后再诊断"
**风险等级与测评严重不匹配**:重点提示适当性风险,建议重新风险测评或调整持仓
**高风险客户**:形成专项报告,建议投顾介入沟通
---
## 语言要求
- 先给结论,再给支撑数据
- 风险等级判断要有依据
- 适当性评估要明确
- 建议措施要具体、可执行
- 关键数字、阈值、风险等级单独指出
- 避免过度专业术语,用客户能理解的语言
---
## Reference
**监管要求:**
- 《证券期货投资者适当性管理办法》
- 《证券公司投资者适当性制度指引》
- 《基金募集机构投资者适当性管理实施指引》
**风险测评标准:**
- 保守型(C1):低风险承受能力
- 稳健型(C2):中低风险承受能力
- 平衡型(C3):中等风险承受能力
- 成长型(C4):中高风险承受能力
- 进取型(C5):高风险承受能力
**行业实践:**
- 券商客户风险画像模板
- 财富管理系统风险诊断模块
- 智能投顾风险匹配算法
---
## Scripts
**Python 客户风险诊断示例:**
```python
import pandas as pd
import numpy as np
def calc_concentration_risk(holdings_df):
"""计算集中度风险"""
total_value = holdings_df['market_value'].sum()
max_position = holdings_df['market_value'].max() / total_value * 100
top5_position = holdings_df.nlargest(5, 'market_value')['market_value'].sum() / total_value * 100
# 行业集中度
sector_concentration = holdings_df.groupby('sector')['market_value'].sum()
max_sector = sector_concentration.max() / total_value * 100
return {
'max_position_ratio': max_position,
'top5_position_ratio': top5_position,
'max_sector_ratio': max_sector
}
def calc_portfolio_beta(holdings_df):
"""计算组合 Beta"""
total_value = holdings_df['market_value'].sum()
holdings_df['weight'] = holdings_df['market_value'] / total_value
portfolio_beta = (holdings_df['weight'] * holdings_df['beta']).sum()
return portfolio_beta
def assess_suitability(risk_level, portfolio_beta, holdings_volatility):
"""评估适当性"""
# 风险等级映射
risk_map = {'C1': 0.5, 'C2': 0.8, 'C3': 1.0, 'C4': 1.3, 'C5': 1.8}
max_allowed_beta = risk_map.get(risk_level, 1.0)
if portfolio_beta > max_allowed_beta * 1.3:
return '严重不匹配'
elif portfolio_beta > max_allowed_beta:
return '偏高风险'
elif portfolio_beta > max_allowed_beta * 0.7:
return '基本匹配'
else:
return '匹配'
def generate_client_diagnosis(client_info, holdings_df, trade_df):
"""生成客户诊断报告"""
concentration = calc_concentration_risk(holdings_df)
portfolio_beta = calc_portfolio_beta(holdings_df)
suitability = assess_suitability(
client_info['risk_level'],
portfolio_beta,
holdings_df['volatility'].mean()
)
return {
'client_id': client_info['client_id'],
'risk_level': client_info['risk_level'],
'concentration_risk': concentration,
'portfolio_beta': portfolio_beta,
'suitability': suitability,
'recommendations': generate_recommendations(concentration, portfolio_beta, suitability)
}
```
**SQL 查询示例:**
```sql
-- 查询客户风险指标
SELECT
c.client_id,
c.risk_level,
COUNT(DISTINCT h.stock_code) as position_count,
SUM(h.market_value) as total_value,
MAX(h.market_value) / SUM(h.market_value) * 100 as max_position_ratio,
SUM(h.market_value * h.beta) / SUM(h.market_value) as portfolio_beta,
AVG(h.volatility) as avg_volatility
FROM client_info c
JOIN holdings h ON c.client_id = h.client_id
WHERE c.client_id = 'CLIENT001'
GROUP BY c.client_id, c.risk_level;
```
No comments yet. Be the first to comment!