National Financial Accounts - CNF

Data - Banque de France

🇫🇷 Version française

Info

Last observation: Trimestriel: 31 mar 2026 (N = 304,634)

First observation: Trimestriel: 31 déc 1995 (N = 304,634)

Last data update: 10 aoû 2026, 18:57. Last compile: 14 aoû 2026, 21:47

Structure

Net Lending (+) / Net Borrowing (-) by Sector

Balance of financial claims and liabilities (quarterly flows, non-consolidated).

NFCs, Households, General Government, Total Economy

Code
CNF |>

  filter(variable %in% c("CNF.Q.N.FR.W0.S11.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1M.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S13.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T")) |>
  mutate(Sector = case_when(REF_SECTOR == "S11" ~ "Non-financial corporations",
                              REF_SECTOR == "S1M" ~ "Households",
                              REF_SECTOR == "S13" ~ "General government",
                              REF_SECTOR == "S1" ~ "Total economy"),
         value = value/1000) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Sector)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(labels = dollar_format(accuracy = 1, prefix = "", suffix = " €bn")) +
  theme(legend.position = c(0.25, 0.2),
        legend.title = element_blank(),
        legend.text = element_text(size = 7))

Since 2015

Code
CNF |>

  filter(variable %in% c("CNF.Q.N.FR.W0.S11.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1M.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S13.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T")) |>
  filter(date >= as.Date("2015-01-01")) |>
  mutate(Sector = case_when(REF_SECTOR == "S11" ~ "Non-financial corporations",
                              REF_SECTOR == "S1M" ~ "Households",
                              REF_SECTOR == "S13" ~ "General government",
                              REF_SECTOR == "S1" ~ "Total economy"),
         value = value/1000) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Sector)) +
  geom_point(aes(x = date, y = value, color = Sector)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = "1 year",
               labels = date_format("%Y")) +
  scale_y_continuous(labels = dollar_format(accuracy = 1, prefix = "", suffix = " €bn")) +
  theme(legend.position = c(0.25, 0.15),
        legend.title = element_blank(),
        legend.text = element_text(size = 7),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Latest Available Quarter

Code
CNF |>

  filter(variable %in% c("CNF.Q.N.FR.W0.S11.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1M.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S13.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T",
                          "CNF.Q.N.FR.W0.S1.S1.N.N.B9F.F._Z._Z.XDC._T.S.V.N._T")) |>
  filter(!is.na(value)) |>
  mutate(Sector = case_when(REF_SECTOR == "S11" ~ "Non-financial corporations",
                              REF_SECTOR == "S1M" ~ "Households",
                              REF_SECTOR == "S13" ~ "General government",
                              REF_SECTOR == "S1" ~ "Total economy"),
         value = value/1000) |>
  filter(date == max(date)) |>
  select(Sector, date, "€bn" = value) |>
  arrange(desc(`€bn`)) |>
  print_table_conditional()
Sector date €bn
Households 2026-03-31 52.320
Non-financial corporations 2026-03-31 -35.664
General government 2026-03-31 -46.910