liveBook · Manning

Vintage analysis

As explained in Financial AI in Practice

Vintage analysis groups loans by a shared origination period and compares their performance over time.

A lender can group loans by origination month, then compare each group’s performance at the same age. This is vintage analysis: instead of comparing calendar dates, it aligns cohorts by months on book to reveal when delinquency or default accumulates. section 4.2.2

Spotting a change early

Suppose 3% of January 2023 loans are 30+ days late by month 3, versus 5% of February 2023 loans at month 3. The newer cohort is deteriorating faster. That warrants investigation into underwriting or economic conditions; the comparison alone does not establish the cause. section 4.2.2

To make the comparison useful:

  • Define the event consistently. A 30-days-late measure is not interchangeable with a default rule, and default windows vary by product and policy. section 4.2.2
  • Plot each vintage’s cumulative rate against months on book. A steeper curve signals faster accumulation; a flattening curve suggests most observed defaults have materialized. section 4.2.2
  • Investigate worsening cohorts, then consider changes to score cutoffs or checks. Keep the charts available to support portfolio monitoring and provisioning scrutiny. section 4.2.2
Listing 4.1 Vintage analysis
import pandas as pd
import matplotlib.pyplot as plt

# Step 1: Load the CSV, using "Vintage" as the index
df_loaded = pd.read_csv("vintage_data.csv", index_col="Vintage")

# Step 2: Plot each vintage as a line
plt.figure(figsize=(9,6))
months = range(1, 17)  # for 16 months on book

for vintage in df_loaded.index:
    # Convert each row to numeric in case of missing cells
    row_values = pd.to_numeric(df_loaded.loc[vintage], errors='coerce')
    plt.plot(months, row_values, marker='o', label=vintage)

plt.title("Vintage Analysis: Cumulative Default Rates")
plt.xlabel("Months on Book")
plt.ylabel("Cumulative Default Rate (%)")
plt.xticks(months)
plt.grid(True)
plt.legend(loc='upper left')
plt.show()

The Python listing reads a CSV indexed by vintage, converts row values to numeric, and plots one cumulative-default-rate line per cohort over 16 months. It assumes the stored columns correspond to those months. section 4.2.2

Vintage analysis summarizes cohorts in aggregate. Survival analysis instead tracks each loan’s time to default, providing a more granular time-aware view. section 4.2.2 section 4.6

How Financial AI in Practice covers it

How deep it goes
Works through an age-aligned cohort comparison and CSV-to-chart Python example, without developing a loan-level vintage model.
Examples
Compares January and February 2023 loans at month three and plots 16 months of cumulative default rates from a CSV.
What it assumes
Assumes vintage-level CSV data is already stored and default or delinquency events are consistently defined.
What you can do after
Apply it via pandas and Matplotlib to plot cohort curves and investigate faster deterioration.
How it connects
Links vintage analysis to credit risk, default windows, underwriting, provisioning, and survival analysis.

Related concepts

This explainer was generated by Manning's knowledge graph from the text of Financial AI in Practice. The section links point to the parts of the book it draws on.