交易欺诈团伙

1. 简介

交易欺诈团伙是指一群相互勾结、从事欺诈活动(例如通过多个账户转移资金)的人员。这些团伙跨越不同地理位置,并采取多种策略来逃避检测。对于金融机构而言,检测这些团伙至关重要,特别是在“或有补偿模型 (CRM)”得到加强的背景下。

2. 应用场景

金融机构实施并阻止交易欺诈的需求已存在多年,且是许多法规的核心要求。

一个典型的例子是为保护客户免受“授权推送支付 (APP)”诈骗而进行的合规强化。英国已加强了对客户的保护,并要求金融机构承担更重大的责任,以帮助减轻此类诈骗带来的风险。

授权推送支付 (APP) 欺诈是增长最快的诈骗方式之一。2022 年上半年损失超过 2.49 亿英镑,与 2020 年同期相比增长了 30%。参考资料

了解网络内部的欺诈行为是减轻这些诈骗的多种方法之一,因为您可以识别出银行系统中存在的欺诈账户。

3. 解决方案

Neo4j 提供了一种改进的方法来揭露交易欺诈团伙和其他复杂的诈骗活动,具有高度准确性,并能够实时阻止高级欺诈场景。

图数据库如何提供帮助?

实施 Neo4j 可以帮助执行以前无法进行的分析。以下是此类场景的示例:

  • 执行基于团伙的查询,以追踪发送给内部和外部受益人的交易。

  • 实时对交易团伙进行高级分析,以了解其模式。

  • 了解潜在欺诈活动中常见的转出和转入账户。

5. 建模

本节将展示示例图上的 Cypher 查询示例。其目的是说明查询的样子,并提供有关如何在实际环境中构建数据的指南。我们将在一个由几个节点以环形结构连接的小型交易网络图中进行演示。

示例图将基于以下数据模型:

4.1. 数据模型

fs transaction ring data node version model

4.1.1 必填字段

以下是开始所需的字段

Account(账户)节点

  • accountNumber:包含账户的名称。这可以更改为您用于 Account 的任何其他标识符。

Transaction(交易)节点

  • transactionId:交易的唯一系统标识符。

  • amount:包含账户之间转移的金额。

  • date:包含交易发生的日期。

PERFORMS(执行)关系

  • 无需属性

BENEFITS_TO(受益于)关系

  • 无需属性

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)

4.3. Neo4j 架构

// Show neo4j scheme
CALL db.schema.visualization()

它将提供以下响应

fs transaction ring node version schema

在摄取数据后,Neo4j 会解释图模型。在模型中,我们可以观察到一个 Account 节点通过一个 Transaction 节点以及 PERFORMSBENEFITS_TO 两个关系连接到另一个 Account 节点。

5. Cypher 查询

5.1. 简单交易环

在此查询中,我们将识别符合以下要求的环:

  • 账户节点应通过 PERFORMSBENEFITS_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. 无重复账户的交易环

在此查询中,我们将识别符合以下要求的环:

  • 账户节点应通过 PERFORMSBENEFITS_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. 按时间顺序排列的交易环

在此查询中,我们将识别符合以下要求的环:

  • 账户节点应通过 PERFORMSBENEFITS_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% 的扣减。

在此查询中,我们将识别符合以下要求的环:

  • 账户节点应通过 PERFORMSBENEFITS_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 关系来描述账户之间的资金流向。

© . This site is unofficial and not affiliated with Neo4j, Inc.