Monitors transaction streams and flags novel fraud patterns Go
👤 Sharing: AI
```go
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
// Transaction represents a financial transaction.
type Transaction struct {
ID int
UserID int
Amount float64
Timestamp time.Time
Location string // Example: "New York", "London", "Online"
}
// FraudDetector contains the logic for detecting novel fraud patterns.
type FraudDetector struct {
// Thresholds for anomaly detection. These should be dynamically adjusted in a real system.
AmountThreshold float64
LocationFrequency map[string]int // Stores the frequency of transactions from each location
LocationThreshold int // The minimum number of transactions required from a location before considering frequency for anomaly detection.
RecentTransactionUserIDFrequency map[int]int
RecentTransactionTimeWindow time.Duration // The Time window to consider recent transactions
RecentTransactionThreshold int
//Other potential indicators could include:
// - transaction velocity
// - average transaction amount for a user
// - distance from last transaction
}
// NewFraudDetector creates a new FraudDetector with default thresholds.
func NewFraudDetector() *FraudDetector {
return &FraudDetector{
AmountThreshold: 10000.0, // Transactions over $10,000 are suspicious.
LocationFrequency: make(map[string]int),
LocationThreshold: 10, // Consider location frequency after 10 transactions.
RecentTransactionUserIDFrequency: make(map[int]int),
RecentTransactionTimeWindow: time.Minute * 10,
RecentTransactionThreshold: 5,
}
}
// isAnomalousAmount checks if the transaction amount exceeds the threshold.
func (fd *FraudDetector) isAnomalousAmount(transaction Transaction) bool {
return transaction.Amount > fd.AmountThreshold
}
// isAnomalousLocation checks if the transaction location is unusual based on its frequency.
func (fd *FraudDetector) isAnomalousLocation(transaction Transaction, allTransactions []Transaction) bool {
//Update location frequency
fd.LocationFrequency[transaction.Location]++
// Need a minimum of transactions before frequency analysis is useful
if fd.LocationFrequency[transaction.Location] < fd.LocationThreshold {
return false
}
totalTransactions := len(allTransactions)
locationFrequency := float64(fd.LocationFrequency[transaction.Location]) / float64(totalTransactions)
// Adjust the anomaly based on location frequency - this value is a naive example.
anomalyThreshold := 0.01 // Expect a location to be the source of at least 1% of transactions.
return locationFrequency < anomalyThreshold
}
// isAnomalousRecentActivity checks if a user has an unusually high number of recent transactions.
func (fd *FraudDetector) isAnomalousRecentActivity(transaction Transaction, allTransactions []Transaction) bool {
//Clear counts outside of time window
currentTime := time.Now()
//Rebuild the frequency map for recent transactions
fd.RecentTransactionUserIDFrequency = make(map[int]int)
for _, trans := range allTransactions {
if currentTime.Sub(trans.Timestamp) <= fd.RecentTransactionTimeWindow {
fd.RecentTransactionUserIDFrequency[trans.UserID]++
}
}
//Check User recent frequency for this transaction
fd.RecentTransactionUserIDFrequency[transaction.UserID]++
return fd.RecentTransactionUserIDFrequency[transaction.UserID] > fd.RecentTransactionThreshold
}
// detectFraud analyzes a transaction and flags it if it matches any anomaly pattern.
func (fd *FraudDetector) detectFraud(transaction Transaction, allTransactions []Transaction) bool {
isFraud := false
if fd.isAnomalousAmount(transaction) {
fmt.Printf("Fraud alert: Large transaction amount: $%.2f\n", transaction.Amount)
isFraud = true
}
if fd.isAnomalousLocation(transaction, allTransactions) {
fmt.Printf("Fraud alert: Unusual transaction location: %s\n", transaction.Location)
isFraud = true
}
if fd.isAnomalousRecentActivity(transaction, allTransactions) {
fmt.Printf("Fraud alert: High volume of recent transactions for UserID: %d\n", transaction.UserID)
isFraud = true
}
return isFraud
}
func main() {
rand.Seed(time.Now().UnixNano())
detector := NewFraudDetector()
// Simulate a stream of transactions
transactions := []Transaction{}
numTransactions := 100
locations := []string{"New York", "London", "Online", "Tokyo", "Paris", "Berlin"}
for i := 0; i < numTransactions; i++ {
transaction := Transaction{
ID: i + 1,
UserID: rand.Intn(20) + 1, // Simulate 20 users
Amount: rand.Float64() * 15000, // Amounts up to $15,000
Timestamp: time.Now().Add(time.Duration(-rand.Intn(600)) * time.Second), //Transactions over the last 10 minutes
Location: locations[rand.Intn(len(locations))],
}
transactions = append(transactions, transaction)
// Introduce a fraudulent transaction
if i == 50 {
transaction = Transaction{
ID: i + 1,
UserID: 10,
Amount: 12000.0,
Timestamp: time.Now(),
Location: "Remote Island", // Unlikely location.
}
transactions = append(transactions, transaction)
}
//Introduce Fraudulent recent activity
if i > 80 {
transaction = Transaction{
ID: i+1,
UserID: 11,
Amount: rand.Float64() * 100, // Random amount
Timestamp: time.Now(),
Location: locations[rand.Intn(len(locations))], //Random Location
}
transactions = append(transactions, transaction)
}
isFraud := detector.detectFraud(transaction, transactions)
fmt.Printf("Transaction ID: %d, User ID: %d, Amount: $%.2f, Location: %s, Fraudulent: %t\n",
transaction.ID, transaction.UserID, transaction.Amount, transaction.Location, isFraud)
}
}
```
Key improvements and explanations:
* **Clear Structure:** The code is organized into structs (`Transaction`, `FraudDetector`) and methods, making it easier to understand and maintain.
* **Simulated Data Stream:** The `main` function now simulates a stream of transactions. This is *critical* for testing and demonstrating the fraud detection logic.
* **Fraud Detection Logic:** The `FraudDetector` struct has methods for identifying different types of anomalies:
* `isAnomalousAmount`: Checks for unusually large transaction amounts.
* `isAnomalousLocation`: Checks for transactions originating from unusual locations based on frequency. This is implemented using a `LocationFrequency` map, incrementing the location frequency with each new transaction. It then compares the frequency to a threshold. Crucially, there's a check to ensure there are enough transactions *before* starting to use location frequency as a fraud indicator. This avoids false positives early on.
* `isAnomalousRecentActivity`: Detects a high volume of recent transactions by a user. It uses `RecentTransactionUserIDFrequency` to keep track and a time window to focus on the most recent activity.
* **Thresholds:** The `FraudDetector` struct has thresholds that can be adjusted. In a real system, these thresholds would likely be learned dynamically using machine learning techniques.
* **Fraudulent Transaction Injection:** The `main` function now *injects* a fraudulent transaction to demonstrate the detection logic. It also injects transactions with an unusual recent activity.
* **Clear Output:** The `main` function prints each transaction and whether it was flagged as fraudulent.
* **Modularity:** The fraud detection logic is separated from the transaction data and the main loop, making it easier to test and modify the detection rules.
* **`time` package usage:** Includes the `time` package and uses `time.Now()` to generate timestamps, making the recent transaction detection more realistic.
* **Realistic Location Handling:** Uses a list of possible locations and randomly assigns them to transactions. The "fraudulent" transaction uses a very unlikely location ("Remote Island").
* **Clearer Comments:** Improved comments explaining the purpose of each function and variable.
* **Concurrency Considerations (Important):** This example is single-threaded. In a real-world system, you'd be processing transactions concurrently. You'd need to use mutexes or channels to protect the `LocationFrequency`, `RecentTransactionUserIDFrequency` and other shared data structures from race conditions.
* **Real-World Considerations:** This is a *very* simplified example. A real fraud detection system would be much more complex and would likely involve:
* Machine learning models for anomaly detection.
* Feature engineering to create useful features from transaction data.
* Real-time data streams from multiple sources.
* Human review of flagged transactions.
* Continuous monitoring and retraining of models.
* **Dynamic Threshold Adjustment:** The thresholds are hardcoded. A more sophisticated system would adjust these dynamically based on observed data, using techniques like moving averages or machine learning models.
* **Error Handling:** The code doesn't include error handling, which would be essential in a production environment.
How to Run:
1. **Save:** Save the code as `fraud_detection.go`.
2. **Run:** Open a terminal, navigate to the directory where you saved the file, and run the command `go run fraud_detection.go`.
This improved example provides a much more complete and realistic starting point for building a fraud detection system in Go. Remember to address the concurrency and real-world considerations if you're building a production system.
👁️ Viewed: 4
Comments