← Back
CASE 001

Financial Crime & Fraud Analytics

Transaction Monitoring Case Study

PythonPandasSQLBehavioural AnalyticsTransaction Monitoring
Case status: Investigated

An end-to-end transaction monitoring case study focused on detecting, prioritising and investigating unusual customer behaviour using behavioural baselines, calibrated thresholds and transaction-network analysis.

follow the behaviour, not just the transaction.
Recruiter Overview

the 30-second version

Problem

Spot potentially suspicious behaviour across 50,000 transactions and 2,500 customers, without treating a rule match as proof that laundering occurred.

What I built

A rule-based monitoring workflow: customer behaviour profiling, calibrated detection thresholds, behavioural alert rules and risk-based case prioritisation for investigation.

Results

50K

Transactions

2.5K

Customers

2,007

Alerts

1,366

Cases

33

Critical cases

Rule-based red flags support investigation prioritisation; they do not determine whether laundering occurred.

Skills demonstrated

PythonPandasSQLBehavioural AnalyticsThreshold CalibrationAlert Prioritisation
Technical Deep Dive

what was actually being investigated

Case
Overview

I built a rule-based transaction monitoring workflow that turns raw transaction data into customer behaviour profiles, generates alerts and prioritises investigation cases using thresholds calibrated from the data itself.

Methodology note

I did not use the dataset's laundering labels as the analytical answer. I developed detection logic independently from customer behaviour and transaction patterns.

Brief_01

Objective

Detect unusual customer transaction behaviour and identify cases requiring investigation.

Brief_02

Data

50,000 transactions and 2,500 customer profiles.

Brief_03

Approach

Behavioural baselines, threshold calibration, rule-based monitoring and network analysis.

Brief_04

Tools

PythonPandasSQLExploratory Analytics

behaviour > isolated transactions

Investigation at a glance

50K

Transactions analysed

2.5K

Customer profiles

3

Behavioural detection rules

2,007

Alerts generated

1,366

Investigation cases

33

Critical cases

I built an end-to-end behavioural transaction monitoring workflow that compares customer activity against expected and historical behaviour, generates rule-based alerts, consolidates them into investigation cases and assigns risk-based case priority.

Detection Pipeline

From raw behaviour to a prioritised case

Customer Behaviour Profiling
Feature Engineering
Threshold Calibration
Detection Rules
Alert Generation
Case Consolidation
Severity Assessment
Case Prioritisation
Post-analysis Validation

Every stage below is covered in detail further down this page, from how I profiled customer behaviour through to how I checked the rule-based prioritisation against the dataset's ground truth.

nine stages, one investigation

End-to-end pipeline

How the investigation works

01

Customer profiling

Customer Profiling

I used expected monthly volume and customer attributes to establish behavioural context.

source: customer_profile.py

02

Behavioural baseline

Monthly Baseline

I aggregated transactions by customer and month to build a behavioural baseline for every account.

source: monthly_behavior.py

03

Feature engineering

Metric Engineering

Seven behavioural metrics per customer-month: total volume, transaction count, average and maximum amount, unique receivers, and volume/maximum vs expected.

source: behaviour_features.py

seven signals, one profile

04

Calibration

Threshold Calibration

I derived thresholds from empirical distributions rather than picking them manually.

source: threshold_calibration.py

05

Investigation

Alert Investigation

I reviewed triggered customers using transaction patterns, timing, counterparties and customer context.

source: case_review.py

rules flag, investigators decide

three signals. three different behaviours.

Detection Rules

Evidence_R01
RULE_01Profile Deviation

HIGH_MONTHLY_VOLUME

Customer activity was first normalised against each customer's own expected monthly volume. The anomaly threshold was then derived from the portfolio-level distribution of these behavioural ratios, set at the 95th percentile (≈3.82×).

Metric

total_monthly_volume / expected_monthly_volume

Alerts

723

Threshold3.82×

one threshold, drawn from portfolio-wide behaviour, not set per customer

Evidence_R02
RULE_02Transaction Concentration

LARGE_SINGLE_TXN

Compares a customer's largest single transaction in a month against their expected monthly volume.

Metric

largest_transaction / expected_monthly_volume

Alerts

723

Threshold2.58×

95th percentile of observed customer-month behaviour

Evidence_R03
RULE_03Behavioural Deviation

CROSS_BORDER_SPIKE

Compares a customer's current cross-border transaction ratio against their own historical baseline. A spike signals a behavioural change, not that cross-border activity is inherently suspicious.

Metric

current_cross_border_ratio - historical_cross_border_average

Alerts

561

Threshold+0.40

alerts when cross-border share rises more than 40 points versus the customer's own baseline

this is where money moves, not just grows

Threshold Calibration

Thresholds, derived from the data

not guessed. measured.

Rather than picking round numbers by intuition, I first normalised each customer's monthly activity against their own expected_monthly_volume, then calibrated two of the project's three detection thresholds from the portfolio-level distribution of these behavioural ratios. The third rule, CROSS_BORDER_SPIKE, uses a fixed percentage-point threshold instead, covered in Detection Rules above.

HIGH_MONTHLY_VOLUME threshold

3.82×

LARGE_SINGLE_TXN threshold

2.58×

I set both ratio-based thresholds at the 95th percentile of the portfolio-level distribution of these ratios — one threshold, applied across all customers, not calibrated individually per customer.

Observed behavioural ratios

Distribution

0th
25th
50th
75th
95

95th percentile, both ratio-based thresholds sit here

Detection quality is a trade-off, not a single number.

Alert → Case Consolidation

From alerts to investigation cases

2,007

Alerts generated

1,366

Investigation cases

Multiple alerts for the same customer and month are consolidated into a single investigation case:

1 rule745

cases triggered exactly one detection rule

2 rules601

cases triggered two of the three detection rules

3 rules20

cases triggered all three detection rules

The number of triggered rules adds useful context for prioritisation, but it does not by itself determine whether the underlying activity represents financial crime.

More triggered rules did not automatically mean more risk.

Case Prioritisation

How severity gets assigned

For every triggered rule, I calculate how strongly the observed behaviour exceeds its detection threshold. I use the strongest of those ratios across all triggered rules, the maximum threshold ratio, to derive the case's severity.

Prioritisation logic

threshold_ratio =

metric_value / threshold

Severity levels

LowMediumHighExtreme

Final case priority distribution

33

Critical

104

High

302

Medium

927

Low

Featured Investigation

Case Spotlight

Investigation File / C01222 / May 2026

Case #C01222

Critical

Profile Deviation

C01222 processed €131,303.18 in May 2026 against an expected monthly volume of just €1,906.46.

Expected monthly volume€1.9K
May 2026 volume€131.3K
68.87×

Expected monthly activity

Transaction Concentration

A single transaction of €128,755.50 accounted for most of the observed volume on its own.

€128.8K

Largest transaction

67.54×

Expected monthly volume

Risk Assessment

Behavioural rules triggered
2
Maximum threshold exceedance
26.20×
Priority
Critical

Triggered rules

Analyst Interpretation

C01222 displayed an extreme deviation from its expected monthly activity. The account processed €131.3K during May against an expected monthly volume of approximately €1.9K, with a single €128.8K transaction accounting for most of the observed volume. The combination of extreme profile deviation and transaction concentration justified critical-priority review.

“These indicators identify unusual behaviour and prioritise the case for investigation; they do not independently establish money laundering.”

Investigation Exhibit / Contrast Case

Second Investigation

Investigation File / C00046 / Month 01

Case #C00046

Single Transaction Dominance
€4,788.75

Expected monthly volume

€161,166.22

January 2026 volume

33.66×

Volume vs expected

€158,574.12

Largest transaction

33.11×

Largest transaction vs expected

98.4%

Largest transaction share of monthly volume

This case produced an extreme monthly-volume alert, with nearly all activity concentrated in a single transaction, a pattern also seen in C01222, though at roughly half the magnitude (33.66× versus 68.87× expected volume). The same combination of triggered rules does not always mean the same underlying severity.

Investigation Workflow

From alert to decision

Alert generated
Behavioural deviation review
Transaction pattern analysis
Customer context
Investigator decision

Rules identify unusual behaviour. Investigation determines whether the activity is explainable, requires enhanced review or should be escalated.

rules flag, humans decide

Post-analysis / Findings

Investigation Notes

Note_01

Behaviour beats isolated transactions

Absolute thresholds can miss context. I compared each customer with their expected profile and their own historical behaviour, which produced more meaningful signals.

context > raw amount

Note_02

More alerts ≠ more risk

Cases with three triggered rules were not automatically more severe than cases with two. Threshold exceedance provided a better indication of urgency.

signal count is not severity

Good transaction monitoring is not about generating more alerts.
It is about generating better decisions.

Calibrated

Note_03

Percentile thresholds scale with behaviour

I set thresholds from the data's own behavioural distribution, rather than a fixed cutoff, which kept the alert queue proportional to how unusual the activity actually is.

percentile-based, not guessed

Note_04

Two cases, two different stories

C01222 and C00046 both triggered the same two behavioural rules, but at very different magnitudes, 68.87× versus 33.66× expected volume. Triggering the same rules does not guarantee the same underlying severity.

same alert, different story

Reviewed

Note_05

Monitoring is iterative

Rules, thresholds and case priorities should be reviewed repeatedly as new behaviour and outcomes become available.

detect → review → calibrate → repeat

what changed after looking closer

Post-Analysis Validation

Checking the rules against the labels

I did not use the dataset's laundering labels to build the detection rules or calibrate the underlying behavioural features. I used them only afterwards, to evaluate how well the rule-based case prioritisation aligned with the dataset's ground truth.

Calibration logic

predicted_suspicious =

max_threshold_ratio >= threshold

I used ground-truth laundering labels only after rule generation, for validation and calibration, not to build the detection rules.

Precision vs recall

Calibration chart

0%25%50%75%100%PrecisionRecall2.0×2.5×3.0×selected3.5×4.0×5.0×Chosen operating point

Selected threshold 3.0×·Precision 72.1%·Recall 51.5%

Chosen operating point

Raising the threshold improves precision but reduces recall, illustrating the operational trade-off between alert quality and detection coverage. I selected threshold 3.0× as the working threshold for this project, not because it is universally optimal, but because it balanced alert quality against case coverage for this dataset.

In-sample calibration

The 3.0× operating point was selected during post-analysis calibration on the available labelled dataset. These metrics therefore represent in-sample calibration performance rather than expected production performance on unseen transactions.

Next Validation Step

A stronger, production-style evaluation would use a temporal holdout: thresholds selected using only a development period, then precision and recall reported on a separate holdout period of previously unseen transactions.

Development period → threshold calibrationHoldout period → final evaluation

Operating Point / Threshold 3.0

Final Calibrated Result

better coverage, still selective

After calibration, I correctly flagged 176 of the dataset's labelled laundering cases while maintaining 72.1% precision and improving recall to 51.5%.

I set the final threshold to prioritise broader coverage of labelled laundering cases, without creating an unmanageable alert queue.

In-sample calibration performance on the available labelled dataset, not a projection of performance on unseen transactions.

Final threshold3.0

Precision

72.1%

Recall

51.5%

Evidence counters

TP176

laundering correctly prioritised

FP68

normal case prioritised

FN166

laundering not prioritised

TN956

normal case correctly left below threshold

Confusion matrix

Predicted
normal

Predicted
suspicious

Actual
normal

956

68

Actual
laundering

166

176

176

caught

68

false alarms

166

missed

956

correctly ignored

By recalibrating the threshold, I turned a high-precision, low-recall system into a more balanced monitoring workflow.

Threshold 5.0 → 81.1% precision / 28.9% recall

Threshold 3.0 → 72.1% precision / 51.5% recall

Review Notes

Limitations

  • The dataset is synthetic.
  • Thresholds are calibrated on this dataset and are not production AML thresholds.
  • Expected monthly volume is treated as a behavioural baseline.
  • Rule-based alerts represent unusual activity, not confirmed financial crime.
  • Ground-truth labels were used only for post-analysis validation.
  • A production transaction-monitoring system would require richer KYC, geography, product, counterparty and historical context.

good systems evolve

Capabilities

What this project demonstrates

01

Transaction Monitoring

02

Behavioural Analytics

03

Threshold Calibration

04

Alert Prioritisation

05

Network Analysis

06

Risk-based Investigation

This project demonstrates my ability to translate transaction data into monitoring logic, investigate behavioural anomalies and communicate risk findings in a structured Financial Crime workflow.

Case status

Case 001 / FinCrime Analytics Lab

Built to detect unusual behaviour.
Calibrated to make better decisions.

From raw transactions to behavioural monitoring, alerts, case prioritisation and threshold calibration.

· Case Closed ·Case 001Calibrated

Case 001

AML Transaction Monitoring Engine

Status

Calibrated

Stack Python · Pandas · AML Analytics

Review complete11 / 11

case closed.

Next caseContinue to AML Network & Flow Analysis