Small Open Economy & the Exchange Rate
The small open economy
With perfect capital mobility, a small country takes the world interest rate as given: \(r = r^*\).
- Net exports = net capital outflow: \(NX = S - I = NFI\). Saving not invested at home flows abroad.
- \(r^*\) fixes investment \(I(r^*)\), so it fixes \(S - I\) — and therefore the trade balance.
- The real exchange rate \(\varepsilon\) then adjusts so net exports hit that number: \(NX(\varepsilon) = S - I\).
- FX view: supply of domestic currency \(= S-I\) (vertical); demand \(= NX(\varepsilon)\) (downward).
Shocks
- Deficit (G↑ / T↓): saving falls → \(S-I\) falls → \(\varepsilon\) appreciates, NX toward deficit.
- Investment demand↑ or \(r^*\)↓: \(I\) rises → \(S-I\) falls → \(\varepsilon\) appreciates.
- Tariff: doesn’t touch \(S\) or \(I\) → \(S-I\) fixed → shifts \(NX(\varepsilon)\), so \(\varepsilon\) appreciates but NX is unchanged.
#| standalone: true
#| viewerHeight: 560
library(shiny)
ui <- fluidPage(
tags$head(tags$style(HTML("body{font-family:'Inter',system-ui,sans-serif;}
.sb{background:#f0f4f8;border-radius:6px;padding:12px 14px;margin-top:10px;font-size:14px;line-height:1.8;} .sb b{color:#1f3b73;}"))),
sidebarLayout(
sidebarPanel(width=4,
sliderInput("G","Government purchases G:",min=800,max=2500,value=1500,step=50),
sliderInput("T","Taxes T:",min=800,max=2500,value=1500,step=50),
sliderInput("dI0","Investment-demand shift:",min=-400,max=400,value=0,step=50),
sliderInput("rstar","World rate r* (%):",min=1,max=10,value=5,step=1),
sliderInput("tar","Import tariff (shifts NX):",min=0,max=600,value=0,step=50),
uiOutput("sb")),
mainPanel(width=8, plotOutput("plot",height="470px"))))
server <- function(input,output,session){
Y<-6000; C0<-600; mpc<-0.6; b<-100; I0<-1600; A<-1500; m<-250
calc <- reactive({
S <- Y - (C0+mpc*(Y-input$T)) - input$G
I <- I0 + input$dI0 - b*input$rstar
NFI <- S - I
eps <- (A + input$tar - NFI)/m
list(S=S,I=I,NFI=NFI,eps=eps)
})
output$plot <- renderPlot({
v<-calc(); par(mfrow=c(1,2),mar=c(4.2,4.3,2.2,1))
# panel 1: loanable funds
rg<-seq(0,12,length.out=150); Ir<-I0+input$dI0-b*rg
plot(NA,xlim=c(0,2500),ylim=c(0,12),xlab="S, I",ylab="r (%)",las=1,bty="l",main="Loanable funds")
abline(v=v$S,col="#1f3b73",lwd=3) # vertical saving
lines(Ir,rg,col="#b5462a",lwd=3) # investment
abline(h=input$rstar,col="#1c6b4a",lwd=2,lty=2) # world rate
points(v$I,input$rstar,pch=19,col="#1c6b4a",cex=1.6)
text(2300,input$rstar+0.6,"r*",col="#1c6b4a")
# panel 2: exchange rate
eg<-seq(0,12,length.out=150); NXe<-A+input$tar-m*eg
plot(NA,xlim=c(-600,2000),ylim=c(0,12),xlab="Net exports NX",ylab=expression(epsilon),las=1,bty="l",main="Real exchange rate")
abline(v=v$NFI,col="#1f3b73",lwd=3) # S - I (vertical)
lines(NXe,eg,col="#b5462a",lwd=3) # NX(eps)
points(v$NFI,v$eps,pch=19,col="#1c6b4a",cex=1.6)
segments(-600,v$eps,v$NFI,v$eps,lty=3,col="#5a6472")
abline(v=0,col="#9aa4b2",lty=3)
})
output$sb <- renderUI({ v<-calc()
HTML(sprintf("<div class='sb'>National saving S = <b>%.0f</b><br>Investment I = <b>%.0f</b><br>Net capital outflow S-I = NX = <b>%.0f</b><br>Real exchange rate <b>eps = %.2f</b></div>",
v$S,v$I,v$NFI,v$eps)) })
}
shinyApp(ui,server)
What to notice
- Deficit (G above T): saving line slides left, NFI falls, \(\varepsilon\) rises (appreciates).
- Lower \(r^*\): investment rises, NFI falls, currency appreciates, NX falls.
- Tariff: only the right panel’s NX curve shifts — \(\varepsilon\) rises but the trade balance (NFI) is unchanged. Protectionism can’t fix a trade deficit.