LabHub

ブログ

ISO 20022とSWIFT — 金融メッセージング標準の大転換

한국어English日本語

はじめに

国境を越える送金1件の裏側には、銀行間でやり取りされるメッセージがあります。このメッセージの形式が、数十年ぶりに入れ替わりつつあります。1970年代に設計されたSWIFT MTフォーマットが、ISO 20022ベースの構造化されたXMLメッセージ(MX)へ移行するのです。2025年11月、国際送金メッセージのMT-MX共存期間が終了し、この移行はもはや未来形ではなく、ほぼ完了形に近づきました。

この移行は単なるフォーマット変更ではありません。受取人名義が自由テキスト1行から構造化された住所フィールドに変わればAML(マネーロンダリング防止)スクリーニングの精度が変わり、定型データが増えれば決済システムの自動化率が変わります。同時に、既存のMTに縛られたレガシーシステムを運用する立場には、変換レイヤー、スキーマ管理、切り捨て(truncation)問題という現実的な課題が押し寄せます。

本記事では、金融メッセージングの歴史からISO 20022の構造、MT103とpacs.008の比較、CBPR+移行、変換アーキテクチャと実装、テスト戦略、運用上の落とし穴までを、エンジニアの視点で整理します。本記事は技術資料であり、投資助言ではありません。

金融メッセージングの歴史 — テレックスからISO 20022まで

1950〜70年代  テレックス(Telex)
              - 自由テキスト電文、標準なし、手作業の検証
              - 偽造・誤記リスク、処理の自動化は不可能
        |
        v
1977〜       SWIFT MT (Message Type)
              - SWIFTネットワーク稼働、ブロック構造の定型電文
              - MT103(顧客送金)、MT202(銀行間)、MT5xx(証券)、MT9xx(資金管理)
              - フィールドは構造化されたが、多くは自由テキスト
                (名義/住所は4行x35文字など)
        |
        v
2004〜       ISO 20022標準の制定
              - ビジネスモデルに基づくメッセージ標準(XML文法)
              - SEPA(欧州)、日本の全銀EDI、各国RTGSが段階的に採用
        |
        v
2022〜2025   CBPR+ — 国際送金のISO 20022移行
              - 2022年3月 MT/MXの共存開始
              - 2025年11月 対象となる送金関連MT(カテゴリ1、2および
                一部9)の国際送金における共存終了 — MX(pacs/camt)へ一本化
              - 主要国のRTGS(ユーロ圏T2、英国CHAPS、米国Fedwire等)も
                ISO 20022への移行を完了または推進

要約すると、金融メッセージングは「人が読む電文」から「機械が検証し処理するデータ」へと進化してきました。ISO 20022はその進化の現在の到達点です。

ISO 20022の構造 — ビジネスモデルとメッセージ定義

ISO 20022の最大の特徴は文法(syntax)と意味(semantics)の分離です。

主要なメッセージファミリー:

ファミリー領域代表的なメッセージ
pain顧客-銀行間の支払指図pain.001(支払指図)、pain.002(状態報告)
pacs銀行間の決済・清算pacs.008(顧客送金)、pacs.009(銀行間)、pacs.004(返金)、pacs.002(状態)
camt資金管理・口座報告camt.053(口座明細)、camt.052(残高報告)、camt.056(取消依頼)
sese / semt証券決済・管理sese.023(決済指図)、semt.002(残高)
setrファンド注文setr.004 など

pacs.008(銀行間の顧客送金)の単純化した例:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
  <FIToFICstmrCdtTrf>
    <GrpHdr>
      <MsgId>ABCDKRSE-20260613-000123</MsgId>
      <CreDtTm>2026-06-13T09:30:47+09:00</CreDtTm>
      <NbOfTxs>1</NbOfTxs>
      <SttlmInf>
        <SttlmMtd>INDA</SttlmMtd>
      </SttlmInf>
    </GrpHdr>
    <CdtTrfTxInf>
      <PmtId>
        <InstrId>INSTR-000123</InstrId>
        <EndToEndId>E2E-INV-2026-0456</EndToEndId>
        <UETR>97ed4827-7b6f-4491-a06f-b548d5a7512d</UETR>
      </PmtId>
      <IntrBkSttlmAmt Ccy="USD">25000.00</IntrBkSttlmAmt>
      <IntrBkSttlmDt>2026-06-13</IntrBkSttlmDt>
      <ChrgBr>SHAR</ChrgBr>
      <Dbtr>
        <Nm>HANKOOK TRADING CO LTD</Nm>
        <PstlAdr>
          <StrtNm>TEHERAN-RO 123</StrtNm>
          <TwnNm>SEOUL</TwnNm>
          <Ctry>KR</Ctry>
        </PstlAdr>
      </Dbtr>
      <DbtrAcct>
        <Id><Othr><Id>110123456789</Id></Othr></Id>
      </DbtrAcct>
      <DbtrAgt>
        <FinInstnId><BICFI>ABCDKRSE</BICFI></FinInstnId>
      </DbtrAgt>
      <CdtrAgt>
        <FinInstnId><BICFI>WXYZUS33</BICFI></FinInstnId>
      </CdtrAgt>
      <Cdtr>
        <Nm>GLOBAL PARTS INC</Nm>
        <PstlAdr>
          <TwnNm>NEW YORK</TwnNm>
          <Ctry>US</Ctry>
        </PstlAdr>
      </Cdtr>
      <CdtrAcct>
        <Id><Othr><Id>987654321</Id></Othr></Id>
      </CdtrAcct>
      <RmtInf>
        <Ustrd>INVOICE 2026-0456 MACHINE PARTS</Ustrd>
      </RmtInf>
    </CdtTrfTxInf>
  </FIToFICstmrCdtTrf>
</Document>

注目すべき点: 送金人(Dbtr)と受取人(Cdtr)の名義・住所が構造化されたフィールドに分かれており、UETR(一意の取引識別子)がメッセージに組み込まれてSWIFT gpiの追跡と連動します。

MT103 vs pacs.008 — フィールドマッピング

比較のために、同じ送金を従来のMT103原文の形で見ると次のようになります。

{1:F01ABCDKRSEAXXX0000000000}{2:I103WXYZUS33XXXXN}
{3:{121:97ed4827-7b6f-4491-a06f-b548d5a7512d}}{4:
:20:INSTR-000123
:23B:CRED
:32A:260613USD25000,00
:33B:USD25000,00
:50K:/110123456789
HANKOOK TRADING CO LTD
TEHERAN-RO 123
SEOUL KOREA
:57A:WXYZUS33
:59:/987654321
GLOBAL PARTS INC
NEW YORK US
:70:INVOICE 2026-0456 MACHINE PARTS
:71A:SHA
-}

コロンで始まるフィールドタグと、改行で区切られた自由テキスト — 人間の目には簡潔ですが、50Kの4行のうちどこまでが名義でどこからが住所なのか、機械が確信を持って判断する方法はありません。2つの形式の対応関係を見ると、移行の本質が見えてきます。

MT103フィールド意味pacs.008の対応要素(パス)
20送金参照番号GrpHdr/MsgId, PmtId/InstrId
121(ヘッダ)UETRPmtId/UETR
23B銀行操作コード別のコード体系に分解(PmtTpInf等)
32A決済日・通貨・金額IntrBkSttlmDt + IntrBkSttlmAmt
33B指図通貨・金額InstdAmt
50a送金依頼人Dbtr(Nm, PstlAdrの構造化)+ DbtrAcct
52a依頼人の銀行DbtrAgt/FinInstnId/BICFI
56a中継銀行IntrmyAgt1
57a受取人の銀行CdtrAgt/FinInstnId/BICFI
59a受取人Cdtr(構造化)+ CdtrAcct
70送金事由RmtInf/Ustrd または RmtInf/Strd(構造化可能)
71A手数料負担ChrgBr (DEBT/CRED/SHAR)
72銀行間の追加情報InstrForNxtAgt、構造化要素に分散

違いの核心:

camt.053 — 口座報告の構造化

支払指図(pacs)と同じくらい重要なのが資金報告(camt)です。従来のMT940口座明細は、86番フィールドの自由テキストに取引情報を詰め込む構造だったため、企業・機関の自動消込は常にパースのヒューリスティックに依存していました。camt.053では明細の各エントリが構造化され、何よりUETRで元の支払メッセージと連結されます。

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08">
  <BkToCstmrStmt>
    <Stmt>
      <Id>STMT-20260613-001</Id>
      <Acct>
        <Id><Othr><Id>110123456789</Id></Othr></Id>
        <Ccy>USD</Ccy>
      </Acct>
      <Bal>
        <Tp><CdOrPrtry><Cd>CLBD</Cd></CdOrPrtry></Tp>
        <Amt Ccy="USD">1250000.00</Amt>
        <CdtDbtInd>CRDT</CdtDbtInd>
        <Dt><Dt>2026-06-13</Dt></Dt>
      </Bal>
      <Ntry>
        <Amt Ccy="USD">25000.00</Amt>
        <CdtDbtInd>DBIT</CdtDbtInd>
        <Sts><Cd>BOOK</Cd></Sts>
        <NtryDtls>
          <TxDtls>
            <Refs>
              <UETR>97ed4827-7b6f-4491-a06f-b548d5a7512d</UETR>
              <EndToEndId>E2E-INV-2026-0456</EndToEndId>
            </Refs>
          </TxDtls>
        </NtryDtls>
      </Ntry>
    </Stmt>
  </BkToCstmrStmt>
</Document>

実務上の効果を整理すると:

CBPR+移行 — 何がいつ変わったのか

CBPR+(Cross-Border Payments and Reporting Plus)は、SWIFTネットワーク上の国際送金・報告メッセージにおけるISO 20022の使用規格です。ISO 20022標準そのものは自由度が高いため、実際の相互運用のために市場慣行グループがフィールドの使用ルールを絞り込んで定義したのがCBPR+使用ガイドラインです。

タイムライン(主要な事実):

移行戦略は機関ごとに異なりました。

戦略内容長所と短所
ネイティブ移行コア決済システムが直接MXを処理データ損失なし / コスト・期間が大
変換レイヤー境界でMX-MTを相互変換、内部はMT維持迅速な対応 / 切り捨て・データ損失リスク
ハイブリッド新規フローはネイティブ、レガシーは変換現実的 / 二重運用の負担

共存期間には多くの機関が変換レイヤーでしのぎましたが、構造化住所のようにMTに収まらないデータがMXに載って届き始めると、変換は本質的に損失変換になります。だからこそ移行の最終形はネイティブ処理です。

構造化データの価値 — AMLとSTP

ISO 20022移行の便益は運用データから生まれます。

ただし便益は無料ではありません。送る側が構造化データを埋めてこそ、受け取る側が活用できます。顧客チャネル(インターネットバンキング、ファームバンキング)の段階から住所を構造化して受け取る、アップストリームの改善が並走すべきです。

韓国国内での適用の文脈

韓国の観点では、ISO 20022には次の接点があります(知っている範囲で記述します。最新のスケジュールは各機関の公表をご確認ください)。

国内のメッセージ体系(電文規格)と国際標準が異なる状態は当面続くため、国内銀行の統合レイヤーは「国内電文 - 内部標準モデル - 国際MX」の三重変換を扱うことになります。このとき内部標準モデルをISO 20022のビジネスモデルに近づけて設計しておくと、変換損失とマッピング数が減ります。

メッセージ変換アーキテクチャ

変換レイヤーの標準的な構成は次のとおりです。

   [チャネル/コアシステム]
        |  (内部フォーマット)
        v
+-----------------------+
|  Canonicalモデル層     |   内部標準モデル(ISO 20022ビジネスモデルに基づく)
+-----------------------+
        |
        v
+-----------------------+      +--------------------+
|  Transformer層         | <--> |  マッピング定義リポジトリ| (バージョン管理されたルール)
|  (MT <-> 標準 <-> MX)  |      +--------------------+
+-----------------------+
        |
        v
+-----------------------+      +--------------------+
|  Validation層          | <--> |  Schema Registry   |  (XSD + CBPR+使用ルール、
|  - XSDスキーマ検証      |      |  バージョン別に保管/配布| バージョン別)
|  - 使用ガイドライン検証  |      +--------------------+
|  - ビジネスルール検証    |
+-----------------------+
        |
        v
   [SWIFTゲートウェイ / RTGSアダプタ]

設計ポイント:

変換器実装の骨格(Python):

# pacs.008 -> 内部標準モデルのパース骨格(lxml使用)
from lxml import etree

NS = {"p8": "urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08"}

def parse_pacs008(xml_bytes: bytes, xsd: etree.XMLSchema) -> dict:
    doc = etree.fromstring(xml_bytes)
    if not xsd.validate(doc):
        raise SchemaError([str(e) for e in xsd.error_log])

    tx = doc.find(".//p8:CdtTrfTxInf", NS)
    amt_el = tx.find("p8:IntrBkSttlmAmt", NS)
    payment = {
        "msg_id":   doc.findtext(".//p8:GrpHdr/p8:MsgId", namespaces=NS),
        "uetr":     tx.findtext("p8:PmtId/p8:UETR", namespaces=NS),
        "e2e_id":   tx.findtext("p8:PmtId/p8:EndToEndId", namespaces=NS),
        "amount":   amt_el.text,
        "currency": amt_el.get("Ccy"),
        "settle_date": tx.findtext("p8:IntrBkSttlmDt", namespaces=NS),
        "debtor": {
            "name":    tx.findtext("p8:Dbtr/p8:Nm", namespaces=NS),
            "country": tx.findtext("p8:Dbtr/p8:PstlAdr/p8:Ctry", namespaces=NS),
        },
        "creditor": {
            "name":    tx.findtext("p8:Cdtr/p8:Nm", namespaces=NS),
            "country": tx.findtext("p8:Cdtr/p8:PstlAdr/p8:Ctry", namespaces=NS),
        },
        "charge_bearer": tx.findtext("p8:ChrgBr", namespaces=NS),
    }
    # 使用ガイドライン検証の例: UETRは必須(CBPR+)
    if not payment["uetr"]:
        raise UsageRuleError("UETR is mandatory under CBPR+")
    return payment

Java界隈ではProwideライブラリが事実上の標準に近い存在です。

// Prowide ISO 20022の使用例(概念骨格)
import com.prowidesoftware.swift.model.mx.MxPacs00800108;

public class Pacs008Reader {
    public PaymentDto read(String xml) {
        MxPacs00800108 mx = MxPacs00800108.parse(xml);
        var tx = mx.getFIToFICstmrCdtTrf().getCdtTrfTxInf().get(0);
        PaymentDto dto = new PaymentDto();
        dto.setUetr(tx.getPmtId().getUETR());
        dto.setAmount(tx.getIntrBkSttlmAmt().getValue());
        dto.setCurrency(tx.getIntrBkSttlmAmt().getCcy());
        dto.setCreditorName(tx.getCdtr().getNm());
        return dto;
    }
}

テスト戦略

メッセージングシステムのテストはレイヤー別に分けるべきです。

  1. スキーマ検証テスト: すべての送信メッセージが対象XSDと使用ガイドラインを通過するか。メッセージビルダーの単体テストにXSD検証を含めます。
  2. ゴールデンファイルテスト: 代表シナリオ(通貨別、手数料負担別、中継銀行の有無、返金・取消)の入力と期待出力メッセージをゴールデンファイルとして固定し、変換器の変更時に差分をレビューします。
  3. ラウンドトリップテスト: 内部モデル → MX → 内部モデルに戻したとき情報が保存されるか。MTを経由する経路では、損失フィールドのリストが仕様と一致するかを検証します。
  4. ネガティブテスト: 必須要素の欠落、不正な通貨コード、長さ超過、許可されない文字など、拒否ケースが意図したエラーコードに落ちるか。
  5. シナリオ(エンドツーエンド)テスト: 相手機関シミュレータを置き、支払 → 状態報告(pacs.002)→ 取消依頼(camt.056)→ 返金(pacs.004)の対話全体を検証します。SWIFTが提供するテスト環境と検証ツール(MyStandardsベースの仕様共有など)を活用します。
  6. 性能テスト: XSD検証はCPUを消費します。締め時間帯のピークTPSで検証込みの処理遅延がSLAに収まるかを測定します。スキーマコンパイルのキャッシングは基本です。

運用上の落とし穴

実戦でよく出会う問題です。

導入チェックリスト

おわりに

ISO 20022移行は「フォーマット入替プロジェクト」として始まり、「データ品質プロジェクト」として終わります。XMLのパースとスキーマ検証は難しくありません。難しいのは、数十年にわたり自由テキストに適応してきたシステム、手順、データの構造化です。そしてその構造化が完了した地点で初めて — より正確なスクリーニング、より高いSTP、より豊かな分析という — 移行の配当が支払われます。変換レイヤーでしのいでいる段階なら、まず正規モデルとスキーマガバナンスに投資することをお勧めします。それがネイティブ移行への最短の道です。

参考資料

コメント

まだコメントはありません。

ログインするとコメントできます