Install any skill in seconds. Free to start, no credit card required.
Get Started Free →异常交易识别助手(账户联动版),适用于券商风控、合规监控、交易行为分析、监管报送等场景。 以下情况请主动触发此技能: - 用户提供了多账户交易数据,问"这些账户是否联动""有没有关联关系""帮我看看" - 用户问"账户联动怎么识别""如何判断一致行动人""关联账户筛查方法" - 用户需要:账户关联识别规则、联动交易监控、一致行动人判定、监管标准解读 - 用户提到:关联账户、一致行动人、账户组、协同交易、对倒对敲 - 用户需要形成风控报告、合规核查意见、异常交易说明 不要等用户明确说"账户联动识别"——只要涉及多账户交易行为关联分析、一致行动人识别、协同交易模式识别,就应主动启动此技能。
.claude/skills/aifinlab-abnormal-trading-account-correlation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 150% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 67% | 0% |
你的核心职责:识别多账户之间的联动交易行为,判断是否存在关联关系或一致行动人嫌疑,形成可落地的风控结论。
收到用户请求后,先做两个判断:
判断 1:是否有账户数据?
判断 2:用户需要哪种深度?
| 用户意图 | 适用模板 | |---------|---------| | "是否联动""有没有关联" | 模板 A:快速筛查 | | "详细分析""形成报告" | 模板 B:标准分析 | | "合规意见""监管报送""风控建议" | 模板 C:汇报版 | | 未明确说明 | 默认模板 A,再提供"需要详细分析可继续" |
账户基础信息:
交易流水字段:
1. 身份信息关联
2. 开户信息关联
3. 交易行为关联
4. 资金关联
交易同步率 = 同步交易次数 / 总交易次数 × 100%
(同步交易定义:同一证券、同一方向、时间差<X 秒)
交易一致性 = 方向一致且数量接近的交易次数 / 总交易次数 × 100%
账户组集中度 = 账户组持有某证券数量 / 该证券流通股本 × 100%
协同交易得分 = 时间同步权重×0.3 + 方向一致权重×0.3 + 数量接近权重×0.2 + 价格一致权重×0.2典型情形:
交易层面判定参考:
| 等级 | 交易同步率 | 交易一致性 | 其他特征 | 建议动作 | |-----|------------|------------|----------|----------| | 正常 | <30% | <50% | 无身份信息关联 | 持续监控 | | 关注 | 30%-50% | 50%-70% | 开户信息关联 | 加强监控,记录原因 | | 异常 | 50%-70% | 70%-85% | 资金/联系方式关联 | 预警,联系客户 | | 严重 | >70% | >85% | 多重关联 + 高协同 | 限制交易,上报合规 |
> 适用:"是否联动""有没有关联"
**筛查结论**:[正常/关注/异常/严重]
**关联账户识别**:
- 账户组:[账户 A, 账户 B, ...]
- 关联类型:身份信息/开户信息/交易行为/资金关联
**关键指标**:
- 交易同步率:XX%
- 交易一致性:XX%
- 协同交易得分:XX
**是否触及阈值**:是/否(说明具体触及的阈值)
**建议动作**:xxx> 适用:"详细分析""形成报告"
**分析对象**:账户组/时间段
**账户组信息**:
- 账户列表:[账户 A, 账户 B, ...]
- 账户数量:XX
- 关联关系:xxx
**数据概览**:
- 分析时段:XXX
- 涉及证券数量:XX
- 总交易次数:XX
**关联识别结果**:
- 身份信息关联:是/否(xxx)
- 开户信息关联:是/否(xxx)
- 交易行为关联:是/否(xxx)
- 资金关联:是/否(xxx)
**联动交易指标**:
- 交易同步率:XX%(阈值 50%,[未触及/触及])
- 交易一致性:XX%(阈值 70%,[未触及/触及])
- 协同交易得分:XX(阈值 0.8,[未触及/触及])
**联动行为模式**:
- 集中交易证券:xxx
- 典型联动交易案例:xxx
- 是否存在对倒对敲嫌疑:是/否
**初步判断**:xxx(是否涉嫌关联账户联动交易)
**建议措施**:xxx> 适用:"合规意见""监管报送""风控报告"
**事件概述**:xxx
**核心结论**:xxx
**关键数据与事实**:
- xxx
**关联关系认定**:
- 关联类型:xxx
- 证据链:xxx
**监管标准对照**:
- 触及条款:xxx
- 一致行动人判定:是/否
**风险评估**:xxx
**处置建议**:
- 短期:xxx
- 长期:xxx
**后续跟踪**:xxx数据不完整:基于已有数据给出判断框架,说明"完整分析需 XX 字段"
间接关联识别:如 A 与 B 关联、B 与 C 关联,可推断 A 与 C 可能存在间接关联,说明推断逻辑
客户解释合理性:如客户提供解释(如独立决策、巧合),评估解释合理性并记录
监管问询应对:协助准备说明材料,包括账户关系说明、交易决策独立性证明等
监管法规:
一致行动人认定标准:
学术参考:
Python 计算示例:
pythonimport pandas as pd import numpy as np from itertools import combinations def calc_trade_sync_rate(df, account_list, time_threshold=3): """计算交易同步率""" total_trades = 0 sync_trades = 0 for acc in account_list: acc_trades = df[df['account_id'] == acc].copy() acc_trades['time'] = pd.to_datetime(acc_trades['trade_time']) acc_trades = acc_trades.sort_values('time') total_trades += len(acc_trades) # 检查与其他账户的交易同步性 for other_acc in account_list: if other_acc == acc: continue other_trades = df[(df['account_id'] == other_acc) & (df['stock_code'].isin(acc_trades['stock_code'].unique()))] other_trades['time'] = pd.to_datetime(other_trades['trade_time']) for _, trade in acc_trades.iterrows(): matched = other_trades[ (abs((trade['time'] - other_trades['time']).dt.total_seconds()) < time_threshold) & (other_trades['stock_code'] == trade['stock_code']) & (other_trades['direction'] == trade['direction']) ] if len(matched) > 0: sync_trades += 1 break return sync_trades / total_trades * 100 if total_trades > 0 else 0 def calc_collaboration_score(sync_rate, consistency_rate, volume_similarity, price_similarity): """计算协同交易得分""" score = ( sync_rate * 0.3 + consistency_rate * 0.3 + volume_similarity * 0.2 + price_similarity * 0.2 ) return min(score, 100) def detect_account_groups(df, threshold_sync=50, threshold_consistency=70): """检测潜在关联账户组""" accounts = df['account_id'].unique() groups = [] for acc1, acc2 in combinations(accounts, 2): pair_df = df[df['account_id'].isin([acc1, acc2])] sync_rate = calc_trade_sync_rate(pair_df, [acc1, acc2]) if sync_rate >= threshold_sync: groups.append((acc1, acc2, sync_rate)) return sorted(groups, key=lambda x: x[2], reverse=True)
SQL 查询示例:
sql-- 查询账户组交易同步率 WITH account_trades AS ( SELECT account_id, stock_code, trade_time, direction, LAG(trade_time) OVER (PARTITION BY stock_code ORDER BY trade_time) as prev_trade_time, LAG(account_id) OVER (PARTITION BY stock_code ORDER BY trade_time) as prev_account_id FROM trade_table WHERE trade_date = '2026-03-16' ) SELECT prev_account_id as account1, account_id as account2, COUNT(*) as sync_count, COUNT(*) * 1.0 / (SELECT COUNT(*) FROM account_trades) as sync_rate FROM account_trades WHERE TIMESTAMPDIFF(SECOND, prev_trade_time, trade_time) < 3 AND prev_account_id != account_id GROUP BY prev_account_id, account_id HAVING sync_rate > 0.5 ORDER BY sync_rate DESC;
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | pass→pass | 15,617 | 15,069 | -4% | 1 | 1 | 0% | 2,337 | 4,940 | +111% | 0 | 0 | — |
case-01 | fail→pass | 19,526 | 17,871 | -8% | 1 | 1 | 0% | 2,986 | 4,653 | +56% | 0 | 0 | — |
case-02 | fail→fail | 29,900 | 20,762 | -31% | 1 | 1 | 0% | 4,666 | 6,647 | +42% | 0 | 0 | — |
case-03 | pass→fail | 31,153 | 27,985 | -10% | 1 | 1 | 0% | 4,620 | 7,131 | +54% | 0 | 0 | — |
case-04 | pass→pass | 16,459 | 12,611 | -23% | 1 | 1 | 0% | 2,422 | 4,862 | +101% | 0 | 0 | — |
case-05 | pass→pass | 18,293 | 12,150 | -34% | 1 | 1 | 0% | 2,520 | 4,773 | +89% | 0 | 0 | — |
case-06 | pass→pass | 11,588 | 12,398 | +7% | 1 | 1 | 0% | 1,721 | 4,539 | +164% | 0 | 0 | — |
case-07 | fail→pass | 15,792 | 9,307 | -41% | 1 | 1 | 0% | 2,264 | 4,514 | +99% | 0 | 0 | — |
case-08 | fail→pass | 14,236 | 13,792 | -3% | 1 | 1 | 0% | 2,055 | 5,133 | +150% | 0 | 0 | — |
case-10 | pass→pass | 24,560 | 24,825 | +1% | 1 | 1 | 0% | 3,492 | 6,630 | +90% | 0 | 0 | — |
case-11 | fail→pass | 19,646 | 11,957 | -39% | 1 | 1 | 0% | 2,812 | 4,680 | +66% | 0 | 0 | — |
case-12 | pass→pass | 19,223 | 15,905 | -17% | 1 | 1 | 0% | 3,058 | 5,427 | +77% | 0 | 0 | — |
case-13 | fail→pass | 19,286 | 10,334 | -46% | 1 | 1 | 0% | 2,815 | 4,692 | +67% | 0 | 0 | — |
case-14 | pass→pass | 17,890 | 10,874 | -39% | 1 | 1 | 0% | 2,673 | 4,602 | +72% | 0 | 0 | — |
case-15 | fail→fail | 18,616 | 11,494 | -38% | 1 | 1 | 0% | 2,534 | 4,564 | +80% | 0 | 0 | — |
case-16 | pass→pass | 15,161 | 11,173 | -26% | 1 | 1 | 0% | 2,012 | 4,361 | +117% | 0 | 0 | — |
case-17 | pass→pass | 15,467 | 13,711 | -11% | 1 | 1 | 0% | 1,971 | 5,011 | +154% | 0 | 0 | — |
case-18 | pass→pass | 22,649 | 20,337 | -10% | 1 | 1 | 0% | 2,842 | 5,907 | +108% | 0 | 0 | — |
case-19 | pass→pass | 21,545 | 17,963 | -17% | 1 | 1 | 0% | 2,620 | 5,492 | +110% | 0 | 0 | — |
case-20 | pass→pass | 17,752 | 15,646 | -12% | 1 | 1 | 0% | 2,838 | 5,412 | +91% | 0 | 0 | — |
case-21 | pass→pass | 21,387 | 20,880 | -2% | 1 | 1 | 0% | 3,340 | 6,576 | +97% | 0 | 0 | — |
case-22 | pass→pass | 25,676 | 18,971 | -26% | 1 | 1 | 0% | 3,500 | 5,896 | +68% | 0 | 0 | — |
case-23 | pass→pass | 21,157 | 32,263 | +52% | 1 | 1 | 0% | 3,576 | 7,865 | +120% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.