MAS credit & charge cards via data.gov.sg · all issuers in Singapore, not one bank

Higher card write-offs: more balance, or a higher loss ratio?

2025 write-offs rose S$96.5 million. An arithmetic split assigns S$63.9 million to higher revolving balances and S$32.6 million to a higher recomputed loss ratio. The larger ratio increase happened in 2024; the published quarterly rate then stayed at 5.9–6.0% from 2025 Q1 through 2026 Q2.

Balance growth is not automatically healthy expansion or confirmed stress: spending and slower repayment can both raise balances. Average reported total cards fell 0.4% while aggregate rollover balance per reported card rose 15%; unique customers cannot be measured, and the per-card proxy includes non-revolving cards. A ratio change does not isolate credit quality.

Fixed historical snapshot: pulled 2026-10-03, quarterly coverage 2014 Q4–2026 Q2. Text is maintained manually, not automatically refreshed. Repository, code and full method.

+96.5 S$M
write-offs 423.2 → 519.7, 2025 vs 2024 — all issuers in Singapore, not one bank
+63.9 / +32.6
the split in S$M: balance (higher aggregate balance per reported card) / recomputed ratio — midpoint arithmetic, not causal attribution
cards −32 or +30
annual-average balance split: total cards −32 / per-card +1,167 S$M; principal-only +30 / per-card +1,105. Denominator-sensitive proxies, not customer counts
5.44% → 5.83%
recomputed annual rate (published 5.4 → 5.8) — an average that lags: the step-up landed in 2024; still below 2020's 7.08%
±0.05 pt
recomputed vs published annual rate, 11/11 years — the data-quality receipt; flows, rollover & principal-card stocks reconcile
−4.0%
principal cardholders, 2025 Q3 in one quarter (the largest move in the file) — flagged, not explained
Billings, write-offs, trailing 4-quarter write-offs and the charge-off rate, 2015–2026
Billings and write-offs are quarterly flows; trailing-four-quarter write-offs use full windows. Published charge-off rate is a loss ratio, not an interest rate. 2015 Q1–2026 Q2. View full-size chart · dark version.

More views

Waterfall: 2025 vs 2024, 2024 vs 2023 and 2020 vs 2019, split into balance and proxy-ratio terms
2024 vs 2023: +152.8 = balance +50.0 + ratio +102.8 S$M. Comparing the 2022 and 2025 endpoints, the ratio term is larger (an endpoint split, not summed yearly contributions); the smaller 2025 proxy-ratio change is a separate comparison. View full-size chart · dark version.
Positive and negative balance and ratio contributions to yearly write-off changes, 2016–2025
Every year's change, balance versus proxy ratio, 2016–2025. View full-size chart · dark version.
Quarter-end reported counts and revolving balances, plus annual write-offs per principal-card proxy; Q3 2025 break flagged
Lines are quarter-end observations; annual per-card metrics use average quarter-end counts. Principal counts fell 6,349,360 → 6,095,333 (−4.0%) from 2025 Q2 to Q3. The break remains unexplained; principal-only counts do not solve it. View full-size chart · dark version.
Excel quick-check. Quarter selector, full trailing-four-quarter sum and annual bridge formulas. Requires XLOOKUP support (Microsoft 365 / Excel 2021 or later); formula-only, no macros. Non-recalculating previews may be blank. Python input checks are not spreadsheet-engine evaluation.

outputs/quick_check.xlsx · frozen release downloads (may differ from the working tree).

Method

What I did — Hermes-assisted: Hermes implemented the pipeline and presentation; Faiz approved the question, comparison years, decomposition method and wording at the review gate. The work demonstrates SQL staging, metric definitions, arithmetic decomposition, reconciliation and communication of limits, not unaided coding.

Our recomputed proxy ratio is summed annual write-offs divided by the average of four quarter-end balances. Agreement with published annual rates is empirical, not proof of identical denominators. A published-rate substitution changes the balance term −0.3507 and ratio term +0.8124 S$M, leaving a separate −0.46175 basis-and-rounding residual. H1-vs-H1 is same-season, not seasonality-free.

  1. Pull — MAS credit & charge cards from data.gov.sg; structure-validated before replacing files, SHA-256 + coverage in a manifest (2014 Q4 → 2026 Q2). src/download.py
  2. Audit — manually maintained, based on independent raw-file evidence: flows, stocks and proxy-rate reconciliation. Current publisher definition notes remain a retrieval gap; the audit records what was and was not retrieved. docs/data_audit.md
  3. Stage & check — the wide raw file unpivots to one tidy row per quarter; dataset checks run before dataset publication. The complete runner stages and validates before publication; stage failures preserve outputs and ordinary publication exceptions roll back. Individual scripts do not provide whole-run rollback. Single writer only; swaps are not crash/power-loss atomic. sql/01 · sql/03
  4. Measure & bridge — complete years only; the change in write-offs splits into volume (Δrollover × avg rate) + rate (Δrate × avg rollover), midpoint weights; the balance change splits further into cards −32 + balance-per-card +1,167 S$M. src/analysis.py → yearly_bridge.csv · book_split.csv
  5. Draw, write, check — four figures as code, light and dark (src/figures.py); then the decision memo and the Excel quick-check with live bridge formulas.

Reproduce

git clone https://github.com/faizsaifulnizam/card-book-quality && cd card-book-quality
uv venv .venv --python 3.12 --seed   # seed pip; or: python -m venv .venv
source .venv/bin/activate            # Linux/macOS Bash
# Windows Git Bash: source .venv/Scripts/activate
# Windows PowerShell: .\.venv\Scripts\Activate.ps1
# Windows cmd.exe: .venv\Scripts\activate.bat
python -m pip install --require-hashes -r requirements.lock

python src/run_all.py        # vendored inputs: no data-fetch network required

See README for individual stages. The dependency lock fully resolves packages with hashes; optional lxml backend coverage applies only when available. Check the 2025 CSV row: +96.5 = +63.9 + +32.6. Workbook default inputs (2026 Q2) are write-offs 138.1, full-window sum 543.4 and published-rate change −0.1 pt; formula-input checks do not prove Excel evaluation. Refreshes require review of annual-source overlap, historical metadata and maintained text. No figure hash-check or live-CI success is asserted here.

Read more