The Bank of Finland just released a policy brief introducing a new database on the composition of international reserves:
https://publications.bof.fi/handle/10024/53793
The authors are Falk Laser, Alexander Mihailov, and Jan Weidner. I build on my previous blogs to make some heatplots for the major currencies:
https://www.jamelsaadaoui.com/tag/heatplot/
Let us start with the share of International Reserves in Chinese Yuan. Russia has increased its share of international reserves in CNY for geopolitical reasons. In Australia, New Zealand, Mongolia, Nepal, Mozambique, and South Africa, it is probably the mere result of trade forces.
Overall, the shares of international reserve in USD are pretty stable.
Some countries at the euro area periphery, like Bulgaria, Bosnia and Herzegovina, North Macedonia, and, Romania hold a large share of reserves in euro. The lack of financial depth may explain why they hold so much reserves, especially after the euro crisis, see this paper.
Full code for pedagogical purposes:
import excel "Data.xls", sheet("DATA") firstrow clear
encode country, gen(cn)
summ year
local x1 = `r(min)'
local x2 = `r(max)'
heatplot USD i.cn year if USD>0 , ///
yscale(noline) ///
ylabel(, nogrid labsize(*0.4)) ///
xlabel(`x1'(5)`x2', labsize(*0.5) angle(vertical) ///
nogrid) ///
color(viridis, reverse) ///
cuts(0(10)100) ///
ramp(right space(14) label(0(10)100) format(%4.0f)) ///
p(lcolor(black%10) lwidth(*0.1)) ///
ytitle("") ///
xtitle("", size(vsmall)) ///
xdiscrete name(usd, replace) ///
title("International Reserves in USD") ///
note("Data source: Laser-Mihailov-Weidner-2024.", ///
size(vsmall))
graph export usd.png, as(png) width(4000) replace
summ year
local x1 = `r(min)'
local x2 = `r(max)'
heatplot EUR i.cn year if EUR>0 , ///
yscale(noline) ///
ylabel(, nogrid labsize(*0.4)) ///
xlabel(`x1'(5)`x2', labsize(*0.5) angle(vertical) ///
nogrid) ///
color(viridis, reverse) ///
cuts(0(10)100) ///
ramp(right space(14) label(0(10)100) format(%4.0f)) ///
p(lcolor(black%10) lwidth(*0.1)) ///
ytitle("") ///
xtitle("", size(vsmall)) ///
xdiscrete name(eur, replace) ///
title("International Reserves in EUR") ///
note("Data source: Laser-Mihailov-Weidner-2024.", ///
size(vsmall))
graph export eur.png, as(png) width(4000) replace
xtset cn year
by cn: egen mean_EUR = mean(EUR)
summ year
local x1 = `r(min)'
local x2 = `r(max)'
heatplot EUR i.cn year if mean_EUR>50 , ///
yscale(noline) ///
ylabel(, nogrid labsize(*0.75)) ///
xlabel(`x1'(5)`x2', labsize(*0.5) angle(vertical) ///
nogrid) ///
color(plasma) ///
cuts(0(10)100) ///
ramp(right space(14) label(0(10)100) format(%4.0f)) ///
p(lcolor(black%10) lwidth(*0.1)) ///
ytitle("") ///
xtitle("", size(vsmall)) ///
xdiscrete name(eur, replace) ///
title("International Reserves in EUR for large holders") ///
note("Data source: Laser-Mihailov-Weidner-2024.", ///
size(vsmall))
graph export eurlarge.png, as(png) width(4000) replace
summ year
local x1 = `r(min)'
local x2 = `r(max)'
heatplot JPY i.cn year if JPY>0 , ///
yscale(noline) ///
ylabel(, nogrid labsize(*0.5)) ///
xlabel(`x1'(5)`x2', labsize(*0.5) angle(vertical) ///
nogrid) ///
color(viridis, reverse) ///
cuts(0(5)60) ///
ramp(right space(14) label(0(5)60) format(%4.0f)) ///
p(lcolor(black%10) lwidth(*0.1)) ///
ytitle("") ///
xtitle("", size(vsmall)) ///
xdiscrete name(jpy, replace) ///
title("International Reserves in JPY") ///
note("Data source: Laser-Mihailov-Weidner-2024.", ///
size(vsmall))
graph export jpy.png, as(png) width(4000) replace
summ year
local x1 = `r(min)'
local x2 = `r(max)'
heatplot CNY i.cn year if CNY>0 , ///
yscale(noline) ///
ylabel(, nogrid labsize(*0.5)) ///
xlabel(`x1'(5)`x2', labsize(*0.5) angle(vertical) ///
nogrid) ///
color(viridis, reverse) ///
cuts(0(5)30) ///
ramp(right space(14) label(0(5)30) format(%4.0f)) ///
p(lcolor(black%10) lwidth(*0.1)) ///
ytitle("") ///
xtitle("", size(vsmall)) ///
xdiscrete name(cny, replace) ///
title("International Reserves in CNY") ///
note("Data source: Laser-Mihailov-Weidner-2024.", ///
size(vsmall))
graph export cny.png, as(png) width(4000) replace