library(tidyverse)
## ── Attaching packages ─────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.0     ✔ purrr   0.2.5
## ✔ tibble  1.4.2     ✔ dplyr   0.7.6
## ✔ tidyr   0.8.2     ✔ stringr 1.3.1
## ✔ readr   1.3.1     ✔ forcats 0.3.0
## ── Conflicts ────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

I denne labben skal vi se nærmere på forholdet mellom renter og valutakurs. Vi skal spesielt undersøke om vi kan bruke udekket renteparitet til å gi en prognose om framtidig bevegelse i valutakursen.

Vi laster ned kursdata direkte fra Norges Bank:

valuta = read_csv("https://static.norges-bank.no/globalassets/marketdata/stat/valutakurser/sdv/valuta_mnd.csv?v=02/18/2019160250&ft=.csv")
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   `1 CAD` = col_double(),
##   `100 CHF` = col_double(),
##   `100 DKK` = col_double(),
##   `1 GBP` = col_double(),
##   `100 JPY` = col_double(),
##   `100 SEK` = col_double(),
##   `1 USD` = col_double()
## )
## See spec(...) for full column specifications.

Vi må igjen bruke zoo, som i lab 6, til å formattere dato-variablen som er i måned-år formatt.

library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
valuta = valuta[121:709, ]
yearMonths = as.yearmon(valuta$Date, format="%b-%y")
valuta$Date = as.Date(yearMonths)

Vi skal fokusere på dollar-krone-kursen:

dollarkurs = valuta[c("Date", "1 USD")]
colnames(dollarkurs) = c("dato", "USD")

plot(x=dollarkurs$dato, y=dollarkurs$USD, type="l")

renter

Vi kan igjen laste inn rente-data direkte fra Norges Bank:

renter = read_csv("https://www.norges-bank.no/globalassets/marketdata/stat/en/renter/v2/renter_mnd.csv", na=c("", "NA", "ND"))
## Parsed with column specification:
## cols(
##   DATES = col_character(),
##   FOLIO.NOM = col_double(),
##   RESERVE.NOM = col_double(),
##   DLAAN.NOM = col_double(),
##   STATSVKL.3M.EFF = col_double(),
##   STATSVKL.6M.EFF = col_double(),
##   STATSVKL.9M.EFF = col_double(),
##   STATSVKL.12M.EFF = col_double(),
##   STATSOBL.3Y.EFF = col_double(),
##   STATSOBL.5Y.EFF = col_double(),
##   STATSOBL.10Y.EFF = col_double(),
##   NOWA.RATE = col_double(),
##   NOWA.VOLUME = col_double()
## )
yearMonths = as.yearmon(renter$DATES, format="%b-%y")
renter$DATES = as.Date(yearMonths)
renter = select(renter, -NOWA.VOLUME)

colnames(renter)[1] = "dato"

Vi bruker join til å sette sammen rentedata og kursdata.

rp_data =  inner_join(renter, dollarkurs, by="dato")

Vi begrenser variablene til dollarkursen, USD, og to renter:

rp_data = rp_data[c("dato", "STATSVKL.12M.EFF", "STATSVKL.3M.EFF", "USD")]
plot(x=rp_data$USD, y=rp_data$STATSVKL.12M.EFF)

Nå trenger vi også rente-data fra USA. Vi bruker data fra FRED om rente på 3-måneders statsveksler og 12-måneders statsveksler.

renteUSA12 = read_csv("https://fred.stlouisfed.org/graph/fredgraph.csv?bgcolor=%23e1e9f0&chart_type=line&drp=0&fo=open%20sans&graph_bgcolor=%23ffffff&height=450&mode=fred&recession_bars=on&txtcolor=%23444444&ts=12&tts=12&width=1168&nt=0&thu=0&trc=0&show_legend=yes&show_axis_titles=yes&show_tooltip=yes&id=TB1YR&scale=left&cosd=1959-07-01&coed=2019-01-01&line_color=%234572a7&link_values=false&line_style=solid&mark_type=none&mw=3&lw=2&ost=-99999&oet=99999&mma=0&fml=a&fq=Monthly&fam=avg&fgst=lin&fgsnd=2009-06-01&line_index=1&transformation=lin&vintage_date=2019-02-19&revision_date=2019-02-19&nd=1959-07-01")
## Parsed with column specification:
## cols(
##   DATE = col_date(format = ""),
##   TB1YR = col_character()
## )
renteUSA3 = read_csv("https://fred.stlouisfed.org/graph/fredgraph.csv?bgcolor=%23e1e9f0&chart_type=line&drp=0&fo=open%20sans&graph_bgcolor=%23ffffff&height=450&mode=fred&recession_bars=on&txtcolor=%23444444&ts=12&tts=12&width=1168&nt=0&thu=0&trc=0&show_legend=yes&show_axis_titles=yes&show_tooltip=yes&id=TB3MS&scale=left&cosd=1934-01-01&coed=2019-01-01&line_color=%234572a7&link_values=false&line_style=solid&mark_type=none&mw=3&lw=2&ost=-99999&oet=99999&mma=0&fml=a&fq=Monthly&fam=avg&fgst=lin&fgsnd=2009-06-01&line_index=1&transformation=lin&vintage_date=2019-02-22&revision_date=2019-02-22&nd=1934-01-01")
## Parsed with column specification:
## cols(
##   DATE = col_date(format = ""),
##   TB3MS = col_double()
## )

Vi setter disse seriene sammen i en tibble.

renteUSA12["TB1YR"] = as.numeric(renteUSA12$TB1YR)
## Warning: NAs introduced by coercion
colnames(renteUSA12)[1] = "dato"

colnames(renteUSA3)[1] = "dato"

renteUSA = full_join(renteUSA12, renteUSA3, by="dato")

Nå setter vi rente-data fra USA sammen med våre andre dataserier:

rp_data = inner_join(rp_data, renteUSA, by="dato")
#rp_data = filter(rp_data, !is.na(STATSVKL.12M.EFF))
#rp_data = filter(rp_data, !is.na(TB1YR))

Vi gir kolonnene våre nye navn.

colnames(rp_data)=c("dato", "norge_12m", "norge_3m", "USD", "usa_12m", "usa_3m")

Udekket renteparitet handler om avvik mellom renter i ulike land og valutakurs. La oss først undersøke om vi kan se noe korrelasjon mellom renteavvik og dollarkursen.

rp_data["rente_avvik12"] = rp_data["norge_12m"]-rp_data["usa_12m"]

rp_data["rente_avvik3"] = rp_data["norge_3m"] - rp_data["usa_3m"]
ggplot(rp_data, aes(x=rente_avvik12, y=USD))+
  geom_point() +
  geom_smooth(method="lm")
## Warning: Removed 269 rows containing non-finite values (stat_smooth).
## Warning: Removed 269 rows containing missing values (geom_point).

ggplot(rp_data, aes(x=rente_avvik3, y=USD))+
  geom_point() +
  geom_smooth(method="lm")
## Warning: Removed 204 rows containing non-finite values (stat_smooth).
## Warning: Removed 204 rows containing missing values (geom_point).

La oss også se nærmere på forholdet mellom korte rentene i Norge og USA

renter_lang12 = gather(rp_data[c("dato", "norge_3m","usa_3m")],
                     key="rente", value="verdi", -dato)
ggplot(renter_lang12, aes(x=dato, y=verdi, color=rente)) + 
  geom_line()
## Warning: Removed 204 rows containing missing values (geom_path).

Vi kan skrive udekket renteparitet som

\(1+i = \frac{(1+i^*)*E^e_1}{E_0}\)

Hvis vi snur det rundt, så har vi skapt en markeds-basert prognosemodell for valutakursen en periode fram i tid. La oss teste hvor bra vår prognosemodell er.

\(E^e_1 = E_0*\frac{(1+i)}{(1+i^*)}\)

 prognose = rp_data %>% mutate(E0 = USD,
                    i=norge_3m/100,
                    i_stjerne =usa_3m/100,
                    E_prognose = E0*(1+i)/(1+i_stjerne)
                      )
prognose = filter(prognose, !is.na(E_prognose))
prognose_lang = gather(prognose[c("dato", "USD","E_prognose")],
                     key="kurs", value="verdi", -dato)

ggplot(prognose_lang, aes(x=dato, y=verdi, color=kurs)) +
  geom_line()

 prognose = rp_data %>% mutate(E0 = USD,
                    i=norge_12m/100,
                    i_stjerne = usa_12m/100,
                    E_prognose = E0*(1+i)/(1+i_stjerne)
                      )
prognose = filter(prognose, !is.na(E_prognose))

prognose_lang = gather(prognose[c("dato", "USD","E_prognose")],
                     key="kurs", value="verdi", -dato)

ggplot(prognose_lang, aes(x=dato, y=verdi, color=kurs)) +
  geom_line()