Main Balance of Payments and International Investment Position items as share of GDP (BPM6)

Data - Eurostat

Info

Last observation: Quarterly: 2026Q1 (N = 3,680) · Annual: 2025 (N = 3,978)

First observation: Quarterly: 1991Q1 (N = 142) · Annual: 1991 (N = 140)

Last data update: 23 jul 2026, 22:20. Last compile: 24 jul 2026, 00:57

Structure

France, Germany, Italy

Last

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  quarter_to_date %>%
  filter(geo %in% c("FR", "DE", "IT"),
         date == max(date, na.rm = T),
         !(stk_flow %in% c("CRE", "DEB"))) %>%
  
  
  
  select(-geo) %>%
  spread(Geo, values) %>%
  select_if(~ n_distinct(.) > 1) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

Germany, Spain, France, Italy, Netherlands, Europe

Current account Balance

All

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "CA",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Current account balance") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))

2006-

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "CA",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  filter(date >=as.Date("2006-01-01")) %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Current account balance") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))

2012-

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "CA",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  filter(date >=as.Date("2012-01-01")) %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Current account balance") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))

Net Investment Positions (FA__NENDI)

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "FA__NENDI",
         s_adj == "NSA") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_5flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Net international investment positions (% of GDP)") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 10),
                     labels = scales::percent_format(accuracy = 1))

Goods and Services

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "GS",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Goods and Services") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))

Goods

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "G",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Goods") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))

Services

Code
bop_gdp6_q %>%
  filter(freq == "Q") %>%
  filter(((geo %in% c("DE", "ES", "FR", "IT", "NL", "EA20")) & partner == "WRL_REST") |
           (geo == "EA20" & partner == "EXT_EA20"),
         unit == "PC_GDP",
         bop_item == "S",
         s_adj == "NSA",
         stk_flow == "BAL") %>%
  
  
  select_if(~ n_distinct(.) > 1) %>%
  quarter_to_date %>%
  mutate(Geo = ifelse(geo == "EA20", "Europe", Geo)) %>%
  left_join(colors, by = c("Geo" = "country")) %>%
  mutate(values = values/100) %>%
  ggplot + geom_line(aes(x = date, y = values, color = color)) + theme_minimal() +
  scale_color_identity() + add_6flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  xlab("") + ylab("Services") +
  scale_y_continuous(breaks = 0.01*seq(-100, 200, 2),
                     labels = scales::percent_format(accuracy = 1))