金融犯罪偵測日益仰賴圖資料函式庫技術,因其能有效處理複雜的交易關係。傳統關聯式資料函式庫在處理多層級關聯查詢時效能下降,而圖資料函式庫則能以圖形遍歷快速識別潛在的洗錢模式,例如迴圈資金流動。透過分析交易傳送方和接收方的關聯帳戶網路,並比對網路間的支付活動,能有效揭露隱藏的犯罪行為。在偵測迴圈交易時,圖資料函式庫的雙向搜尋技術能大幅提升查詢效率,快速識別資金迴流的模式,即使中間人轉移金額不一致,也能有效偵測。
偵測金融犯罪模式:多交易網路分析與迴圈偵測
金融犯罪分析師經常需要偵測複雜的交易模式,尤其是在洗錢和詐欺案件中。這些犯罪行為通常涉及多個當事人之間的資金流動,因此需要有效的圖形遍歷技術來揭露這些隱藏的關係。
多交易網路分析(Multitransaction Analysis)
在給定一筆交易後,分析師通常會關注兩個主要的網路:第一個網路由交易的傳送方相關帳戶組成,第二個網路則由接收方相關帳戶組成。接著,我們需要在這兩個網路之間尋找支付活動,以揭露潛在的金融犯罪行為。
圖形遍歷模式(Graph Traversal Pattern)
圖5-3展示了用於尋找傳送方和接收方交易網路的圖形遍歷模式。這個查詢首先選取引發該交易的使用者節點(User elements),並透過遍歷User_Transfer_Transaction
和User_Receive_Transaction
邊緣型別來實作。
Sender_receiver (ANY) = SELECT t
FROM Start:s -((<User_Receive_Transaction|<User_Transfer_Transaction):e)- :t
在這個查詢中,我們從一筆交易(source_transaction
)出發,遍歷到使用者節點,這是User_Receive_Transaction
和User_Transfer_Transaction
邊緣的反向。因此,方向箭頭指向左邊,並且位於邊緣型別名稱的左側。
判斷傳送方和接收方
我們使用CASE陳述式來判斷使用者是交易的接收方還是傳送方。如果使用者透過User_Receive_Transaction
連線到交易,我們設定@from_receiver
為TRUE,並將該使用者加入@@receiver_set
。否則,該使用者是交易的傳送方,我們設定@from_sender
為TRUE,並將其加入@@sender_set
。
CASE WHEN e.type == "User_Receive_Transaction" THEN
t.@from_receiver += TRUE,
@@receiver_set += t
ELSE
t.@from_sender += TRUE,
@@sender_set += t
擴充套件傳送方和接收方網路
現在我們知道了傳送方和接收方,接下來我們要找出屬於這些當事人的其他使用者節點。也就是說,我們遍歷User_to_Device
或User_to_Payment
邊緣,並在四跳之內(WHILE Start.size() >0 LIMIT MAX_HOPS DO
)將使用者節點加入@@sender_set
或@@receiver_set
。
WHILE Sender_receiver.size() >0 LIMIT MAX_HOPS DO
Sender_receiver = SELECT t
FROM Sender_receiver:s -((User_to_Device|User_to_Payment):e)- :t
WHERE t.@from_receiver == FALSE AND t.@from_sender == FALSE
ACCUM
t.@from_receiver += s.@from_receiver,
t.@from_sender += s.@from_sender,
@@edges_to_display += e
POST-ACCUM
CASE WHEN t.type == "User" AND t.@from_sender == TRUE THEN
@@sender_set += t
WHEN t.@from_receiver == TRUE THEN
@@receiver_set += t
尋找連線交易
形成傳送方和接收方群組後,我們現在尋找除了原始交易之外,連線這兩個群組的交易。首先,我們找出與接收方群組相鄰的交易:
Receivers = {@@receiver_set};
Receivers = SELECT t
FROM Receivers:s -((User_Receive_Transaction>|User_Transfer_Transaction>):e)- :t
....
接著,我們找出與傳送方群組相鄰的交易:
Senders = {@@sender_set};
Connecting_transactions = SELECT t
FROM Senders:s -((User_Receive_Transaction>|User_Transfer_Transaction>):e)- :t
WHERE t != input_transaction
ACCUM
t.@from_sender += s.@from_sender,
@@edges_to_display += e
HAVING t.@from_receiver AND t.@from_sender;
執行結果分析
使用建議的交易ID(32、33或37)執行查詢後,輸出結果可能會顯示為一個連線的社群,因為除了輸入交易之外,至少有一筆交易將傳送方社群連線到接收方社群。嘗試不同的輸入ID,輸出結果可能會顯示為兩個獨立的社群,僅由輸入交易連線。
迴圈偵測(Circle Detection)
洗錢的本質是將資金在多個當事人之間轉移,使其來源難以追蹤。犯罪者通常使用多種路由方案來掩蓋其非法資金的來源。其中一種常見的轉移方案是將資金透過多箇中間人轉移,最終傳回到其中一個傳送方。在這種情況下,資金流動呈現迴圈模式。
#### 內容解密:
此段落描述了洗錢的常見手法和圖形分析的應用。圖形遍歷技術可以用於偵測資金流動的迴圈模式,從而揭露潛在的洗錢行為。
圖表翻譯:
此圖展示了用於尋找傳送方和接收方交易網路的圖形遍歷模式。透過遍歷不同的邊緣型別,可以有效地找出相關的使用者節點和交易記錄,從而揭露潛在的金融犯罪行為。
隨著金融犯罪手段的不斷演變,圖形分析技術也需要不斷更新和改進。未來,我們可以期待更先進的圖形遍歷演算法和更有效的資料分析方法,以應對日益複雜的金融犯罪挑戰。同時,跨領域的合作和技術創新將是提升金融安全的重要推動力。
偵測金融犯罪模式中的迴圈資金流動
在金融犯罪偵測中,迴圈資金流動是一種常見的洗錢手法。透過圖資料函式庫,我們可以有效地偵測這種模式。與傳統的關聯式資料函式庫相比,圖資料函式庫能夠更快速地進行圖遍歷(graph traversal),從而更有效地識別出複雜的交易模式。
圖資料函式庫的優勢
圖資料函式庫能夠以更直觀的方式呈現交易之間的關係,並且能夠高效地進行圖查詢。在偵測迴圈資金流動時,圖資料函式庫可以從一個交易節點跳躍到下一個節點,直到回到起始節點,這種操作在圖資料函式庫中被稱為圖遍歷。
圖遍歷的效率
在關聯式資料函式庫中,這種操作需要進行多次表連線(table join),而表連線是一種非常耗費資源的操作。相比之下,圖資料函式庫中的圖遍歷操作要高效得多。
迴圈資金流動的例子
考慮以下例子:Adam 向 Ben 轉帳 $100,Ben 向 Cor 轉帳 $60,Cor 向 Daisy 轉帳 $40,最後 Daisy 又將 $100 轉回給 Adam,形成了一個迴圈。在這個例子中,每個中間人轉出的金額與收到的金額並不相同,這是為了增加交易的複雜性,使得偵測更加困難。
圖示說明
graph LR A[Adam] -->|100| B[Ben] B -->|60| C[Cor] C -->|40| D[Daisy] D -->|100| A
圖表翻譯: 此圖示展示了一個迴圈資金流動的例子。Adam 向 Ben 轉帳 $100,Ben 向 Cor 轉帳 $60,Cor 向 Daisy 轉帳 $40,最後 Daisy 又將 $100 轉回給 Adam,形成一個迴圈。
查詢迴圈交易鏈
查詢 circle_detection
的目的是找出所有從特定使用者(source_id
)開始的迴圈交易鏈,並且限制每個迴圈中的交易次數不超過設定的最大值(max_transactions
)。由於每個交易涉及兩次跳躍(傳送者 → 交易 → 接收者),因此迴圈中的跳躍次數最多可以是交易次數的兩倍。
查詢邏輯
為了確保查詢的效率,實作中使用了雙向搜尋技術,即同時從起點向前搜尋和從終點向後搜尋。當兩個搜尋路徑相交時,就形成了一條完整的路徑。
Seed = {source_id};
Seed = SELECT src
FROM Seed:src - ((User_Transfer_Transaction>|User_Receive_Transaction>):e)
- Transaction:tgt
ACCUM
CASE WHEN
e.type == "User_Transfer_Transaction"
THEN
@@min_src_send_time += tgt.ts
ELSE
@@max_src_receive_time += tgt.ts
END
...
HAVING @@max_src_receive_time >= @@min_src_send_time;
內容解密:
這段程式碼首先初始化一個名為 Seed
的集合,包含起始使用者 source_id
。然後,它進行了一次雙向搜尋:向前搜尋 User_Transfer_Transaction
和向後搜尋 User_Receive_Transaction
。這裡計算了 source_id
傳送交易的最早時間(@@min_src_send_time
)和接收交易的最晚時間(@@max_src_receive_time
),並確保 @@max_src_receive_time >= @@min_src_send_time
,以保證交易的時序正確性。
雙向搜尋的實作
在第一階段(Phase1),查詢從 source_id
開始,向前和向後各進行兩次跳躍(相當於一次交易)。在我們的例子中,這意味著從 Adam 到 Ben(向前),以及從 Adam 到 Daisy(向後)。這種雙向搜尋持續進行,直到每個方向都走完最大迴圈大小的一半。
程式碼範例
Fwd_set = SELECT tgt
FROM Fwd_set:src - (User_Transfer_Transaction>:e) - Transaction:tgt
WHERE tgt.ts >= @@min_src_send_time
AND src.@min_fwd_dist < GSQL_INT_MAX
AND tgt.@min_fwd_dist == GSQL_INT_MAX
ACCUM tgt.@min_fwd_dist += src.@min_fwd_dist +1
... // POST-ACCUM 子句檢查時間和步數約束
;
Fwd_set = SELECT tgt
FROM Fwd_set:src - (<User_Receive_Transaction:e) - User:tgt
WHERE src.@min_fwd_dist < GSQL_INT_MAX
AND tgt.@min_fwd_dist == GSQL_INT_MAX
ACCUM tgt.@min_fwd_dist += src.@min_fwd_dist +1
... // POST-ACCUM 子句檢查時間和步數約束
HAVING tgt != source_id;
內容解密:
這段程式碼實作了雙向搜尋中的向前搜尋部分。它首先從 Fwd_set
中的每個節點 src
出發,沿著 User_Transfer_Transaction
邊到達 Transaction
節點 tgt
。然後,它檢查 tgt
的時間戳是否大於等於 @@min_src_send_time
,並更新 tgt
的最小向前距離 @min_fwd_dist
。接著,它從 src
出發,沿著 User_Receive_Transaction
邊到達 User
節點 tgt
,並進行類別似的檢查和更新。這確保了搜尋路徑的有效性和時序正確性。
驗證迴圈路徑
在第二階段(Phase2),查詢繼續沿著之前在反向搜尋中遍歷過的路徑向前搜尋,並且確保交易時間戳是遞增的。如果在第一階段中已經遍歷到 Ben → Cor,那麼在第二階段就可以繼續到 Cor → Daisy,但前提是之前已經遍歷過 Daisy → Cor,並且時間戳是遞增的。
程式碼範例
Fwd_set = SELECT tgt
FROM Fwd_set:src - (User_Transfer_Transaction>:e) - Transaction:tgt
// tgt 必須在之前的反向搜尋中被遍歷過
WHERE tgt.@min_rev_dist < GSQL_INT_MAX
AND tgt.ts >= @@min_src_send_time
AND src.@min_fwd_dist < GSQL_INT_MAX
AND tgt.@min_fwd_dist == GSQL_INT_MAX
ACCUM tgt.@min_fwd_dist += src.@min_fwd_dist +1
POST-ACCUM
CASE WHEN
tgt.@min_fwd_dist < GSQL_INT_MAX
AND tgt.@min_rev_dist < GSQL_INT_MAX
AND tgt.@min_fwd_dist + tgt.@min_rev_dist
<=2 * STEP_HIGH_LIMIT
THEN
tgt.@is_valid = TRUE
END;
內容解密:
這段程式碼繼續在 Fwd_set
上進行向前搜尋,但只沿著之前在反向搜尋中遍歷過的路徑,並且檢查時間戳是否遞增。如果某個節點 tgt
同時滿足向前和向後的最短距離,並且總步數不超過限制,則將其標記為有效(@is_valid = TRUE
)。
結果呈現
經過第二階段後,查詢已經找到了所有的迴圈路徑。在第三階段(Phase3),查詢會遍歷這些迴圈路徑,並標記相關的節點和邊,以便進行視覺化呈現。圖 5-5 和圖 5-6 展示了不同最大迴圈大小下的偵測結果。
圖示說明
graph LR A[User1] -->|Transaction1| B[User2] B -->|Transaction2| C[User3] C -->|Transaction3| D[User4] D -->|Transaction4| A
圖表翻譯: 此圖示展示了另一個迴圈資金流動的例子。User1 向 User2 轉帳,User2 向 User3 轉帳,User3 向 User4 轉帳,最後 User4 又將資金轉回給 User1,形成一個迴圈。
分析連線以獲得更深入的洞察
在前面的章節中,我們瞭解到將資料表示為圖形能夠更深入、更廣泛地檢視資料,從而更準確地回答問題並獲得更多洞察。我們已經研究了幾個使用案例,展示瞭如何將資料建模為圖形以及如何查詢它。現在,我們希望對圖形分析進行更系統的研究。什麼是圖形分析?有哪些具體的技術可以用於圖形分析?
完成本章後,您應該能夠:
- 定義圖形分析並描述它與一般資料分析的不同之處
- 瞭解圖形分析的要求和一些關鍵方法,包括廣度優先搜尋和平行處理
- 定義對分析有用的幾類別圖形演算法
- 列出每類別中的幾個演算法,並給出實際應用的例子
瞭解圖形分析
首先,讓我們定義一般意義上的資料分析。資料分析是對一批資料進行有用的觀察和得出結論,以幫助人們理解資料的意義。分析將資料轉化為有用的洞察。圖形分析做的事情相同,只是資料的結構會影響我們將檢查哪些資料以及按照什麼順序。連線是一種資料形式,連線驅動了分析的過程。
圖形分析的另一個顯著特點是,它擅長回答有關連線的問題。你可以問在一個表格資料集中,客戶A和客戶B之間的連線鏈最短是多少,但如果你的資料是一個圖形,你就更能夠進行這種分析。我們可以總結如下:
圖形分析是對連線資料進行觀察和得出結論,以及對連線資料的分析。
分析的要求
要對一批資料進行觀察,顯然我們必須檢查所有相關資料或相關子集,並且會涉及一些形式的計算。如果我們的資料集包含某一年的所有銷售交易,一個簡單的分析就是計算每月的總銷售額,然後看看銷售額是呈上升趨勢、下降趨勢還是更複雜的變化。如果資料被組織成表格,那麼我們可以想像沿著表格掃描,讀取每一行。我們還需要一些地方來儲存結果——每月的銷售額。事實上,我們可能需要在讀取每一行時保持一個執行總計,並將其銷售額新增到其中一個每月的總和中。
圖形分析有類別似的要求:讀取所有相關資料,對每個資料點進行計算和決策,儲存臨時結果,並報告最終結果。圖形分析和表格分析之間的主要區別在於,圖形的連線影響了資料項的性質和我們掃描資料的順序。還有一些方法或架構的選擇,可以使計算和記憶體儲存更有效率。
圖形遍歷方法
在圖形分析中,我們沿著連線從一個資料點到下一個資料點。使用圖形是一張步行路徑網路的比喻,通常說我們在圖形上行走或遍歷。起初,似乎你想跟隨一連串的連線,就像一個人走路一樣。然而,當你檢視你想要完成的任務時,你可能會發現,在跟隨連線的連線之前,先檢視你當前位置的所有直接連線會更有意義。跟隨一連串的連線稱為深度優先搜尋(DFS),而在移動到下一層連線之前,先檢視所有直接連線稱為廣度優先搜尋(BFS)。我們在第2章中簡要提到了這些方法。
下面的工作流程解釋了BFS和DFS。區別在於工作被處理的順序,反映在Places_to_Explore列表中的頂點順序:
- 將源頂點放入一個名為Places_to_Explore的處理列表中。作為一個列表,它有一個順序,從前到後。
from collections import deque
def breadth_first_search(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
vertex = queue.popleft()
print(vertex, end=" ")
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
# 使用範例
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
breadth_first_search(graph, 'A')
#### 內容解密:
此程式碼展示了廣度優先搜尋(BFS)的實作。首先,我們使用一個集合(set)來記錄已存取的節點,以避免重複存取。我們使用一個佇列(queue)來儲存待存取的節點。從起始節點開始,我們將其加入佇列和已存取集合。然後進入迴圈,每次從佇列中取出一個節點,印出該節點,並將其未被存取的鄰居加入佇列和已存取集合。這個過程持續進行,直到佇列為空,即所有可達節點都被存取過。
### 圖形分析的應用
圖形分析在許多領域都有應用,包括社交網路分析、詐騙檢測、推薦系統等。透過分析圖形結構,我們可以發現隱藏的模式和關係,從而獲得更深入的洞察。
```mermaid
graph LR
A[客戶A] -->|交易|> B(客戶B)
A -->|交易|> C(客戶C)
B -->|交易|> D(客戶D)
C -->|交易|> E(客戶E)
D -->|交易|> F(客戶F)
E -->|交易|> F
F -->|可疑行為|> G[報告系統]
此圖示展示了一個簡單的客戶交易圖形,其中客戶之間的交易被表示為連線。透過分析這個圖形,可以檢測出可疑的交易模式。
**圖表翻譯:**
此圖表呈現了一個客戶之間的交易關係圖。客戶A與客戶B和客戶C有交易,客戶B和客戶C又分別與其他客戶有交易,最終指向了一個可疑行為的報告系統。透過分析這些連線,可以檢測出潛在的詐騙或洗錢行為。