---
title: "Reading a loan tape: vintage curves, aging, and attribution"
url: https://lendriskanalytics.com/analyze.html
publisher: LendRisk Analytics
kind: Page
description: "How a loan-level CSV becomes a portfolio read: static-pool vintage loss curves, delinquency aging, dealer attribution, and concentration screens, with the formulas, thresholds, and column vocabulary written out in the open."
html: https://lendriskanalytics.com/analyze.html
---

# Reading a loan tape: vintage curves, aging, and attribution

[← All insights](https://lendriskanalytics.com/articles.html)

Methods · Note 01
Method note · 7 min read

Methods · Reading the tape

# Reading a loan tape: vintage curves, aging, and attribution.

LendRisk Analytics · Method note · 2026

A loan-level file is a set of claims about a portfolio. This note publishes the method for testing those claims: how a raw CSV becomes static-pool vintage loss curves, delinquency aging, dealer attribution, and concentration screens. The formulas, thresholds, and column vocabulary below are the complete method, in the open. None of it is exotic, it is the same arithmetic behind every rating-agency pre-sale table, applied one loan at a time.

## What the method needs from the file

A tape arrives as one row per loan, and no two servicing systems label their columns the same way. So the first step is mechanical: map whatever headers exist onto a standard field set, matching each header exactly first, then by substring, case-insensitive. Seven fields carry the read, origination date, dealer or source, original balance, delinquency status, charge-off amount, recoveries, and a credit score. Everything else (term, LTV, state, mileage, vehicle age) sharpens the segmentation but is not required. The full matching vocabulary:

| Field | Header names accepted |
|---|---|
| Origination date | orig_date, origination, orig, funded, book_date, contract_date, open_date |
| As-of date | as_of, asof, report_date, snapshot, statement_date, data_date |
| Dealer / source | dealer, source, originator, seller |
| Original balance | orig_balance, original_balance, amount_financed, funded_amount, loan_amount, financed, original_amount |
| Current balance | current_balance, balance, principal_balance, outstanding, curr_balance |
| Delinquency status | dpd, days_past_due, delinquency, delq, bucket, status, loan_status |
| Charge-off | charge_off, chargeoff, co_amount, gross_loss, loss_amount, charged_off |
| Recoveries | recovery, recoveries, recovered, recovery_amount |
| Credit score | fico, score, credit_score, bureau |
| First-default timing | epd, first_default, months_to_first_default, months_to_first_delinquency, mob_first_delq |
| LTV | ltv, loan_to_value |
| Term | term, term_months, orig_term |
| Model year / vehicle age | vehicle_year, model_year, vyear, car_year, year · vehicle_age, veh_age, car_age, age |
| Mileage | mileage, miles, odometer |
| Collateral type | vehicle_type, collateral, make, body, segment |
| State | state, st, geo, region |
| Loan identifier | loan_id, loanid, id, account, contract, acct |

Bold rows are the core fields the read depends on. This is the actual detection vocabulary, published as method.

One quiet assumption sits under everything: the as-of date. Every age calculation runs from origination to the snapshot date, and if the file does not carry one, the reader has to assume today's date, after which every months-on-book figure inherits that guess.

## The definitions, written out

Delinquency status is the messiest column on any tape, so it gets parsed permissively. Text containing "charge" (or exactly "co") is charged off; "repo" is repossession; "paid" or "payoff" is closed clean. Anything numeric is days past due: 90 or more is the 90+ bucket, 60 or more is 60-89, 30 or more is 30-59, anything else is current. From there, four definitions do almost all of the work.

**Cumulative net loss** is the sum of max(0, charge-off − recoveries), divided by the sum of *originated* balance. Both choices matter: net of recoveries, and divided by originated, never current, balance. Dividing by current balance flatters a shrinking book. Where a loan is marked charged-off or repossessed but no loss amount exists, the current balance stands in as the gross loss (originated balance if that is missing too). **60+ DPD** is the share of active loans, paid-off and charged-off excluded from the denominator, sitting at 60+, 90+, or in repossession. **Months on book** is whole calendar months from origination to the as-of date. **Early payment default** is a first default within three months of origination; when the tape has no first-default column, the proxy is severe delinquency at six or fewer months on book. Averages are balance-weighted throughout.

| Measure | Rule as applied | Bands / presets |
|---|---|---|
| Cumulative net loss | Σ max(0, charge-off − recoveries) ÷ Σ originated balance | quiet ≤8% · watch 8-13% · elevated >13% Fitch reference 9.81% |
| 60+ DPD | 60+/90+/repossession ÷ active loans | quiet ≤5% · watch 5-7% · elevated >7% industry reference 6.65% |
| Early payment default | first default ≤3 months; proxy: severe status at ≤6 months on book | — |
| Dealer flag | net loss >1.5× the median dealer and >10% absolute | "clean" 4% absolute | top 6 by loss share |
| Concentration | HHI = 10,000 × Σ (dealer share of balance)²; top-3 share alongside | — |
| Credit bins | score at origination | The actual thresholds, bins, and flag rules, published in full. The Fitch and industry reference points are the benchmark figures displayed alongside the same metrics on the original dashboard.

## Vintage curves: hold age constant

A single loss number for a whole book is a blend of cohorts at different ages, and blends hide slopes. The static-pool discipline is simple: group loans by origination quarter, compute each cohort's cumulative net loss against its *own* originated balance, and index by months on book rather than calendar date. Losses then become comparable at matched age. Here is the shape the method is built to catch, in a worked example:

| Vintage | Loans | Originated | Age (MOB) | Cum net loss | 60+ DPD | EPD rate |
|---|---|---|---|---|---|---|
| 2023 Q1 | 380 | $6.2M | 14 mo | 4.1% | 3.2% | 1.9% |
| 2023 Q3 | 372 | $6.0M | 14 mo | 9.7% | 6.8% | 5.6% |

Synthetic and illustrative, these numbers describe the shape of the method, not any real portfolio. Both rows are measured at fourteen months on book, which means the observations come from different calendar dates.

The blended book behind this example prints roughly 6.4% cumulative net loss: under the 8% watch line, under the 9.81% Fitch reference, apparently unremarkable. The blend is calm because the mature vintages have flattened and the youngest are too green to show loss yet, while the one vintage that matters is running at more than twice its sibling's pace at identical age. The aggregate is not lying. It is averaging.

**Inference**A book whose younger vintages sit above its older vintages at matched age is deteriorating at origination, not merely aging. That is a different problem from a seasoned book working through old loss, and it predicts where the blended number goes as those vintages season. The aggregate cannot make this distinction; the curve exists to make it.

## Attribution: who carried the loss

The same static-pool numbers, cut by dealer: loan count, share of originated balance, cumulative net loss, and EPD rate, ranked by loss. Two mechanical flags do the sorting. A dealer running above 1.5× the *median* dealer's net loss and above 10% absolute is flagged; one below 0.8× the median reads clean. The median, not the mean, is the yardstick, so a single blown-up channel cannot drag the benchmark upward and hide its peers behind it.

EPD is the sharper of the dealer numbers. A loan that ages twenty months before defaulting failed slowly, for reasons that can include the borrower's life. A loan that never really performs, first default inside three months, usually failed at the point of sale.

**Inference**A dealer channel with an elevated early-payment-default rate is, more often than not, a sourcing and underwriting problem rather than a servicing problem. The loan was weak when it was written. Dealer × vintage is therefore the attribution cut that turns a loss number into a cause.

Share of total net dollar loss, synthetic demo book

In the illustrative book used throughout this note, three flagged dealer channels wrote about a fifth of the originations and carried nearly half the loss.

Synthetic, illustrative only. Flag rule as published above: dealer net loss above 1.5× the median dealer and above 10% absolute.

## Concentration: how lumpy is the book

The third cut asks how much of the book depends on any one thing. Across dealer balances, the Herfindahl-Hirschman index, 10,000 × the sum of squared shares, plus the top-three share give the channel answer. Across risk dimensions, a segment screen runs the published bins over credit score, LTV, term, vehicle age, geography, and dealer, and flags a segment only when all four conditions hold: at least 15 loans, loss at 1.35× the book average or worse, at least 7% of total dollar loss, and above 4% absolute. The four conditions together keep the screen honest, a loss multiple alone flags trivia, and a loss share alone flags whatever happens to be big.

The read
A blended loss number is a claim; a vintage curve at matched age is a test. **The read never comes from the aggregate.** It comes from holding age constant, then asking which vintages, which dealers, and which segments actually carried the dollars, and whether the newest paper is running above the oldest at the same age.

## Limits

Honesty about what this method cannot see matters as much as the method. A single snapshot yields one point per vintage, its current age and cumulative loss to date. That sketches a curve *across* vintages, but it is not a true static-pool triangle: without monthly archives you cannot watch one cohort's path over time, only where each cohort stands now. Recoveries lag charge-offs, so young cohorts read worse than they will settle. Small cohorts are noise dressed as signal, which is why the segment screen refuses to flag anything under 15 loans.

The deeper limit is that the arithmetic trusts the tape. Status fields are self-reported by the servicer; a deferral or extension resets days past due without curing risk, and nothing in the file distinguishes a cured loan from a re-aged one. And no amount of column-mapping can verify the file itself, that the collateral exists, that the balances are real, or that the same loans are not pledged in two places at once. Arithmetic on a tape tests internal consistency. It cannot test whether the tape is true.

**Sources & notes**
The benchmark reference points cited in this note, a 9.81% cumulative net loss reference attributed to Fitch and a 6.65% industry 60+ DPD reference, are the figures that were displayed alongside the same metrics on the original dashboard version of this page. All worked examples, including the two-vintage table and the dealer loss-share bar, are **synthetic and illustrative**; they describe the shape of the method, not any real portfolio. All formulas, thresholds, bins, and the column-detection vocabulary are published in full above. LendRisk Analytics is an independent research publication with no position in, and no affiliation with, any company mentioned. Not investment, legal, or accounting advice.

Have a question about the market, or a different view? [Send it through →](https://lendriskanalytics.com/contact.html).

LR

LendRisk Analytics

Independent market research

Continue reading

[Methods · Note 02 The segments *carrying the loss*](https://lendriskanalytics.com/loss-drivers.html)
[Methods · Note 03 Reading the *dealer channel*](https://lendriskanalytics.com/dealers.html)
