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

Data - Eurostat

Info

source dataset .html .RData
eurostat bop_gdp6_q 2025-08-27 2025-08-24

Data on europe

source dataset .html .RData
eurostat bop_gdp6_q 2025-08-27 2025-08-24
eurostat nama_10_a10 2025-08-27 2025-08-24
eurostat nama_10_a10_e 2025-08-27 2025-08-24
eurostat nama_10_gdp 2025-08-27 2025-08-24
eurostat nama_10_lp_ulc 2025-08-27 2025-08-24
eurostat namq_10_a10 2025-05-24 2025-08-24
eurostat namq_10_a10_e 2025-05-24 2025-08-24
eurostat namq_10_gdp 2025-08-27 2025-08-24
eurostat namq_10_lp_ulc 2025-08-27 2025-08-24
eurostat namq_10_pc 2025-08-27 2025-08-24
eurostat nasa_10_nf_tr 2025-08-27 2025-08-24
eurostat nasq_10_nf_tr 2025-08-27 2025-08-24
eurostat tipsii40 2025-08-27 2025-08-24

Data on macro

source dataset .html .RData
eurostat nama_10_a10 2025-08-27 2025-08-24
eurostat nama_10_a10_e 2025-08-27 2025-08-24
eurostat nama_10_gdp 2025-08-27 2025-08-24
eurostat nama_10_lp_ulc 2025-08-27 2025-08-24
eurostat namq_10_a10 2025-05-24 2025-08-24
eurostat namq_10_a10_e 2025-05-24 2025-08-24
eurostat namq_10_gdp 2025-08-27 2025-08-24
eurostat namq_10_lp_ulc 2025-08-27 2025-08-24
eurostat namq_10_pc 2025-08-27 2025-08-24
eurostat nasa_10_nf_tr 2025-08-27 2025-08-24
eurostat nasq_10_nf_tr 2025-08-27 2025-08-24
fred gdp 2025-08-25 2025-08-24
oecd QNA 2024-06-06 2025-05-24
oecd SNA_TABLE1 2025-08-25 2025-05-24
oecd SNA_TABLE14A 2025-08-25 2024-06-30
oecd SNA_TABLE2 2024-07-01 2024-04-11
oecd SNA_TABLE6A 2024-07-01 2024-06-30
wdi NE.RSB.GNFS.ZS 2025-08-25 2025-08-24
wdi NY.GDP.MKTP.CD 2025-08-25 2025-08-24
wdi NY.GDP.MKTP.PP.CD 2025-08-25 2025-08-24
wdi NY.GDP.PCAP.CD 2025-08-25 2025-08-24
wdi NY.GDP.PCAP.KD 2025-08-10 2025-08-24
wdi NY.GDP.PCAP.PP.CD 2025-08-25 2025-08-24
wdi NY.GDP.PCAP.PP.KD 2025-08-25 2025-08-24

LAST_COMPILE

LAST_COMPILE
2025-08-26

Last

Code
bop_gdp6_q %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  head(1) %>%
  print_table_conditional()
time Nobs
2025Q1 3576

unit

Code
bop_gdp6_q %>%
  left_join(unit, by = "unit") %>%
  group_by(unit, Unit) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
unit Unit Nobs
PC_GDP Percentage of gross domestic product (GDP) 540013
PC_GDP_3Y Percentage of GDP - three-year average 40860

s_adj

Code
bop_gdp6_q %>%
  left_join(s_adj, by = "s_adj") %>%
  group_by(s_adj, S_adj) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
s_adj S_adj Nobs
NSA Unadjusted data (i.e. neither seasonally adjusted nor calendar adjusted data) 571144
SCA Seasonally and calendar adjusted data 9729

bop_item

Code
bop_gdp6_q %>%
  left_join(bop_item, by = "bop_item") %>%
  group_by(bop_item, Bop_item) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
bop_item Bop_item Nobs
S Services 88691
G Goods 87743
GS Goods and services 85218
FA__D__F Financial account; Direct Investment 63287
IN2 Secondary income 50888
KA Capital account 50399
FA__P__F Financial account; Portfolio Investment 32844
FA Financial account 31898
CA Current account 22780
IN1 Primary income 22218
CKA Current plus capital account (balance = Net lending (+) / net borrowing (-)) 21719
S_X_CG Services excluding Transport and Financial services 14741
FA__FNED Net external debt 4505
FA__NENDI Net international investment position excluding non-defaultable instruments 3684
FA__TXR__F Financial account excluding reserve assets 258

stk_flow

Code
bop_gdp6_q %>%
  left_join(stk_flow, by = "stk_flow") %>%
  group_by(stk_flow, Stk_flow) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
stk_flow Stk_flow Nobs
CRE Credit 116460
DEB Debit 105481
BAL Balance 105180
CRE_DEB_SUM Sum of credits and debits 64394
CRE_DEB_AVG Average of credits and debits 53008
ASS Assets 31518
NET Net 27114
LIAB Liabilities 26722
N_LE Net positions at the end of period 18280
A_LE Assets - positions at the end of period 14786
L_LE Liabilities - positions at the end of period 14159
NE_LE Net liabilities (liabilities minus assets) 3771

partner

Code
bop_gdp6_q %>%
  left_join(partner, by = "partner") %>%
  group_by(partner, Partner) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  mutate(Partner = ifelse(partner == "DE", "Germany", Partner)) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(Partner)),
         Flag = paste0('<img src="../../bib/flags/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

geo

Code
bop_gdp6_q %>%
  left_join(geo, by = "geo") %>%
  group_by(geo, Geo) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

time

Code
bop_gdp6_q %>%
  group_by(time) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(time)) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

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"))) %>%
  left_join(geo, by = "geo") %>%
  left_join(bop_item, by = "bop_item") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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") %>%
  left_join(geo, by = "geo") %>%
  left_join(stk_flow, by = "stk_flow") %>%
  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))