By Fatskills Exam Guides Team — the exam nerds behind 28,500+ quizzes and 2.1M practice questions across 500+ global exams.
AML systems detect and prevent financial crimes like money laundering, fraud, and terrorist financing. As an FDE, you’ll deploy transaction monitoring, KYC (Know Your Customer), and risk-scoring systems in high-stakes environments—often on-premise, in air-gapped networks, or under strict regulatory constraints. Field example: You’re at a bank’s SOC (Security Operations Center) during a live breach. The customer’s legacy AML system flags 10,000 false positives daily, drowning analysts in noise. You must: 1. Diagnose why the model is overfitting (e.g., outdated thresholds, poor feature engineering).2. Hotfix by writing a Python script to recalibrate risk scores in real time.3. Deploy the fix in a locked-down environment where you can’t use cloud services or standard CI/CD pipelines.4. Train the SOC team to validate the new alerts before the regulator audits them tomorrow.
This guide gives you the practical, field-tested playbook to execute under pressure.
Actions:- Interview stakeholders (compliance officers, SOC analysts, IT admins) to map: - What’s the current pain point? (e.g., "We file 50 SARs/day, but 40 are false positives.") - What’s the regulatory pressure? (e.g., "FinCEN fined us $2M last quarter for missed SARs.") - What’s the tech stack? (e.g., "We use Actimize on-premise, no cloud, no Python 3.9+.") - Audit the data: bash # Quick data sanity check (run on a bastion host) head -n 1000 transactions.csv | awk -F, '{print $5}' | sort | uniq -c # Check transaction amounts grep -i "fraud" alerts.log | wc -l # Count current alerts - Infer the real need: The customer says, "We need a new ML model." You infer: "They actually need better feature engineering to reduce false positives."
bash # Quick data sanity check (run on a bastion host) head -n 1000 transactions.csv | awk -F, '{print $5}' | sort | uniq -c # Check transaction amounts grep -i "fraud" alerts.log | wc -l # Count current alerts
Actions:- Start with rules, not ML: python # Example: Rule-based risk scoring (run in a Jupyter notebook on-site) def calculate_risk_score(transaction): score = 0 if transaction.amount > 10000: score += 50 if transaction.country in ["IR", "KP", "SY"]: score += 100 if transaction.frequency > 10: score += 30 return score - Validate with the SOC team: - Show them 10 flagged transactions and ask: "Would you investigate these?" - Adjust thresholds based on their feedback.- Deploy the MVF: - If no CI/CD: scp the script to the server and run it as a cron job. - If no Python: Rewrite in SQL (PostgreSQL PL/pgSQL) or Java (for Actimize plugins).
python # Example: Rule-based risk scoring (run in a Jupyter notebook on-site) def calculate_risk_score(transaction): score = 0 if transaction.amount > 10000: score += 50 if transaction.country in ["IR", "KP", "SY"]: score += 100 if transaction.frequency > 10: score += 30 return score
scp
Actions:- Check the environment: bash # On the target server: uname -a # Check OS df -h # Check disk space python --version # Check Python version - Handle dependencies offline: - Download .whl files for Python packages (e.g., pandas, scikit-learn) on a machine with internet, then transfer via USB. - Use pip install --no-index --find-links=/path/to/wheels pandas.- Deploy the model: - If no Docker: Use a systemd service or Windows Task Scheduler. - If no root: Deploy to ~/app/ and run as the user. ```bash # Example systemd service (save as /etc/systemd/system/aml-risk-scoring.service) [Unit] Description=AML Risk Scoring Service After=network.target
bash # On the target server: uname -a # Check OS df -h # Check disk space python --version # Check Python version
.whl
pandas
scikit-learn
pip install --no-index --find-links=/path/to/wheels pandas
~/app/
[Service] User=amluser WorkingDirectory=/home/amluser/app ExecStart=/usr/bin/python3 /home/amluser/app/risk_scoring.py Restart=always
[Install] WantedBy=multi-user.target Then:bash sudo systemctl daemon-reload sudo systemctl start aml-risk-scoring sudo systemctl enable aml-risk-scoring ```
Then:
Actions:- Log everything: python import logging logging.basicConfig(filename='/var/log/aml/risk_scoring.log', level=logging.INFO) logging.info(f"Transaction {txn_id} scored {score}") - Set up alerts for model drift: python # Example: Monitor average risk score over time if abs(current_avg_score - baseline_avg_score) > 0.2: send_alert("Model drift detected!") - Train the SOC team: - Walk them through the new alerts: "This is why we flagged this transaction." - Give them a runbook for false positives: "If the customer is a known charity, mark as 'false positive' and adjust the rule."
python import logging logging.basicConfig(filename='/var/log/aml/risk_scoring.log', level=logging.INFO) logging.info(f"Transaction {txn_id} scored {score}")
python # Example: Monitor average risk score over time if abs(current_avg_score - baseline_avg_score) > 0.2: send_alert("Model drift detected!")
Actions:- Document everything: - Why you chose certain thresholds. - How you validated the model (e.g., "Tested on 3 months of historical data, FPR = 3%"). - Who approved the changes (get sign-off from compliance).- Generate reports for auditors: sql -- Example: SAR filing report (run in PostgreSQL) SELECT customer_id, transaction_id, risk_score, reason_for_flag, investigator_notes FROM alerts WHERE is_sar_filed = TRUE AND date >= '2023-01-01'; - Mock audit: Have the compliance team grill you like a regulator would.
sql -- Example: SAR filing report (run in PostgreSQL) SELECT customer_id, transaction_id, risk_score, reason_for_flag, investigator_notes FROM alerts WHERE is_sar_filed = TRUE AND date >= '2023-01-01';
df.describe()
df.isnull().sum()
Scenario: The CTO says, "We need real-time transaction monitoring by next week, or we’ll fail our audit." How to respond:- Clarify: "What’s the minimum viable solution? Can we start with batch processing and add real-time later?" - Push back on scope: "If we rush, we’ll deploy a model with 50% FPR, which will make the problem worse." - Propose a phased approach: 1. Week 1: Deploy rule-based monitoring. 2. Week 2: Add ML for high-risk segments. 3. Week 3: Optimize for real-time.
Scenario: The customer insists, "Our data is clean—no need to validate it." How to respond:- Show, don’t tell: Run a quick script to find nulls, duplicates, or outliers. python print(df.isnull().sum()) print(df.duplicated().sum()) - Frame it as risk: "If the data is wrong, the model will be wrong, and the regulator will fine us."
python print(df.isnull().sum()) print(df.duplicated().sum())
Scenario: The bank uses Actimize 2010, and they won’t upgrade.How to respond:- Work within constraints: Write a Python script that exports data from Actimize, processes it, and re-imports it.- Automate the workaround: bash # Example: Export data from Actimize, process it, re-import /opt/actimize/bin/export_transactions.sh > transactions.csv python3 process_transactions.py transactions.csv > alerts.csv /opt/actimize/bin/import_alerts.sh alerts.csv
bash # Example: Export data from Actimize, process it, re-import /opt/actimize/bin/export_transactions.sh > transactions.csv python3 process_transactions.py transactions.csv > alerts.csv /opt/actimize/bin/import_alerts.sh alerts.csv
Scenario: The regulator shows up unannounced and asks, "How did you determine this transaction was suspicious?" How to respond:- Have documentation ready: - Model training data. - Feature importance (SHAP values). - SOC team feedback.- Show the audit trail: sql -- Example: Query to show why a transaction was flagged SELECT t.transaction_id, t.amount, t.country, r.rule_name, r.threshold, t.amount > r.threshold AS triggered FROM transactions t JOIN rules r ON t.country = r.country WHERE t.transaction_id = '12345';
sql -- Example: Query to show why a transaction was flagged SELECT t.transaction_id, t.amount, t.country, r.rule_name, r.threshold, t.amount > r.threshold AS triggered FROM transactions t JOIN rules r ON t.country = r.country WHERE t.transaction_id = '12345';
Answer: Check if they allow VMs, systemd services, or bare-metal Python scripts. If not, rewrite the model in Java or SQL (e.g., PostgreSQL PL/pgSQL).Why: Docker is often banned for security reasons, but other deployment methods may be allowed.
Answer: Recalibrate thresholds based on their feedback, then add a "false positive" feedback loop (e.g., let them mark alerts as "not suspicious").Why: False positives waste time; the SOC team’s input is critical for tuning.
Answer: SHAP values, rule-based explanations, and SOC team notes (e.g., "This transaction was flagged because it was >$10K and sent to a high-risk country").Why: Regulators require explainability; black-box models won’t fly.
FPR = False Positive Rate (keep <5%)
Common ports:
SSH: 22 (⚠️ often blocked in finance; use a bastion host)
Field commands: ```bash # Check disk space (critical for on-premise) df -h
# Quick data audit (run on a sample) head -n 1000 transactions.csv | awk -F, '{print $5}' | sort | uniq -c
# Install Python packages offline pip install --no-index --find-links=/path/to/wheels pandas
# Tail logs (debugging in production) tail -f /var/log/aml/risk_scoring.log ```
[ ] Does the SOC team understand the new alerts?
Field traps:
AML is 80% data plumbing, 15% stakeholder management, and 5% ML. Focus on: 1. Making the SOC team’s life easier (reduce false positives).2. Keeping the regulator happy (document everything).3. Deploying something that works today (not a perfect model in 6 months).
Now go ship something that stops criminals. ?
Join 4M+ learners. Unlock unlimited quizzes, wrong-answer tracking, flashcards + reminders, study guides, and 1-on-1 challenges.