Balance of payments

Data - OECD

Info

source dataset .html .RData
oecd BOP 2024-11-22 2024-11-22

Last

obsTime Nobs
2024-Q3 518

REF_AREA

Code
BOP %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  group_by(REF_AREA, Ref_area) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()

FREQ

Code
BOP %>%
  left_join(FREQ, by = "FREQ") %>%
  group_by(FREQ, Freq) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
FREQ Freq Nobs
Q Quarterly 597712
A Annual 146879
M Monthly 30072

ACCOUNTING_ENTRY

Code
BOP %>%
  left_join(ACCOUNTING_ENTRY, by = "ACCOUNTING_ENTRY") %>%
  group_by(ACCOUNTING_ENTRY, Accounting_entry) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
ACCOUNTING_ENTRY Accounting_entry Nobs
C Revenue 202128
B Balance (revenue minus expenditure) 195905
D Expenditure 184201
N Net (assets minus liabilities) 77040
A Assets (or net acquisition of assets) 64404
L Liabilities (or net incurrence of liabilities) 50985

UNIT_MEASURE

Code
BOP %>%
  left_join(UNIT_MEASURE, by = "UNIT_MEASURE") %>%
  group_by(UNIT_MEASURE, Unit_measure) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
UNIT_MEASURE Unit_measure Nobs
USD_EXC US dollars, exchange rate converted 429693
XDC National currency 307493
PT_GS Percentage of goods and services 15082
PT_CA Percentage of current account 14990
PT_B1GQ Percentage of GDP 7405

MEASURE

Code
BOP %>%
  left_join(MEASURE, by = "MEASURE") %>%
  group_by(MEASURE, Measure) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
MEASURE Measure Nobs
S Services 115230
CA Current account 92417
G Goods 84930
IN1 Primary income 84697
IN2 Secondary income 84693
FA_D_F Direct investment 38988
FA Financial account 38871
FA_O_F Other investment 38316
KA Capital account 38172
FA_P_F Portfolio investment 37889
NP Gross acquisitions / disposals of nonproduced nonfinancial assets 24706
D9 Capital transfers 24432
G2 Net exports of goods under merchanting 14490
FA_R_F_S121 Reserve assets 13419
EO Net errors and omissions 13414
FA_F_F7 Financial derivatives 11532
G22 Goods sold under merchanting 9241
G21 Goods acquired under merchanting 9226

Financial account

EU vs. US vs. DE vs. FR

All

Code
BOP %>%
  filter(MEASURE == "FA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU", "FRA"),
         FREQ == "Q",
         UNIT_MEASURE == "USD_EXC",
         ACCOUNTING_ENTRY == "N") %>%
  arrange(desc(obsTime)) %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  #filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Financial Account") +
  scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1949, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 500)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

1999-

Code
BOP %>%
  filter(MEASURE == "FA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU", "FRA"),
         FREQ == "Q",
         UNIT_MEASURE == "USD_EXC",
         ACCOUNTING_ENTRY == "N") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Financial Account") +
  scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1999, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 500)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

Current account (CA, % of GDP)

EU vs. US

All

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EA20"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA20", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 5) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

2012-

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EA20"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA20", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  rename(Location = Ref_area) %>%
  filter(date >= as.Date("2013-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
  geom_label(data = . %>% filter(date == max(date)),
             aes(x = date, y = obsValue, label = percent(obsValue), color = color))

EU27_2020 vs. US

All

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 5) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

1999-

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_2flags +
  scale_x_date(breaks = c(seq(1997, 2100, 5), seq(1999, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

EU vs. US vs. IT

1999-

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020", "ITA"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_3flags +
  scale_x_date(breaks = c(seq(1997, 2100, 5), seq(1999, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

EU vs. US vs. DE vs. FR

All

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU", "FRA"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  #filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1949, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

1999-

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU", "FRA"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1997, 2100, 5), seq(1999, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

EU vs. US vs. DE

All

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  #filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_4flags +
  scale_x_date(breaks = c(seq(1949, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")

1999-

Code
BOP %>%
  filter(MEASURE == "CA",
         REF_AREA %in% c("USA", "EU27_2020", "DEU"),
         FREQ == "Q",
         UNIT_MEASURE == "PT_B1GQ") %>%
  quarter_to_date() %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  arrange(desc(date)) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EU27_2020", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "USA", color2, color)) %>%
  mutate(obsValue = obsValue/100) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  rename(Location = Ref_area) %>%
  #filter(date <= as.Date("2021-01-01")) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  theme_minimal() + xlab("") + ylab("Current Account, % of GDP") +
  scale_color_identity() + add_3flags +
  scale_x_date(breaks = c(seq(1997, 2100, 5), seq(1999, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-60, 60, 1),
                     labels = scales::percent_format(accuracy = 1)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "black")