TL;DR: Bank Statement Parser は、7 つの銀行取引明細書形式(CAMT.053、PAIN.001、CSV、OFX、QFX、MT940、PDF)を pandas DataFrame に解析するオープンソースの Python ライブラリです。残高検証付きハイブリッド PDF パイプライン、REST API、エンリッチメント、台帳エクスポート、27,000+ tx/s スループット。
Bank Statement Parser は、7 つの形式の銀行取引明細書を構造化された pandas DataFrame に解析するオープンソース Python ライブラリです。確定的コアはネットワーク呼び出しなしでローカルに構造化形式を処理します。オプションのハイブリッド PDF パイプラインは、デジタルおよびスキャン明細書をローカル LLM(Ollama 経由)で処理します。
対象ユーザー
- MT940 から CAMT.053 に移行する財務チーム。移行中に新旧両方の形式を処理するパーサーが必要であり、構造化エクスポートを提供しない銀行の PDF 明細書も処理する必要があります。
- 調整、レポート、会計パイプラインを構築するフィンテック開発者。残高検証、分類、台帳エクスポートが内蔵された単一の依存関係を求めています。
- コンプライアンスチーム。デフォルトの PII 秘匿化、確定的出力、台帳に到達する前に不一致をフラグするゴールデンルール検証が必要です。
- PDF 銀行取引明細書から hledger や beancount ジャーナルへの自動取り込みを行いたいプレーンテキスト会計ユーザー。
- ローカルのオープンソースツールで対応できるのに、機密の財務データをサードパーティの SaaS に送信することを拒否するすべての方。
サポートされている形式
| 形式 | 標準 | ファイルの種類 | パーサー/メソッド |
|---|---|---|---|
| CAMT.053 | ISO 20022 銀行対顧客明細書 | .xml |
CamtParser |
| PAIN.001 | ISO 20022 送金指図 | .xml |
Pain001Parser |
| CSV | 一般的な銀行エクスポート | .csv |
CsvStatementParser |
| OFX | Open Financial Exchange | .ofx |
OfxParser |
| QFX | Quicken Financial Exchange | .qfx |
QfxParser |
| MT940 | SWIFT 標準 | .mt940, .sta |
Mt940Parser |
| デジタルおよびスキャン明細書 | .pdf |
smart_ingest() |
すべての形式で、一貫した列名を持つ正規化された pandas DataFrame が生成されるため、後続の処理は形式に依存しません。
主要な機能
- ハイブリッド PDF パイプライン:
smart_ingest()が PDF を 3 つのパス(確定的テーブル抽出、テキスト LLM、ビジョン LLM)に振り分け、自動ゴールデンルール残高検証を行います。 - フォーマット自動検出:
detect_statement_format()がフォーマットを識別し、create_parser()が適切なパーサーをインスタンス化します。 - 残高検証: ゴールデンルールチェック(
opening + credits − debits == closing)で VERIFIED/DISCREPANCY/FAILED ステータスを返します。 - マルチ通貨検証:
verify_balance_multi_currency()がトランザクションを通貨ごとにグループ化して独立検証します。 - REST API: FastAPI マイクロサービスの
/ingestおよび/healthエンドポイントで本番デプロイに対応します。 - エンリッチメント: LLM によるトランザクション分類。プラグ可能なスキーマ対応(デフォルトは Plaid 13 カテゴリ)。
- インタラクティブレビュー:
--type reviewで不一致を accept/edit/skip/delete アクションで確認します。 - 台帳エクスポート:
to_hledger()およびto_beancount()でプレーンテキスト会計ワークフローに対応します。 - 一括スキャン:
scan_and_ingest()がフォルダツリーを処理し、ファイル間の自動重複排除を行います。 - アカウントマッピング: JSON 設定による正規表現ベースの台帳エクスポート用アカウントマッピングルール。
- ストリーミング解析:
parse_streaming()で大きなファイル(50 MB+、50K+ トランザクション)を制限されたメモリで処理します。 - 並列処理: ProcessPoolExecutor を使用した
parse_files_parallel()で複数ファイルを同時に解析します。 - 重複排除: べき等な
transaction_hash(MD5 フィンガープリント)で安全なインクリメンタル取り込みを実現します。 - メモリ内解析:
from_string()およびfrom_bytes()で SFTP や API ワークフローにディスク I/O なしで対応します。 - 安全な ZIP 処理:
iter_secure_xml_entries()で圧縮率制限、エントリサイズ上限、暗号化エントリ拒否に対応します。 - エクスポート: CSV、JSON、Excel(
.xlsx)、Polars DataFrame、hledger、beancount ジャーナル。
セキュリティとプライバシー
- PII 秘匿化: 名前、IBAN、アドレスはデフォルトで CLI 出力でマスクされます。
--show-piiでオプトインできます。 - XXE 保護: XML 解析は
resolve_entities=False、no_network=True、load_dtd=Falseを使用します。 - ZIP 爆弾保護: 圧縮率制限(デフォルト 100:1)、エントリサイズ上限(10 MB)、暗号化エントリ拒否。
- パストラバーサル防止: 危険なパターンのブロックリストとシンボリックリンク解決。
- サプライチェーンセキュリティ: SHA-256 ハッシュロック依存関係、CycloneDX SBOM、ビルド来歴証明書。
- ローカル LLM のみ: ハイブリッド PDF パイプラインは Ollama を使用してローカル推論を行います。クラウド API にデータが送信されることはありません。
パフォーマンス
| 指標 | 値 |
|---|---|
| CAMT.053 スループット | 27,000+ tx/秒 |
| PAIN.001 スループット | 52,000+ tx/秒 |
| トランザクションあたりのレイテンシ(CAMT) | 37 マイクロ秒 |
| トランザクションあたりのレイテンシ(PAIN.001) | 19 マイクロ秒 |
| 最初の結果が得られるまでの時間 | < 2 ms |
| メモリスケーリング(1K〜50K tx) | 一定(ストリーミング) |
| テストカバレッジ | 100% ブランチカバレッジ |
| テスト数 | 29 テストファイルで 718 |
構築を開始する
"GitHub リポジトリ"