ACPR - Banking and Insurance in France

Data - Banque de France

🇫🇷 Version française

Info

Last observation: Annuel: 31 déc 2024 (N = 19,040)

First observation: Annuel: 31 déc 2006 (N = 19,040)

Last data update: 11 aoû 2026, 19:22. Last compile: 14 aoû 2026, 21:23

Structure

LAST_DOWNLOAD

LAST_DOWNLOAD
2026-08-11

LAST_COMPILE

LAST_COMPILE
2026-08-14

Last

date Nobs
2024-12-31 1313

Bank Prudential Ratios (Top 6 French Banking Groups)

Solvency (CET1) and Leverage

Code
ACPR |>

  filter(variable %in% c("ACPR.A.BQ.PRUDENTIEL.RATIO_CET1.361._Z._Z.PHNC._Z.TOP6_AUT_GROUPES",
                          "ACPR.A.BQ.PRUDENTIEL.GB_COR_LEVIER_DISTRIB001_26.144._Z._Z.PHNC._Z.TOP6_AUT_GROUPES")) |>
  mutate(Series = ifelse(MNE == "RATIO_CET1", "CET1 solvency ratio", "Leverage ratio (median)"),
         value = value/100) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Series)) +
  geom_point(aes(x = date, y = value, color = Series)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank())

Liquidity (LCR and NSFR)

Code
ACPR |>

  filter(variable %in% c("ACPR.A.BQ.PRUDENTIEL.GB_COR_LCR9719_50.140._Z._Z.PHNC._Z.TOP6_AUT_GROUPES",
                          "ACPR.A.BQ.PRUDENTIEL.NSFR1239300.633._Z._Z.PHNC._Z.TOP6_AUT_GROUPES")) |>
  mutate(Series = ifelse(MNE == "GB_COR_LCR9719_50", "LCR (median)", "NSFR"),
         value = value/100) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Series)) +
  geom_point(aes(x = date, y = value, color = Series)) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "black") +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  theme(legend.position = c(0.3, 0.85),
        legend.title = element_blank())

Prudential Ratios: Latest Available Year

Code
ACPR |>

  filter(variable %in% c("ACPR.A.BQ.PRUDENTIEL.RATIO_CET1.361._Z._Z.PHNC._Z.TOP6_AUT_GROUPES",
                          "ACPR.A.BQ.PRUDENTIEL.GB_COR_LEVIER_DISTRIB001_26.144._Z._Z.PHNC._Z.TOP6_AUT_GROUPES",
                          "ACPR.A.BQ.PRUDENTIEL.GB_COR_LCR9719_50.140._Z._Z.PHNC._Z.TOP6_AUT_GROUPES",
                          "ACPR.A.BQ.PRUDENTIEL.NSFR1239300.633._Z._Z.PHNC._Z.TOP6_AUT_GROUPES")) |>
  mutate(Series = case_when(MNE == "RATIO_CET1" ~ "CET1 solvency ratio",
                            MNE == "GB_COR_LEVIER_DISTRIB001_26" ~ "Leverage ratio (median)",
                            MNE == "GB_COR_LCR9719_50" ~ "LCR (median)",
                            MNE == "NSFR1239300" ~ "NSFR")) |>
  filter(date == max(date)) |>
  select(Series, date, value) |>
  arrange(Series) |>
  print_table_conditional()
Series date value
CET1 solvency ratio 2024-12-31 16.13
LCR (median) 2024-12-31 239.14
Leverage ratio (median) 2024-12-31 7.21
NSFR 2024-12-31 115.63

Solvency II: SCR Coverage Ratio (Insurance)

By Business Segment

Code
ACPR |>

  filter(MNE == "SCR",
         CONSOLIDATION == "SOLO",
         POPULATION %in% c("_Z", "VM", "NV", "BA", "RE")) |>
  mutate(Segment = case_when(POPULATION == "_Z" ~ "Whole sector",
                              POPULATION == "VM" ~ "Life insurance",
                              POPULATION == "NV" ~ "Non-life insurance",
                              POPULATION == "BA" ~ "Bancassurers",
                              POPULATION == "RE" ~ "Reinsurance and holding companies"),
         value = value/100) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Segment)) +
  geom_point(aes(x = date, y = value, color = Segment)) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "black") +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  theme(legend.position = c(0.25, 0.25),
        legend.title = element_blank())

Latest Available Year

Code
ACPR |>

  filter(MNE == "SCR",
         CONSOLIDATION == "SOLO",
         POPULATION %in% c("_Z", "VM", "NV", "BA", "RE")) |>
  mutate(Segment = case_when(POPULATION == "_Z" ~ "Whole sector",
                              POPULATION == "VM" ~ "Life insurance",
                              POPULATION == "NV" ~ "Non-life insurance",
                              POPULATION == "BA" ~ "Bancassurers",
                              POPULATION == "RE" ~ "Reinsurance and holding companies")) |>
  filter(date == max(date)) |>
  select(Segment, date, value) |>
  arrange(desc(value)) |>
  print_table_conditional()
Segment date value
Non-life insurance 2024-12-31 273.3
Whole sector 2024-12-31 239.4
Life insurance 2024-12-31 232.6
Reinsurance and holding companies 2024-12-31 230.6
Bancassurers 2024-12-31 223.7