WongYikShern/AML-Transaction-Monitoring-System

GitHub: WongYikShern/AML-Transaction-Monitoring-System

一个混合 AI 驱动的反洗钱交易监控系统,通过规则引擎与 Isolation Forest 机器学习模型结合提升可疑交易检测的 F1 分数并降低误报率。

Stars: 0 | Forks: 0

# FinSight AI ### 混合 AI 驱动的反洗钱交易监控系统 ![Python](https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white) ![Flask](https://img.shields.io/badge/Flask-3.0.3-000000?style=flat-square&logo=flask&logoColor=white) ![React](https://img.shields.io/badge/React-18-61DAFB?style=flat-square&logo=react&logoColor=black) ![MySQL](https://img.shields.io/badge/MySQL-8.0-4479A1?style=flat-square&logo=mysql&logoColor=white) ![scikit-learn](https://img.shields.io/badge/scikit--learn-Isolation%20Forest-F7931E?style=flat-square&logo=scikit-learn&logoColor=white) ![TailwindCSS](https://img.shields.io/badge/Tailwind-CSS-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white) ## 概述 金融犯罪每年给全球经济造成估计占全球 GDP **2% 到 5%** 的损失。传统的基于规则的反洗钱(AML)系统误报率很高,使得合规团队疲于应对;而纯机器学习方法则缺乏监管报告所需的可解释性。 **FinSight AI** 通过将确定性规则引擎与无监督 Isolation Forest 机器学习模型相结合,构成了一个单一的 **60/40 混合评分系统**来解决这个问题。其结果是 F1 分数高于任何单一方法,同时将误报率保持在足够低的水平,从而满足合规官的实际工作负载需求。 FinSight AI 是一个**全栈 AML 监控原型**,端到端地展示了这种混合方法,提供了从自动化交易评分和告警生成,到案件分配、审查和解决的完整调查工作流。所有这些都呈现在一个专为金融合规环境设计的 React 暗色主题界面中。 ## 存在的问题 | 挑战 | 影响 | | -------------------------------------------------------- | -------------------------------------------------------------- | | 单一的规则引擎会漏掉新颖、新兴的模式 | 低召回率 — 可疑交易逃避检测 | | 单一的 ML 模型会产生过多的误报 | 高 FPR — 官员浪费时间处理合法交易 | | 黑盒 ML 决策无法向监管机构解释 | 合规失败 — 没有正当理由的告警会被拒绝 | | 跨电子表格进行手动案件跟踪 | 调查周期缓慢,错过最后期限 | ## 解决方案 FinSight AI 将三个检测层融合为一个统一的工作流: ``` Transaction │ ├──► Rule Engine (four deterministic AML rules) ──► rule_score (0–100) │ │ ├──► Isolation Forest ML (12 behavioural features) ──► ml_score (0–100) │ │ └──────────────────────────────────────────────────► hybrid_score = rule×0.60 + ml×0.40 │ ┌────────────────────┘ │ hybrid_score ≥ 31 ▼ AML Alert ──► Investigation Case ──► Resolution ``` 每个告警都附有完整的**可解释性报告**:哪些规则被触发以及原因、哪些 ML 异常因素起了作用,以及一份简单明了的决策摘要——为官员采取行动提供所需的证据。 ## 核心功能 ### 1. 身份验证与安全 - 基于 JWT 的身份验证,包含 `full_access` (8 小时) 和 `2fa_pending` (10 分钟) token 类型 - 三级 RBAC:**Officer → Supervisor → Admin** - 5 次尝试失败后锁定账户(锁定 15 分钟) - Bcrypt 密码哈希与复杂度策略强制执行 - 2FA 桩流程(生成 → 验证 OTP) - 用于所有身份验证和案件事件的不可变审计日志 - Token 仅存储在 `sessionStorage` 中 — 绝不使用 `localStorage` ### 2. AML 检测引擎 #### 基于规则的检测 | 规则 | 触发条件 | 权重 | | ------------------- | ------------------------------------------------------------------------ | ------ | | 大额交易 | 单笔金额 ≥ RM 50,000 | 30% | | 结构化交易 | 24小时内低于阈值的交易累计 ≥ RM 50,000 | 25% | | 行为偏差 | 金额 ≥ 客户历史平均值的 3 倍(至少需要 5 笔先前的交易) | 30% | | 跨境风险 | 汇款渠道和/或高风险客户分类 | 15% | 每个触发的规则都会生成单独的分数,并附上易于理解的解释与该告警关联。 #### 机器学习 — Isolation Forest - 无监督异常检测:无需标注训练数据 - 200 个估计器,污染率 0.10 - 每笔交易的 **12 个行为特征**: | # | 特征 | 描述 | | --- | ----------------------- | ---------------------------------------------------- | | 1 | `amount` | 原始交易金额 (MYR) | | 2 | `log_amount` | log₁p(amount) — 压缩大值范围 | | 3 | `hour_of_day` | 0–23 — 异常小时检测 | | 4 | `day_of_week` | 0–6 (星期一 = 0) | | 5 | `customer_avg_amount` | 历史平均值(不包含当前交易) | | 6 | `amount_to_avg_ratio` | amount ÷ 客户平均值 | | 7 | `txn_count_last_24h` | 24小时窗口内的交易速度 | | 8 | `transaction_type_enc` | 标签编码的交易类型 | | 9 | `merchant_category_enc` | 标签编码的商户类别 | | 10 | `channel_enc` | 标签编码的渠道 (在线/移动/ATM/分行/POS) | | 11 | `customer_risk_enc` | 标签编码的客户风险等级 | | 12 | `is_remittance` | 用于汇款商户类别的二进制标志 | #### 混合评分 ``` hybrid_score = rule_score × 0.60 + ml_score × 0.40 Risk classification: Low 0 – 30 → No alert Medium 31 – 70 → Alert created High 71 – 100 → Alert created (priority) ``` ### 3. 告警管理 - 支持分页的告警队列,筛选条件包括:状态、风险等级、类别 - 告警详情页显示所有三个评分仪表(规则 / ML / 混合) - 完整的可解释性面板:触发规则及其各自得分、ML 异常因素、决策摘要以及最强烈的促成因素 - 告警状态生命周期:`open → under_review → closed / false_positive` ### 4. 调查工作流 - 从任何开放告警一键创建案件(manager+) - 案件队列,筛选条件包括:状态、优先级、分配的专员 - 状态工作流:`open → in_review → resolved` - 专员分配和重新分配(manager+) - 带有备注的解决方案:`confirmed_suspicious` 或 `false_positive` - 每次解决方案更新都会更改源告警状态并写入审计事件 ### 5. 仪表盘与分析 - 实时 KPI 卡片:未处理告警、高风险交易、活跃案件、总交易量 - 风险分布甜甜圈图(低 / 中 / 高) - 混合检测细分(规则标记 vs ML标记 vs 两者均有 vs 两者均无) - 最近告警表格 - ML 模型状态卡(模型版本、训练日期、已评分交易数) - 按状态和优先级划分的案例摘要 ### 6. 客户与交易监控 - 客户列表,支持搜索、风险类别和账户类型筛选 - 客户详情:完整资料、行为分析(平均金额、高峰时段、渠道细分)、近期交易历史 - 交易列表,具有 8 个筛选维度:类型、渠道、金额范围、日期范围、排序方向 - 交易详情:所有检测分数、规则细分、ML 分析、客户交叉引用 - 针对未评分交易提供“无可用分析”的优雅状态 ### 7. 模型评估仪表盘 - 并排比较规则引擎、Isolation Forest ML 和混合 AI - Recharts 条形图:所有三个系统的准确率 / 精确率 / 召回率 / F1 分数 - 误报率比较图表(越低越好) - 所有三个系统的混淆矩阵 - 带有实时 API 数据的研究见解卡片 - 仅限 supervisor 和 admin 角色访问 ## AI 模型评估 ### 数据集 由于金融数据隐私限制以及真实世界银行 AML 数据集的匮乏,我们生成了一个合成交易数据集,以模拟真实的数字银行行为和常见的可疑交易类型(大额转账、结构化模式、行为异常和跨境汇款)。 | 属性 | 值 | | ---------------------- | ----------------------- | | 交易总数 | 10,000 | | 客户数 | 150 | | 货币 | MYR (Malaysian Ringgit) | | 异常交易 | 1,300 (13%) | | 正常交易 | 8,700 (87%) | 该数据集包含一个 `seed_label` 字段(`normal`、`structuring`、`high_amount`、`abnormal`),为每笔交易编码了真实标签。关于其使用的关键点: - `seed_label` **被排除在 ML 训练之外** — Isolation Forest 模型是完全无监督的,从不查看这些标签 - `seed_label` **仅在三个评估函数中**(`get_rule_evaluation`、`get_ml_evaluation`、`get_hybrid_evaluation`)用于衡量与已知真实情况的检测准确率 - `seed_label` **绝不在前端暴露** — 它不会出现在任何告警、案件、交易详情或仪表盘视图中 ### 结果 | 系统 | 准确率 | 精确率 | 召回率 | F1 分数 | 误报率 | 标记数 | | --------------------- | --------- | --------- | --------- | --------- | ------------------- | ------- | | 规则引擎 | 91.0% | **99.5%** | 31.2% | 0.475 | **0.02%** | 407 | | Isolation Forest ML | 78.3% | 34.9% | **76.9%** | 0.480 | 21.45% | 2,865 | | **混合 AI (60/40)** | **92.3%** | 94.0% | 43.5% | **0.595** | 0.41% | 602 | **研究目标已验证:** 60/40 的混合比例在 F1 分数上优于这两个单一系统 — 比单一规则提高了 12.0 个百分点,比单一 ML 提高了 11.5 个百分点。它实现了接近规则引擎的精确率(94%),同时与单独使用规则相比大幅提高了召回率,且这一切都在低于 0.5% 的误报率下实现 — 这对于合规团队在运营上是完全可行的。 ## 技术栈 ### 后端 | 技术 | 版本 | 用途 | | ---------------- | ------- | ------------------------- | | Python | 3.14 | 运行时 | | Flask | 3.0.3 | Web 框架 + REST API | | Flask-SQLAlchemy | 3.1.1 | ORM | | MySQL / PyMySQL | 8.0 | 主数据库 | | PyJWT | 2.8.0 | JWT 身份验证 | | Flask-Bcrypt | 1.0.1 | 密码哈希 | | scikit-learn | 最新版 | Isolation Forest ML 模型 | | numpy / pandas | 最新版 | 特征工程 | | joblib | 最新版 | 模型序列化 | ### 前端 | 技术 | 版本 | 用途 | | -------------- | ------- | --------------------------------- | | React | 18 | UI 框架 | | Vite | 6 | 构建工具 + 开发服务器 | | Tailwind CSS | v3 | 实用优先的样式 | | React Router | v6 | 客户端路由 | | TanStack Query | v5 | 数据获取、缓存、mutations | | Zustand | 最新版 | 身份验证状态 | | Axios | 最新版 | HTTP 客户端 | | Recharts | 2.14.1 | 图表和数据可视化 | ## 架构 ### 系统层级 ``` ┌─────────────────────────────────────────────────────────────┐ │ React Frontend │ │ Vite 6 · React 18 · TanStack Query · Zustand · Recharts │ │ localhost:5500 — proxies /api → localhost:5000 │ └───────────────────────────┬─────────────────────────────────┘ │ HTTP / REST (JSON envelope) ┌───────────────────────────▼─────────────────────────────────┐ │ Flask API │ │ Blueprints: auth · customers · transactions · │ │ analysis · alerts · ml · hybrid · cases │ └──────────┬─────────────────────────────────────┬────────────┘ │ │ ┌──────────▼──────────┐ ┌────────────▼────────────┐ │ AML Services │ │ ML Pipeline │ │ rule_engine │ │ feature_engineering │ │ hybrid_service │ │ isolation_forest_model │ │ case_service │ │ ml_service │ │ auth_service │ └────────────┬────────────┘ └──────────┬──────────┘ │ └──────────────────┬──────────────────┘ │ ┌─────────────────────────────▼───────────────────────────────┐ │ MySQL 8.0 │ │ users · customers · transactions · transaction_analysis │ │ aml_alerts · investigation_cases · audit_logs │ │ ml_model_runs │ └─────────────────────────────────────────────────────────────┘ ``` ### AML 检测流水线 ``` Incoming Transaction │ ├──► Phase 4: Rule Engine ──────────────────────────────────────┐ │ large_amount · structuring · │ │ behaviour_deviation · cross_border_risk │ │ │ rule_score (0–100) ├──► Phase 5: Isolation Forest ML ─────────────────────────────┤ │ 12 behavioural features │ ml_score (0–100) │ unsupervised anomaly detection │ │ │ └──► Phase 6: Hybrid Scoring Engine ◄──────────────────────────┘ rule×0.60 + ml×0.40 = hybrid_score │ ┌──────────▼──────────┐ │ hybrid_score ≥ 31 │ │ AMLAlert created │ └──────────┬──────────┘ │ ┌──────────▼──────────┐ │ Phase 7/8D-2: │ │ InvestigationCase │ │ Officer assignment │ │ open → in_review │ │ → resolved │ └─────────────────────┘ ``` ### 响应信封 每个 API 响应都使用以下结构: ``` { "success": true, "data": { ... }, "error": null } ``` ## 安装说明 ### 前置条件 - Python 3.11+ 及 pip - Node.js 18+ 及 npm - MySQL 8.0 服务器(在本地运行) ### 后端设置 ``` cd backend # 创建并激活虚拟环境 python -m venv venv # Windows venv\Scripts\Activate.ps1 # macOS / Linux source venv/bin/activate # 安装依赖 pip install -r requirements.txt # 配置环境 cp .env.example .env # 使用你的 MySQL 凭据和 SECRET_KEY 编辑 .env # 初始化并填充数据库 python database/init_db.py python database/seed_data.py python database/set_passwords.py # 启动 Flask API python run.py # 运行于 http://127.0.0.1:5000 ``` ### 运行检测线(仅限首次) 数据填充后,通过完整的流水线对所有 10,000 笔交易进行评分。首先通过调用 `POST /api/auth/login` 获取 admin token。 ``` # 1. Rule engine curl -X POST http://localhost:5000/api/analysis/run-batch \ -H "Authorization: Bearer " # 2. 使用 Isolation Forest 训练和评分 curl -X POST http://localhost:5000/api/ml/train \ -H "Authorization: Bearer " curl -X POST http://localhost:5000/api/ml/analyse-batch \ -H "Authorization: Bearer " # 3. 混合评分 (创建所有 AML 警报) curl -X POST http://localhost:5000/api/hybrid/run-batch \ -H "Authorization: Bearer " ``` ### 前端设置 ``` cd frontend npm install npm run dev # 运行于 http://localhost:5500 # /api/* 会自动代理到 http://127.0.0.1:5000 ``` 在浏览器中打开 `http://localhost:5500`。必须先运行后端。 ### 环境变量 从 `backend/.env.example` 创建 `backend/.env`: ``` FLASK_ENV=development SECRET_KEY= DB_USER=root DB_PASSWORD= DB_HOST=localhost DB_PORT=3306 DB_NAME=aml_system ``` ## 开发账户 填充的数据库包含以下用于开发和演示的账户。**请勿在任何生产环境中使用这些凭据。** | 用户名 | 显示角色 | 权限 | | ------------------------------- | ---------------------- | ---------------------------------------------------------------------------- | | `AML.admin` | AML 管理员 | 完全系统访问权限、模型评估、审计审查、用户管理 | | `AML.supervisor` | AML 主管 | 案件管理、专员分配、主管审查、评估仪表盘 | | `AML.officer01`–`AML.officer06` | AML 合规官 | 告警审查、案件调查、添加备注、提交给主管审查 | 密码:`AML.admin` → `Admin@2026`,`AML.supervisor` → `Super@2026`,`AML.officer01–06` → `Officer@2026`。运行 `python database/rename_users.py`(从 `backend/` 目录下)以迁移现有的种子账户并设置密码。 ## 项目结构 ``` AML-Transaction-Monitoring-System/ ├── backend/ │ ├── run.py # Flask entry point │ ├── config.py # Development / Testing / Production configs │ ├── requirements.txt │ ├── .env.example │ ├── app/ │ │ ├── aml_config.py # Approved AML constants — do not modify │ │ ├── models/ # SQLAlchemy ORM models │ │ ├── routes/ # Flask blueprints (8 modules) │ │ ├── services/ # Business logic (auth, rule engine, ML, hybrid, cases) │ │ ├── ml/ │ │ │ ├── feature_engineering.py # 12-feature extraction │ │ │ ├── isolation_forest_model.py │ │ │ └── artifacts/ # Trained model files (gitignored) │ │ └── utils/ # Response envelope, JWT helpers, decorators │ └── database/ │ ├── init_db.py # Schema creation │ ├── seed_data.py # 10,000-transaction dataset │ ├── set_passwords.py # Bcrypt password initialisation │ └── run_phase*_tests.py # Phase-specific test suites │ ├── frontend/ │ ├── vite.config.js # Port 5500, /api proxy │ ├── tailwind.config.js # Design tokens │ └── src/ │ ├── api/ # Axios modules (auth, alerts, cases, customers, ...) │ ├── components/ # Layout, UI primitives, AppInitializer │ ├── hooks/ # useAuth │ ├── pages/ # 10 route pages │ ├── store/ # Zustand auth store │ └── utils/ # formatMYR, formatScore, humanise │ └── docs/ └── DEVELOPMENT_STATUS.md # Full technical reference ``` ## API 参考 | 组别 | 基础路径 | 端点 | | ------------ | --------------------- | --------------------------------------------------------------------------- | | 健康检查 | `/api/health` | GET | | 身份验证 | `/api/auth/*` | login, logout, me, change-password, login-history, 2fa/generate, 2fa/verify | | 客户 | `/api/customers/*` | list, detail, transactions, behaviour | | 交易 | `/api/transactions/*` | list, detail, stats | | 规则引擎 | `/api/analysis/*` | run, run-batch, result | | 告警 | `/api/alerts/*` | list, detail | | ML | `/api/ml/*` | train, analyse, analyse-batch, model-status, evaluation | | 混合 | `/api/hybrid/*` | run, run-batch, result, statistics, evaluation | | 案件 | `/api/cases/*` | create, list, statistics, detail, assign, status, resolve | 完整的端点文档位于 [`docs/DEVELOPMENT_STATUS.md`](docs/DEVELOPMENT_STATUS.md) 中。 ## 项目状态 | 组件 | 状态 | | ------------------------------- | ------------------------------------------------------------------- | | 后端 API (阶段 0–7) | ✅ 完成 | | AML 检测流水线 | ✅ 完成 — 已评分 10,000 笔交易 | | React 前端 (阶段 8A–8D-4) | ✅ 完成 | | 模型评估 | ✅ 完成 — 混合 F1: 0.595 | | 后端测试 | ✅ 完成 — 289/289 项后端服务、单元和冒烟测试通过 | | 前端集成 | ✅ 完成 — 所有页面已连接到实时 API | | 最终 UI 验证与优化 | ✅ 完成 | ### 后端服务、单元和冒烟测试结果 这些结果仅涵盖后端业务逻辑验证。不包含前端自动化测试。 | 阶段 | 测试套件 | 结果 | | ------------------------- | --------------------------- | ------------- | | 阶段 4 — 规则引擎 | 59 个隔离 + 15 个实时冒烟 | ✅ 74/74 | | 阶段 5 — ML 模型 | 39 个隔离 + 28 个实时冒烟 | ✅ 67/67 | | 阶段 6 — 混合评分 | 45 个隔离 + 25 个实时冒烟 | ✅ 70/70 | | 阶段 7 — 案件管理 | 53 个隔离 + 25 个实时冒烟 | ✅ 78/78 | | **总计** | | **✅ 289/289** | ## AML 配置参考 所有检测常量均在 `backend/app/aml_config.py` 中定义,未经审查不得修改。 | 参数 | 值 | | --------------------------------- | ------------------------------- | | 货币 | MYR (RM) | | 大额交易阈值 | RM 50,000 | | 结构化交易窗口 | 24 小时 | | 行为偏差阈值 | 客户历史平均值的 3 倍 | | 最小交易历史记录 | 5 笔先前的交易 | | 规则权重 — large_amount | 30% | | 规则权重 — structuring | 25% | | 规则权重 — behaviour_deviation | 30% | | 规则权重 — cross_border_risk | 15% | | 混合比例 — 规则 | 60% | | 混合比例 — ML | 40% | | 告警阈值 | hybrid_score ≥ 31 (中等风险) | ## 安全说明 - Token 存储在 `sessionStorage` 中,并在注销或会话过期时清除 - `seed_label` 字段(用于评估)绝不会在任何前端视图中暴露 - 所有风险评分均在服务器端计算;前端不执行任何评分逻辑 - 所有密码存储均使用 Bcrypt;明文密码从不被记录或返回 - 本项目中的 2FA 实现是一个**原型桩** — 为了演示目的,它会在 API 响应中返回 OTP 代码,并未集成到短信或电子邮件服务提供商中 ## 致谢 # <<<<<<< HEAD 作为毕业设计 (FYP) 构建,探索混合 AI 系统在金融犯罪检测中的应用。FinSight AI 是一个**研究原型和模拟的金融合规平台**,它不是经过认证的银行产品,也未经真实交易数据或监管 AML 标准验证。合成数据集、检测阈值和评分权重仅供学术演示使用。 作为毕业设计 (FYP) 构建,探索混合 AI 系统在金融犯罪检测中的应用。FinSight AI 是一个**研究原型和模拟的金融合规平台**,它不是经过认证的银行产品,也未经真实交易数据或监管 AML 标准验证。合成数据集、检测阈值和评分权重仅供学术演示使用。
标签:Apex, Flask, React, Syscalls, 反洗钱, 异常检测, 机器学习, 逆向工具, 金融风控