反洗钱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实战 #银行风控 #关联图谱

相关文章
|
4月前
|
人工智能 Linux API
从0到1玩转OpenClaw:保姆级部署流程(阿里云+Windows/Mac/Linux)+ 免费大模型配置及避坑指南
2026年,AI技术的核心变革已从“生成内容”深度转向“落地执行”,而OpenClaw(前身为Clawdbot、Moltbot)作为开源AI自动化代理引擎的领军者,正以“本地优先、强执行能力、多端适配”的核心优势,成为个人与企业构建“自托管式数字员工”的首选工具。截至2026年3月,其GitHub星标已突破28万,社区贡献者超378人,技能生态覆盖办公、开发、生活等全场景,真正实现了从“对话式建议”到“自动化执行”的跨越,彻底打破了传统AI“只说不做”的局限。
1777 168
|
4月前
|
存储 弹性计算 安全
阿里云服务器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年起。
1038 7
|
13天前
|
JSON 缓存 Shell
Codex Desktop 无法识别自定义模型的 5 种解决方法(2026 最新)
你接好了一个自定义 provider,codex 在终端里跑得好好的,但桌面版的模型选择器却像你的模型根本不存在一样。 这种落差几乎从来不是你的 API 密钥或配置语法出了问题,而是桌面版客户端悄悄过滤掉了后端已经加载好的模型。
|
1月前
|
存储 人工智能 机器人
AI Agent的三重记忆机制:打造高可用的多维记忆系统
本文深度解析AI Agent三大核心记忆架构:RAG(聚焦“来源说了什么”,保障答案可溯源)、Agent Memory(解决“该记住什么”,实现跨会话连续性)与知识图谱(厘清“事物如何关联”,支撑多跳推理)。三者定位迥异,需依问题本质精准选型,避免技术错配。
152 4
AI Agent的三重记忆机制:打造高可用的多维记忆系统
|
12天前
|
缓存 人工智能 数据可视化
GLM 5.2自托管完整实操指南:硬件选型、vLLM/SGLang部署与成本测算全解
GLM 5.2作为国产标杆级开源大模型,采用753B MoE混合专家架构,单次推理仅激活8个专家模块,原生支持百万Token超长上下文,在代码生成、复杂数学推理、长篇文档分析等场景综合能力突出。企业选择GLM 5.2本地/私有云自托管,核心收益在于数据完全不出域、模型可深度定制、长期算力成本可控,但落地需要解决硬件匹配、推理框架适配、性能调优、成本核算四大核心难题。同时,搭配OpenClaw、Hermes两类主流AI智能体,可搭建完整本地自动化工作流,结合阿里云百炼Token Plan云端订阅方案,形成本地私有化+云端弹性混合使用架构。本文完整覆盖GLM 5.2硬件分级方案、两大主流推理框架部
320 1
|
5月前
|
人工智能 弹性计算 机器人
阿里云gpu云服务器包年包月和按量活动,丰富多样的GPU卡型和规格
阿里云推出GPU优惠活动,提供多样GPU卡型与弹性算力,助力AI应用落地。包括96GB显存+900GB/s NVLink的大规模模型推理卡型,及L20 GPU的轻量高效部署选项,满足不同场景需求。支持包年包月、按量付费等灵活计费模式,结合vLLM框架快速部署大模型,提升推理速度与吞吐量。此外,无影GPU云电脑企业版及百炼大模型调用服务,为用户提供高性价比算力,轻松开启AI新时代。
|
人工智能 Serverless API
托管 Agent 执行循环只是起点,AgentRun 托管的更是企业 AI 生产全链路
阿里云AgentRun是面向生产环境的一站式Agentic AI基础设施平台,支持模型无关接入、毫秒级沙箱隔离、MCP/Skills双轨工具扩展、VPC数据不出域、RAM多租户及全链路可观测。已助力企业降低60%TCO,获Omdia“领导者”评级。
|
2月前
|
存储 人工智能 数据库
2026年阿里云免费云服务器领取及使用全攻略
阿里云免费试用中心面向个人开发者、学生及小微企业,提供云服务器、存储、数据库、AI等全栈产品免费体验,零成本上云!新用户认证后即可领取,手把手教程助你快速入门。
555 1
|
2月前
|
弹性计算 安全 关系型数据库
阿里云服务器2核2G、2核4G、4核8G、8核16G怎么选实例?最新活动价格对比与实例规格选择指南
本文介绍了2026年阿里云服务器2核2G、2核4G、4核8G、8核16G配置的最新活动价格及选购指南。阿里云为个人开发者、初创团队及轻量级业务企业提供多样入门配置选择,如2核2G轻量应用服务器仅38元一年,2核4G配置199元包年。对于业务规模扩大或应用复杂度提升的用户,阿里云提供4核8G与8核16G配置,价格从1252.63元到5958.52元一年不等,满足不同性能需求。用户可根据业务需求和预算,在阿里云丰富产品线与优惠策略中选配最合适的云服务器实例。
|
3月前
|
开发工具 git C++
Git 2.54发布:重写历史不再“伤筋动骨“,钩子终于能“云同步“了!
Git 2.54 发布:聚焦日常体验升级!新增 `git history`(轻量重写历史)、配置化 hooks(全局/局部灵活管理)、几何压缩默认启用。增强 `add -p`、支持 Unicode 别名、HTTP 429 自动重试等。不炫技,只解痛——让工具更懂你。
284 1