anomaly-fraud-scanner について
新しい取引を過去12か月の履歴と照合し、異常なパターンや予期しない手数料を探す家計向けスキルです。5種類の検出結果を、根拠と推奨対応を添えた重大度別のアラートにまとめ、判断はユーザーに委ねます。
主な機能
- 01重複取引の検出
- 02金額の統計的な異常検出
- 03初出の高額な加盟店取引の通知
- 04場所と時刻の異常確認
- 05予期しない手数料の検出
- 06根拠と推奨対応を添えたアラートの統合
活用シーン
- 01新たに取り込んだ家計取引の確認
- 02重複または反復する請求の発見
- 03見慣れない加盟店での高額購入の確認
- 04対応が必要な異常手数料の特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lyndonkl/ claude --skill anomaly-fraud-scannerインストール後、Claude Code で/anomaly-fraud-scannerを入力して読み込まれたか確認します。
詳細
不正利用異常スキャナー
目次
概要
家計の不正利用検出は、銀行での不正利用検出とは異なる問題です。銀行はすでに高度なルールを運用しています。このスキルは、銀行が見逃すもの、つまり銀行のしきい値を下回る少額の継続的な不正利用、見慣れない加盟店のパターン、そしてユーザーがまだ気づいていない請求の事後監査を検出するためのものです。
互いに補完し合う5つの検出器を実行し、それぞれ重大度タグ付きのアラートを生成します。
入力仕様
呼び出し元は次の情報を提供します。
transactions_new— 直近のデータ追加で加わった取引。transactions_history— 確認済み取引の過去12か月分。accounts— コンテキスト情報(口座の種類、所有者、地域)。today— ISO形式の日付。thresholds— 任意の上書き設定:{ "duplicate_window_hours": 48, "anomaly_sigma": 3.0, "first_merchant_high_dollar_cents": 50000, "geo_radius_miles": 1000 }
検出ルール
ルール1 — 48時間以内の重複
同じaccount_idの2件の取引について、merchantとamount_centsが同じで、duplicate_window_hours以内に計上されている場合。
- 重大度:金額が200ドル未満の場合は
medium、200ドル以上の場合はhigh。 - よくある誤検知:1日にコーヒーを2杯買う、ロードトリップ中にガソリンスタンドで2回給油するなど。このルールでは、金額が30ドル未満の場合、
food.coffee、food.restaurants、transportation.gasを除外します。
ルール2 — 統計的異常
過去に6回以上発生した各(merchant, account_id)の組み合わせについて、平均と標準偏差を算出します。新しい取引のうち、|amount − mean| > anomaly_sigma × stddevかつ|amount − mean| ≥ $50を満たすものにフラグを立てます。
- 重大度:基本は
medium、> 5σまたは金額が平均の4倍を超える場合はhigh。 - よくある誤検知:レストランのチップの変動、ライドシェアの割増料金など。
food.restaurantsとtransportation.rideshareには25%の許容幅を設けます。
ルール3 — 初めての加盟店で高額な取引
transactions_historyに過去の取引がなく、かつ|amount| ≥ first_merchant_high_dollar_centsである加盟店との取引。
- 重大度:500~2,000ドルの場合は
medium、2,000ドル以上の場合はhigh。 - よくある誤検知:予定していた大きな買い物(家電、旅行の予約など)。最近の
category_overrideまたはユーザーが確認した予定がある場合は抑制します。
ルール4 — 地理または時刻の異常
description_rawに位置情報文字列(州コード、国コード)が含まれ、推定位置が世帯の自宅の位置からgeo_radius_milesを超えて離れており、旅行に関するコンテキストが設定されていない場合、フラグを立てます。
取引が通常と異なる時刻(現地時間の午前2時から午前5時まで)に計上され、かつ加盟店のカテゴリがその時間帯として不自然な場合(ガソリンスタンドでも24時間営業の薬局でもない場合)、フラグを立てます。
- 重大度:
medium。 - このルールは誤検知が多いため、位置情報または時刻のシグナルが明確な場合にのみ使用します。
ルール5 — 予期しない手数料
category: financial.feesに該当するすべての取引を検出します。fee_type(当座貸越、海外取引、月額維持、ATM、支払い遅延)をタグ付けします。
- 重大度:手数料が10ドル未満の場合は
low、10~50ドルの場合はmedium、当座貸越手数料と支払い遅延手数料は金額にかかわらずhigh。 - 常に対応可能です。ほとんどの手数料は交渉または回避できます。
ワークフロー
Anomaly Scan Progress:
- [ ] Step 1: Build merchant statistics from transactions_history
- [ ] Step 2: Run Rule 1 (duplicate within 48h)
- [ ] Step 3: Run Rule 2 (statistical anomaly)
- [ ] Step 4: Run Rule 3 (first-merchant high-dollar)
- [ ] Step 5: Run Rule 4 (geography/time)
- [ ] Step 6: Run Rule 5 (fees)
- [ ] Step 7: Deduplicate alerts (one tx may trigger multiple rules)
- [ ] Step 8: Rank by severity then dollar impact
- [ ] Step 9: Attach recommended actions
重複排除
1つの取引が複数のルールに該当することがあります(例:別の州にある初めての加盟店での5,000ドルの請求は、ルール3と4に該当します)。triggered_rules: [...]を含む1つのアラートにまとめ、最も高い重大度を適用します。
推奨アクション
各アラートには、次のいずれかが含まれます。
call_bank_fraud_line— ユーザーが覚えのない、重大度がhighの請求に対して使用します。freeze_card— 不正利用が確認された場合、または数時間以内に複数の請求が発生している場合に、銀行へ連絡する前に使用します。dispute_charge— 加盟店による過剰請求や、確定済みの請求と保留中の請求の重複に対して使用します。negotiate_fee— 交渉の手順が確立されているfinancial.fees(当座貸越、月額維持手数料)に対して使用します。monitor— ユーザーによる確認が必要なものの、正当な請求であれば対応は不要な、重大度がmedium/lowのアラートに対して使用します。
ルールの発動理由を具体的な数値とともに説明する、1 行の evidence を必ず含めてください。
出力仕様
{
"scanned": {
"transactions_new": 142,
"transactions_history": 1820,
"merchants_with_stats": 218
},
"alerts": [
{
"id": "alert_20260424_001",
"severity": "high",
"triggered_rules": ["first_merchant_high_dollar"],
"tx_ids": ["tx_20260424_011"],
"merchant": "TECH-SHOP-ONLINE",
"amount_cents": -245000,
"account_id": "acc_cc_001",
"evidence": "First charge ever from TECH-SHOP-ONLINE; amount $2,450 exceeds new-merchant high-dollar threshold of $500.",
"suggested_action": "call_bank_fraud_line",
"expected_user_response": "Confirm whether this purchase is yours; if not, freeze card and dispute."
},
{
"id": "alert_20260424_002",
"severity": "medium",
"triggered_rules": ["statistical_anomaly"],
"tx_ids": ["tx_20260424_023"],
"merchant": "Whole Foods",
"amount_cents": -38420,
"evidence": "12-month avg $84.50, stddev $22.30; this charge ($384.20) is 13.4σ above mean.",
"suggested_action": "monitor",
"expected_user_response": "If you bought groceries for a party, ignore. Otherwise, check the receipt."
},
{
"id": "alert_20260424_003",
"severity": "high",
"triggered_rules": ["fee_overdraft"],
"tx_ids": ["tx_20260423_004"],
"merchant": "Bank Name",
"amount_cents": -3500,
"evidence": "Overdraft fee of $35 charged on 2026-04-23. Account balance was negative for 2 days.",
"suggested_action": "negotiate_fee",
"expected_user_response": "Call the bank's customer line; first overdraft fees are typically waived on request."
}
],
"summary": {
"alerts_total": 3,
"high_severity": 2,
"medium_severity": 1,
"low_severity": 0
}
}
ガードレール
- 不正利用だと断定しないでください。 「通常と異なる」「初めて」「しきい値を超えている」のような表現を使用してください。最終的な確認はユーザーが行います。このスキルはフラグを立てるだけです。
- 誤検知のコストを考慮して調整してください。 重大度が medium のアラートは確認されますが、重大度が high のアラートはユーザーの一日を妨げます。本当に通常と異なる場合に限り、
highを使用してください。 - 計算根拠を示してください。 各アラートに比較対象(平均、標準偏差、発生回数、しきい値)を記載してください。ユーザーが判断の妥当性を評価できるようにする必要があります。
- 履歴コンテキストを考慮してください。 加盟店名が初めて確認されたというトリガーは、表示文字列が異なっていても、その加盟店が履歴に存在する場合には発動しないようにしてください。分類器で正規化された加盟店名を使用してください。
- 同意なしにアクションを実行しないでください。 推奨アクションはユーザー自身が行うものです。家計管理システムが金融アクションを実行することはありません。
- アラートログを保持してください。 出力したすべてのアラートを
reports/alerts/に追記してください。誤検知は、しきい値の調整に反映してください。