反洗钱AI实战:从可疑交易识别到监管报送

简介: 银行人必看:AI如何自动识别"星型转账"洗钱模式 实战代码:基于 risk-compliance Skill | 关联图谱 | 反洗钱检测 什么是"星型转账"? 洗钱者的经典手法: `` ┌───┐ │ A │ ──→ 分散资金 └───┘ │ ┌─────┼─────┐ ↓ ↓ ↓ ┌─┐ ┌─┐ ┌─┐ │B│ │C│ │D│ → 汇聚到中心 └─┘ └─┘ └─┘ │ │ │

银行人必看:AI如何自动识别"星型转账"洗钱模式

实战代码:基于 risk-compliance Skill | 关联图谱 | 反洗钱检测

什么是"星型转账"?

洗钱者的经典手法:

        ┌───┐
        │ A │ ──→ 分散资金
        └───┘
          │
    ┌─────┼─────┐
    ↓     ↓     ↓
   ┌─┐   ┌─┐   ┌─┐
   │B│   │C│   │D│  → 汇聚到中心
   └─┘   └─┘   └─┘
    │     │     │
    └─────┼─────┘
          ↓
        ┌───┐
        │ E │ ──→ 集中转出
        └───┘
          │
    ┌─────┼─────┐
    ↓     ↓     ↓
   ┌─┐   ┌─┐   ┌─┐
   │F│   │G│   │H│  → 再次分散
   └─┘   └─┘   └─┘

特征:多个账户 → 中心账户 → 多个账户,形成"星型"结构。

检测算法

from knowledge_graph import KnowledgeGraphBuilder, FraudPatternDetector
import pandas as pd

# 1. 加载交易数据
df = pd.read_csv("transactions.csv")
print(f"交易笔数: {len(df)}")

# 2. 构建关联图谱
builder = KnowledgeGraphBuilder()
graph = builder.build_from_transactions(df)
print(f"节点数: {graph.number_of_nodes()}")
print(f"边数: {graph.number_of_edges()}")

# 3. 检测星型转账
detector = FraudPatternDetector(graph)
star_patterns = detector.detect_star_transfer()

print(f"发现星型网络: {len(star_patterns)}个")
for pattern in star_patterns:
    print(f"\n中心账户: {pattern.center}")
    print(f"关联账户: {len(pattern.participants)}个")
    print(f"总流入: ¥{pattern.total_inflow:,.0f}")
    print(f"总流出: ¥{pattern.total_outflow:,.0f}")
    print(f"风险等级: {pattern.risk_level}")

完整代码

"""
反洗钱星型转账检测
运行: python aml_star_detection.py --data transactions.csv
"""
import argparse
import pandas as pd
from datetime import datetime

class StarTransferDetector:
    def __init__(self, min_inflow=100000, min_outflow=100000, 
                 min_participants=5, max_depth=2):
        self.min_inflow = min_inflow
        self.min_outflow = min_outflow
        self.min_participants = min_participants
        self.max_depth = max_depth

    def detect(self, transactions_df):
        """检测星型转账网络"""
        # 构建转账网络
        networks = self._build_networks(transactions_df)

        # 识别星型结构
        stars = []
        for center, network in networks.items():
            if self._is_star_pattern(center, network):
                stars.append({
   
                    "center": center,
                    "participants": network["participants"],
                    "total_inflow": network["inflow"],
                    "total_outflow": network["outflow"],
                    "risk_level": self._calculate_risk(network)
                })

        return stars

    def _build_networks(self, df):
        """构建转账网络"""
        networks = {
   }
        for _, row in df.iterrows():
            from_acc = row["from_account"]
            to_acc = row["to_account"]
            amount = row["amount"]

            # 统计每个账户的流入流出
            for acc in [from_acc, to_acc]:
                if acc not in networks:
                    networks[acc] = {
   
                        "participants": set(),
                        "inflow": 0,
                        "outflow": 0
                    }

            networks[to_acc]["participants"].add(from_acc)
            networks[to_acc]["inflow"] += amount
            networks[from_acc]["outflow"] += amount

        return networks

    def _is_star_pattern(self, center, network):
        """判断是否为星型结构"""
        return (
            network["inflow"] >= self.min_inflow and
            network["outflow"] >= self.min_outflow and
            len(network["participants"]) >= self.min_participants
        )

    def _calculate_risk(self, network):
        """计算风险等级"""
        score = 0
        score += min(network["inflow"] / 1000000, 50)  # 流入金额
        score += min(network["outflow"] / 1000000, 50)  # 流出金额
        score += len(network["participants"]) * 5  # 参与账户数

        if score >= 80:
            return "极高"
        elif score >= 60:
            return "高"
        elif score >= 40:
            return "中"
        else:
            return "低"

# 主程序
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", required=True, help="交易数据CSV文件")
    parser.add_argument("--min-inflow", type=int, default=100000)
    parser.add_argument("--min-outflow", type=int, default=100000)
    parser.add_argument("--min-participants", type=int, default=5)
    args = parser.parse_args()

    # 加载数据
    df = pd.read_csv(args.data)
    print(f"📊 加载交易数据: {len(df)}笔")

    # 检测
    detector = StarTransferDetector(
        min_inflow=args.min_inflow,
        min_outflow=args.min_outflow,
        min_participants=args.min_participants
    )

    stars = detector.detect(df)

    # 输出报告
    print(f"\n🚨 发现星型转账网络: {len(stars)}个")
    for star in stars:
        print(f"\n{'='*50}")
        print(f"中心账户: {star['center']}")
        print(f"关联账户: {len(star['participants'])}个")
        print(f"总流入: ¥{star['total_inflow']:,.0f}")
        print(f"总流出: ¥{star['total_outflow']:,.0f}")
        print(f"风险等级: {star['risk_level']}")

    # 保存报告
    report = generate_report(stars)
    with open("aml_report.md", "w") as f:
        f.write(report)
    print(f"\n✅ 报告已保存: aml_report.md")

def generate_report(stars):
    """生成Markdown报告"""
    report = "# 反洗钱检测报告\n\n"
    report += f"生成时间: {datetime.now()}\n\n"
    report += f"## 检测结果\n\n"
    report += f"发现可疑星型网络: **{len(stars)}**个\n\n"

    for i, star in enumerate(stars, 1):
        report += f"### 网络 {i}\n\n"
        report += f"- 中心账户: `{star['center']}`\n"
        report += f"- 关联账户: {len(star['participants'])}个\n"
        report += f"- 总流入: ¥{star['total_inflow']:,.0f}\n"
        report += f"- 总流出: ¥{star['total_outflow']:,.0f}\n"
        report += f"- 风险等级: **{star['risk_level']}**\n\n"

    return report

if __name__ == "__main__":
    main()

运行效果

$ python aml_star_detection.py --data transactions.csv --min-inflow 500000

📊 加载交易数据: 12,847笔

🚨 发现星型转账网络: 3个

==================================================
中心账户: 6222****8888
关联账户: 12个
总流入: ¥2,340,000
总流出: ¥2,280,000
风险等级: 极高

==================================================
中心账户: 6222****6666
关联账户: 8个
总流入: ¥1,560,000
总流出: ¥1,490,000
风险等级: 高

==================================================
中心账户: 6222****9999
关联账户: 6个
总流入: ¥890,000
总流出: ¥850,000
风险等级: 中

可视化

import networkx as nx
import matplotlib.pyplot as plt

# 绘制星型网络
def visualize_star(star, df):
    G = nx.DiGraph()

    # 添加中心节点
    G.add_node(star["center"], node_color="red", size=1000)

    # 添加关联节点
    for participant in star["participants"]:
        G.add_node(participant, node_color="blue", size=500)
        G.add_edge(participant, star["center"])

    # 绘制
    pos = nx.spring_layout(G)
    colors = [G.nodes[n]["node_color"] for n in G.nodes()]
    sizes = [G.nodes[n]["size"] for n in G.nodes()]

    plt.figure(figsize=(10, 8))
    nx.draw(G, pos, node_color=colors, node_size=sizes, 
            with_labels=True, arrows=True)
    plt.title(f"星型转账网络: {star['center']}")
    plt.savefig(f"star_{star['center']}.png")
    plt.show()

# 可视化第一个网络
visualize_star(stars[0], df)

进阶:多层星型检测

# 检测多层星型(A→B→C→D)
def detect_multi_layer_star(df, max_layers=3):
    """检测多层星型转账"""
    G = nx.DiGraph()

    # 构建图
    for _, row in df.iterrows():
        G.add_edge(row["from_account"], row["to_account"], 
                   weight=row["amount"])

    # 查找多层路径
    patterns = []
    for node in G.nodes():
        # BFS查找星型结构
        for depth in range(2, max_layers + 1):
            paths = find_star_paths(G, node, depth)
            if paths:
                patterns.extend(paths)

    return patterns

def find_star_paths(G, center, depth):
    """查找以center为中心的depth层星型路径"""
    # 实现BFS查找
    pass

完整代码https://github.com/yuzhaopeng-up/financial-ai-skills/tree/main/skills/risk-compliance/examples

#反洗钱 #星型转账 #Python实战 #银行风控 #关联图谱

相关文章
|
7月前
|
SQL 运维 监控
上线前检查清单模板及工具指南:告别手忙脚乱,实现稳定发布
上线前检查清单是避免线上事故的关键。本文提供可落地的四阶段检查模板,涵盖代码、配置、部署与协作,并通过工具化、复盘机制让清单真正生效,帮助团队建立质量护城河,将严谨流程转化为开发习惯。
|
5月前
|
人工智能 Linux API
从0到1玩转OpenClaw:保姆级部署流程(阿里云+Windows/Mac/Linux)+ 免费大模型配置及避坑指南
2026年,AI技术的核心变革已从“生成内容”深度转向“落地执行”,而OpenClaw(前身为Clawdbot、Moltbot)作为开源AI自动化代理引擎的领军者,正以“本地优先、强执行能力、多端适配”的核心优势,成为个人与企业构建“自托管式数字员工”的首选工具。截至2026年3月,其GitHub星标已突破28万,社区贡献者超378人,技能生态覆盖办公、开发、生活等全场景,真正实现了从“对话式建议”到“自动化执行”的跨越,彻底打破了传统AI“只说不做”的局限。
1827 168
|
5月前
|
存储 弹性计算 安全
阿里云服务器2核4G可选实例规格、收费标准、适用场景及活动价格
阿里云2核4G配置云服务器因资源均衡、适用性广,成为个人开发者及企业的热门选择。目前u1实例2核4G5M带宽价格只要199元一年;经济型e实例2核4G配置599.93元/1年起;通用算力型u2i实例2核4G配置680.31元/1年起;通用算力型u2a实例2核4G配置504.60元/1年起;计算型c9i实例2核4G配置1742.08元/1年起。
1115 7
|
2月前
|
存储 人工智能 机器人
AI Agent的三重记忆机制:打造高可用的多维记忆系统
本文深度解析AI Agent三大核心记忆架构:RAG(聚焦“来源说了什么”,保障答案可溯源)、Agent Memory(解决“该记住什么”,实现跨会话连续性)与知识图谱(厘清“事物如何关联”,支撑多跳推理)。三者定位迥异,需依问题本质精准选型,避免技术错配。
219 4
AI Agent的三重记忆机制:打造高可用的多维记忆系统
|
1月前
|
JSON 缓存 Shell
Codex Desktop 无法识别自定义模型的 5 种解决方法(2026 最新)
你接好了一个自定义 provider,codex 在终端里跑得好好的,但桌面版的模型选择器却像你的模型根本不存在一样。 这种落差几乎从来不是你的 API 密钥或配置语法出了问题,而是桌面版客户端悄悄过滤掉了后端已经加载好的模型。
|
1月前
|
缓存 人工智能 数据可视化
GLM 5.2自托管完整实操指南:硬件选型、vLLM/SGLang部署与成本测算全解
GLM 5.2作为国产标杆级开源大模型,采用753B MoE混合专家架构,单次推理仅激活8个专家模块,原生支持百万Token超长上下文,在代码生成、复杂数学推理、长篇文档分析等场景综合能力突出。企业选择GLM 5.2本地/私有云自托管,核心收益在于数据完全不出域、模型可深度定制、长期算力成本可控,但落地需要解决硬件匹配、推理框架适配、性能调优、成本核算四大核心难题。同时,搭配OpenClaw、Hermes两类主流AI智能体,可搭建完整本地自动化工作流,结合阿里云百炼Token Plan云端订阅方案,形成本地私有化+云端弹性混合使用架构。本文完整覆盖GLM 5.2硬件分级方案、两大主流推理框架部
479 1
|
27天前
|
消息中间件 人工智能 自然语言处理
企业客服Agent如何调用CRM与工单系统:任务规划、工具编排与闭环架构
2025 年以来,企业客服 AI 的建设焦点已从"模型选型"转向"系统集成"。大模型能否调用 CRM 查客户信息、能否在工单系统中自动创建和流转任务、能否在转人工时保留完整的上下文链——这些能力决定了 AI 客服是停留在"问答辅助"阶段,还是真正进入"业务执行"阶段。本文从任务规划层、工具编排层和闭环架构层三个技术维度展开,讨论如何将 Agent 与 CRM、工单等业务系统对接。
194 0
|
1月前
|
缓存 网络协议 安全
你每天上网用的"导航",正在被人偷偷改路线
DNS劫持是攻击者篡改域名解析结果,将用户悄悄导向钓鱼、博彩等恶意网站的隐蔽攻击。它常通过路由器篡改、链路劫持或Local DNS缓存投毒实现,用户毫无感知。HTTPDNS以HTTPS替代传统UDP DNS,加密传输、绕过本地缓存、精准调度,从协议层根治劫持风险。(239字)
|
2月前
|
API 开发者 Python
Python FastAPI 从零搭建规范 API 接口,附统一返回体与文档配置
本文手把手教你用FastAPI搭建规范API项目:含RESTful路由、统一响应体(code/msg/data)、自动类型校验、内置Swagger文档(/docs)及全局异常处理,一行命令即可启动,新手零门槛上手,显著提升开发与联调效率。
251 1
|
1月前
|
人工智能 网络协议 网络性能优化
【洛神公开课】第6期:AI网络白皮书-02训练网络篇
阿里云AI训练网络“三层引擎”(Scale-Up/Out/Across)突破万卡集群瓶颈:NVLink实现单机8卡全互联,HPN+eRDMA将跨机通信时延压至2μs,CEN+TR支撑跨域Tbps级协同。三者协同达成96%线性加速比,显著破解GPU空转难题。(239字)
335 0