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")
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()