交易欺诈团伙
1. 简介
交易欺诈团伙是指一群相互勾结、从事欺诈活动(例如通过多个账户转移资金)的人员。这些团伙跨越不同地理位置,并采取多种策略来逃避检测。对于金融机构而言,检测这些团伙至关重要,特别是在“或有补偿模型 (CRM)”得到加强的背景下。
2. 应用场景
金融机构实施并阻止交易欺诈的需求已存在多年,且是许多法规的核心要求。
一个典型的例子是为保护客户免受“授权推送支付 (APP)”诈骗而进行的合规强化。英国已加强了对客户的保护,并要求金融机构承担更重大的责任,以帮助减轻此类诈骗带来的风险。
授权推送支付 (APP) 欺诈是增长最快的诈骗方式之一。2022 年上半年损失超过 2.49 亿英镑,与 2020 年同期相比增长了 30%。参考资料
了解网络内部的欺诈行为是减轻这些诈骗的多种方法之一,因为您可以识别出银行系统中存在的欺诈账户。
5. 建模
本节将展示示例图上的 Cypher 查询示例。其目的是说明查询的样子,并提供有关如何在实际环境中构建数据的指南。我们将在一个由几个节点以环形结构连接的小型交易网络图中进行演示。
示例图将基于以下数据模型:
4.2. 演示数据
以下 Cypher 语句将在 Neo4j 数据库中创建示例图:
// Create all accounts
CREATE (a1:Account {accountNumber: 1})
CREATE (a2:Account {accountNumber: 2})
CREATE (a3:Account {accountNumber: 3})
CREATE (a4:Account {accountNumber: 4})
// Create relationships between accounts
CREATE (a1)-[:PERFORMS]->(:Transaction {transactionId: "TXN001", amount: 1000, currency: "gbp", date: datetime()-duration({days: 3})})-[:BENEFITS_TO]->(a2)
CREATE (a2)-[:PERFORMS]->(:Transaction {transactionId: "TXN002", amount: 900, currency: "gbp", date: datetime()-duration({days: 2})})-[:BENEFITS_TO]->(a3)
CREATE (a3)-[:PERFORMS]->(:Transaction {transactionId: "TXN003", amount: 810, currency: "gbp", date: datetime()-duration({days: 1})})-[:BENEFITS_TO]->(a4)
CREATE (a4)-[:PERFORMS]->(:Transaction {transactionId: "TXN004", amount: 729, currency: "gbp", date: datetime()})-[:BENEFITS_TO]->(a1)
5. Cypher 查询
5.1. 简单交易环
在此查询中,我们将识别符合以下要求的环:
-
账户节点应通过
PERFORMS和BENEFITS_TO关系进行连接。 -
确保遵循交易的方向(非双向查询)。
-
查找长度大于 3 笔且小于 7 笔交易的环。
|
此 Cypher 查询与 Neo4j 5.9+ 版本兼容。 |
// Neo4j Compatability: v5.9+
// Identify simple transaction ring
MATCH path=(a:Account)(()-[:PERFORMS]->()-[:BENEFITS_TO]->()){3,6}(a)
RETURN path
5.2. 无重复账户的交易环
在此查询中,我们将识别符合以下要求的环:
-
账户节点应通过
PERFORMS和BENEFITS_TO关系进行连接。 -
确保遵循交易的方向(非双向查询)。
-
查找长度大于 3 笔且小于 7 笔交易的环。
-
确保环由唯一的账户组成。
|
此 Cypher 查询与 Neo4j 5.9+ 版本兼容。 |
// Neo4j Compatability: v5.9+
// Identify transaction ring with no duplicate accounts
MATCH path=(a:Account)((a_i)-[:PERFORMS]->(tx)-[:BENEFITS_TO]->(a_j)){3,6}(a)
// Here we ensure that one path has unique people involved in the chain
WHERE size(apoc.coll.toSet(a_i)) = size(a_i)
// Return all paths
RETURN path
5.3. 按时间顺序排列的交易环
在此查询中,我们将识别符合以下要求的环:
-
账户节点应通过
PERFORMS和BENEFITS_TO关系进行连接。 -
确保遵循交易的方向(非双向查询)。
-
查找长度大于 3 笔且小于 7 笔交易的环。
-
确保环由唯一的账户组成
-
确保
Transaction节点按时间顺序排列
|
此 Cypher 查询与 Neo4j 5.9+ 版本兼容。 |
// Neo4j Compatability: v5.9+
// Identify transaction ring where dates are in chronological order
MATCH path=(a:Account)-[:PERFORMS]->(first_tx)
// Relationship validation
((tx_i)-[:BENEFITS_TO]->(a_i)-[:PERFORMS]->(tx_j)
// Ensures the dates are in chronological order
WHERE tx_i.date < tx_j.date
)*
(last_tx)-[:BENEFITS_TO]->(a)
// Here we ensure that one path has unique people involved in the chain
WHERE size(apoc.coll.toSet([a]+a_i)) = size([a]+a_i)
// Return all paths
RETURN path
5.4. 金额扣减 20% 的交易环
当资金通过欺诈团伙流动时,账户之间转移的金额通常会因最高 20% 的手续费而减少。为了体现这一点,我们的查询将允许每笔交易有最高 20% 的扣减。
在此查询中,我们将识别符合以下要求的环:
-
账户节点应通过
PERFORMS和BENEFITS_TO关系进行连接。 -
确保遵循交易的方向(非双向查询)。
-
查找长度大于 3 笔且小于 7 笔交易的环。
-
确保环由唯一的账户组成
-
确保
Transaction节点按时间顺序排列 -
检查
Transaction节点的金额是否在上一次Transaction金额的 20% 范围内。
|
此 Cypher 查询与 Neo4j 5.9+ 版本兼容。 |
// Neo4j Compatability: v5.9+
// Identify transaction ring where dates are in chronological order
MATCH path=(a:Account)-[:PERFORMS]->(first_tx)
// Relationship validation
((tx_i)-[:BENEFITS_TO]->(a_i)-[:PERFORMS]->(tx_j)
// Ensures the dates are in chronological order
WHERE tx_i.date < tx_j.date
// Checks that there is less than a 20% difference from the last `Transaction` amount to the next
AND 0.80 <= tx_i.amount / tx_j.amount <= 1.00
)*
(last_tx)-[:BENEFITS_TO]->(a)
// Here we ensure that one path has unique people involved in the chain
WHERE size(apoc.coll.toSet([a]+a_i)) = size([a]+a_i)
// Return all paths
RETURN path
5.4.1. 查询在做什么?
所给的 Cypher 查询旨在识别图数据库中的可疑交易环,其中账户通过交易连接。该查询查找符合特定条件的交易循环,然后返回这些循环。让我们逐步分解该查询。
1 - 识别交易链的起点和终点
MATCH path=(a:Account)<-[:PERFORMS]-(first_tx)
(last_tx)-[:BENEFITS_TO]->(a)
这部分识别了涉及某个账户 (a:Account) 的交易链的起点和终点。first_tx 是链中的第一笔交易,last_tx 是最后一笔交易。
2 - 关系验证和中间交易
((tx_i)-[:BENEFITS_TO]->(a_i)<-[:PERFORMS]-(tx_j)
WHERE tx_i.date < tx_j.date
AND 0.80 <= tx_i.amount / tx_j.amount <= 1.00
)*
查询的这部分指定了链中中间交易的条件。
(tx_i)-[:BENEFITS_TO]->(a_i)<-[:PERFORMS]-(tx_j)
指定交易 tx_i 流向账户 a_i,且 tx_j 从该账户流出。
(tx_i.date < tx_j.date)
这确保了交易按时间顺序排列。
0.80 <= tx_i.amount / tx_j.amount <= 1.00
同时检查交易金额是否彼此在 20% 的差异范围内。
3 - 确保链中账户的唯一性
WHERE size(apoc.coll.toSet([a]+a_i)) = size([a]+a_i)
这确保了链中的所有账户都是唯一的。
apoc.coll.toSet([a]+a_i)
将链中的账户列表转换为集合,以删除重复项。
size([a]+a_i)
得出链中账户的总数。
4 - 返回匹配的链
RETURN path
最后,查询返回所有符合上述条件的路径。
总之,此查询是通过寻找具有特定特征的闭环交易来识别潜在可疑活动的另一种方法。与第一个查询不同,此查询使用 PERFORMS 和 BENEFITS_TO 关系来描述账户之间的资金流向。