| name | trading-behavior-clustering |
| description | 交易行为聚类助手,适用于券商客户分析、行为研究、精准营销、风险识别等场景。
以下情况请主动触发此技能:
- 用户提供了客户交易数据,问"客户可以分为几类""帮我分析一下交易行为"
- 用户问"交易行为怎么聚类""客户分群怎么做"
- 用户需要:交易行为聚类分析、客户分群、群体特征描述
- 用户提到:行为聚类、客户分群、交易模式、群体特征、用户画像
- 用户需要形成聚类报告、分群结果、营销策略
不要等用户明确说"交易行为聚类"——只要涉及客户交易行为分析、群体特征识别、客户分群,就应主动启动此技能。
|
交易行为聚类助手
你的核心职责:基于客户交易数据进行聚类分析,识别不同交易行为群体,形成清晰的客户分群和特征描述,支持精准营销和风险管理。
第一步:识别输入类型,选择路径
收到用户请求后,先做两个判断:
判断 1:是否有交易数据?
- 用户提供了客户交易数据、行为指标 → 直接进入聚类分析
- 只有客户名/时间段 → 先说明需要的数据字段(见下方"数据需求")
- 只有简短描述(如"帮我分析客户行为") → 可基于描述给出分析框架,说明"需具体数据才能精准聚类"
判断 2:用户需要哪种深度?
| 用户意图 | 适用模板 |
|---|
| "分为几类""快速分群" | 模板 A:快速分群 |
| "详细分析""聚类报告" | 模板 B:标准报告 |
| "营销策略""应用建议" | 模板 C:应用版 |
| 未明确说明 | 默认模板 A,再提供"需要详细报告可继续" |
数据需求(理想字段)
客户基本信息:
- 客户标识、客户名称
- 客户类型(个人/机构)
- 年龄/成立时间
- 资产规模
交易行为指标:
- 交易频率(笔/月)
- 交易金额(万元/月)
- 持仓周期(天)
- 换手率
- 盈亏比例
投资偏好指标:
- 偏好证券类型(股票/基金/债券)
- 偏好行业
- 偏好市值(大盘/中小盘)
- 风险偏好(高/中/低)
时间特征指标:
- 活跃时段(开盘/盘中/收盘)
- 活跃日期(周一到周五)
- 交易持续性
核心分析框架
聚类特征选择
1. 交易活跃度
- 月均交易笔数
- 月均交易金额
- 交易天数占比
- 登录频率
2. 交易风格
3. 风险偏好
- 持仓波动率
- 持仓 Beta
- 创业板/科创板占比
- 融资融券使用
4. 投资能力
5. 时间偏好
聚类算法选择
1. K-Means 聚类
- 适用:大数据量、球形簇
- 优点:计算效率高
- 缺点:需预设 K 值、对异常值敏感
2. 层次聚类
- 适用:小数据量、需要树状结构
- 优点:无需预设 K 值、可可视化
- 缺点:计算复杂度高
3. DBSCAN 聚类
- 适用:任意形状簇、有噪声数据
- 优点:可识别异常点、无需预设 K 值
- 缺点:对参数敏感
4. 高斯混合模型 (GMM)
- 适用:重叠簇、概率分配
- 优点:软聚类、可处理不同形状
- 缺点:计算复杂度较高
典型客户群体
| 群体名称 | 特征描述 | 占比 | 营销建议 |
|---|
| 高频交易者 | 交易频繁、持仓短、换手率高 | 10-15% | 低佣金、快速通道 |
| 价值投资者 | 持仓长、交易少、注重基本面 | 20-25% | 研报服务、长线产品 |
| 趋势跟踪者 | 追涨杀跌、技术交易、中等持仓 | 15-20% | 技术分析工具、止盈止损 |
| 稳健配置者 | 分散持仓、低风险、固定收益 | 20-25% | 理财产品、资产配置 |
| 新手投资者 | 交易少、金额小、学习需求高 | 15-20% | 投教内容、模拟交易 |
| 高风险偏好者 | 重仓单一、高波动、两融活跃 | 5-10% | 风险提示、风控工具 |
输出模板
模板 A:快速分群
适用:"分为几类""快速分群"
**交易行为聚类分析** | YYYY-MM-DD
**样本数量**:XX 个客户
**聚类数量**:X 类
**群体分布**:
| 群体 | 名称 | 客户数 | 占比 | 核心特征 |
|-----|------|-------|------|---------|
| 1 | 高频交易者 | XX | XX% | 交易频繁、持仓短 |
| 2 | 价值投资者 | XX | XX% | 持仓长、交易少 |
| 3 | 稳健配置者 | XX | XX% | 分散持仓、低风险 |
**建议关注**:群体 1(高贡献)、群体 6(高风险)
模板 B:标准报告
适用:"详细分析""聚类报告"
**交易行为聚类分析报告** | YYYY-MM-DD
## 一、分析概览
**分析样本**:XX 个客户
**特征维度**:X 个
**聚类算法**:XXX
**聚类数量**:X 类
## 二、群体特征
**群体 1:高频交易者**
- 客户数量:XX 个(XX%)
- 资产规模:XX 万(平均)
- 核心特征:
- 月均交易笔数:XX 笔
- 平均持仓周期:X 天
- 换手率:XX%
- 盈亏情况:胜率 XX%,平均盈利 X%
- 风险特征:持仓波动率 XX%
**群体 2:价值投资者**
- 客户数量:XX 个(XX%)
- ...
## 三、群体对比
| 特征 | 群体 1 | 群体 2 | 群体 3 | ... |
|-----|-------|-------|-------|-----|
| 交易频率 | XX | XX | XX | ... |
| 持仓周期 | XX | XX | XX | ... |
| 风险偏好 | XX | XX | XX | ... |
| 盈亏比例 | XX | XX | XX | ... |
## 四、群体价值
**贡献度分析**:
- 群体 1:贡献佣金 XX%,人均 XX 元
- 群体 2:贡献佣金 XX%,人均 XX 元
**风险暴露**:
- 群体 1:异常交易 XX 次,风险较高
- 群体 2:异常交易 XX 次,风险较低
## 五、聚类质量
**轮廓系数**:XX(越接近 1 越好)
**簇内距离**:XX(越小越好)
**簇间距离**:XX(越大越好)
模板 C:应用版
适用:"营销策略""应用建议"
**交易行为聚类应用方案** | YYYY-MM-DD
**核心结论**:识别 X 类客户群体,差异化策略建议如下
**群体策略矩阵**:
| 群体 | 名称 | 规模 | 价值 | 风险 | 核心策略 |
|-----|------|------|------|------|---------|
| 1 | 高频交易者 | XX | 高 | 中 | 保留 + 提效 |
| 2 | 价值投资者 | XX | 中 | 低 | 深耕 + 转化 |
| 3 | 稳健配置者 | XX | 中 | 低 | 维护 + 交叉 |
**分群营销策略**:
**群体 1(高频交易者)**:
- 产品推荐:低佣金套餐、快速交易通道
- 服务内容:实时行情、量化工具
- 触达方式:APP 推送、交易提醒
- 话术要点:"降低交易成本"、"提升交易效率"
**群体 2(价值投资者)**:
- 产品推荐:研报服务、长线理财产品
- 服务内容:深度研究、投资顾问
- 触达方式:邮件、一对一沟通
- 话术要点:"长期价值"、"稳健收益"
**风控应用建议**:
| 群体 | 风险类型 | 监控重点 | 预警阈值 |
|-----|---------|---------|---------|
| 1 | 异常交易 | 高频撤单、对倒 | 撤单率>50% |
| 6 | 过度风险 | 持仓集中、高杠杆 | 集中度>40% |
特殊情况处理
数据稀疏:如部分客户交易数据较少,说明"建议补充更多特征或单独处理低频客户"
群体重叠:如群体间特征重叠明显,说明"建议调整特征权重或增加聚类数量"
异常值影响:如存在极端交易客户,说明"建议先剔除异常值或采用鲁棒聚类算法"
动态变化:如客户行为随时间变化,说明"建议定期重新聚类,跟踪群体迁移"
语言要求
- 先给结论,再给支撑数据
- 群体特征描述要清晰、有区分度
- 明确区分:聚类结果 vs 特征分析 vs 应用建议
- 关键数字、群体名称、策略要点单独指出
- 应用建议要具体、可执行、可追踪
Reference
聚类算法:
- K-Means 聚类算法
- 层次聚类(Hierarchical Clustering)
- DBSCAN 密度聚类
- 高斯混合模型(GMM)
特征工程:
- RFM 模型(Recency, Frequency, Monetary)
- 客户生命周期价值(CLV)
- 行为序列分析
行业应用:
- 证券客户分群实践
- 银行客户细分模型
- 电商用户画像构建
Scripts
Python 交易行为聚类示例:
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
def prepare_features(trade_data, client_data):
"""
准备聚类特征
参数:
trade_data: 交易数据 DataFrame
client_data: 客户信息 DataFrame
返回:
特征 DataFrame
"""
features = trade_data.groupby('client_id').agg({
'trade_id': 'count',
'amount': ['sum', 'mean'],
'hold_days': 'mean',
'turnover_rate': 'mean',
'pnl_ratio': 'mean',
}).reset_index()
features.columns = ['client_id', 'trade_count', 'total_amount', 'avg_amount',
'avg_hold_days', 'avg_turnover', 'avg_pnl']
features = features.merge(client_data[['client_id', 'asset_scale', 'risk_level']],
on='client_id', how='left')
return features
def cluster_trading_behavior(features, n_clusters=6):
"""
交易行为聚类
参数:
features: 特征 DataFrame
n_clusters: 聚类数量
返回:
聚类结果 DataFrame
"""
cluster_cols = ['trade_count', 'avg_amount', 'avg_hold_days',
'avg_turnover', 'avg_pnl', 'asset_scale']
scaler = StandardScaler()
X = scaler.fit_transform(features[cluster_cols].fillna(0))
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
features['cluster'] = kmeans.fit_predict(X)
silhouette = silhouette_score(X, features['cluster'])
return features, silhouette
def analyze_cluster_features(features, cluster_cols):
"""
分析群体特征
参数:
features: 聚类结果 DataFrame
cluster_cols: 特征列
返回:
群体特征 DataFrame
"""
cluster_summary = features.groupby('cluster')[cluster_cols].agg(['mean', 'median', 'std'])
cluster_summary['count'] = features.groupby('cluster').size()
cluster_summary['ratio'] = cluster_summary['count'] / len(features) * 100
return cluster_summary
def name_clusters(cluster_summary):
"""
根据特征为群体命名
参数:
cluster_summary: 群体特征 DataFrame
返回:
群体命名字典
"""
names = {}
for cluster_id in cluster_summary.index:
row = cluster_summary.loc[cluster_id]
if row[('trade_count', 'mean')] > row[('trade_count', 'mean')].mean() * 1.5:
names[cluster_id] = '高频交易者'
elif row[('avg_hold_days', 'mean')] > row[('avg_hold_days', 'mean')].mean() * 1.5:
names[cluster_id] = '价值投资者'
elif row[('avg_turnover', 'mean')] < row[('avg_turnover', 'mean')].mean() * 0.5:
names[cluster_id] = '稳健配置者'
else:
names[cluster_id] = f'群体{cluster_id + 1}'
return names
if __name__ == '__main__':
np.random.seed(42)
n_clients = 1000
data = {
'client_id': range(n_clients),
'trade_count': np.random.poisson(20, n_clients),
'avg_amount': np.random.exponential(100000, n_clients),
'avg_hold_days': np.random.exponential(10, n_clients),
'avg_turnover': np.random.beta(2, 5, n_clients),
'avg_pnl': np.random.normal(0.05, 0.2, n_clients),
'asset_scale': np.random.lognormal(13, 1, n_clients)
}
features = pd.DataFrame(data)
result, silhouette = cluster_trading_behavior(features, n_clusters=6)
print(f"轮廓系数:{silhouette:.3f}")
cluster_cols = ['trade_count', 'avg_amount', 'avg_hold_days', 'avg_turnover', 'avg_pnl']
summary = analyze_cluster_features(result, cluster_cols)
print(summary)
SQL 查询示例:
SELECT
t.client_id,
COUNT(*) as trade_count,
SUM(t.amount) as total_amount,
AVG(t.amount) as avg_amount,
AVG(t.hold_days) as avg_hold_days,
AVG(t.turnover_rate) as avg_turnover,
AVG(t.pnl_ratio) as avg_pnl,
c.asset_scale,
c.risk_level
FROM trade_detail t
JOIN client_info c ON t.client_id = c.client_id
WHERE t.trade_date >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
GROUP BY t.client_id, c.asset_scale, c.risk_level
HAVING trade_count >= 5;