---
title: "readrba"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{readrba}
%\VignetteEncoding{UTF-8}
%\VignetteEngine{knitr::rmarkdown}
editor_options:
chunk_output_type: console
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.width = 5.6,
fig.height = 4,
fig.align = "center",
fig.retina = 2,
out.width = "100%",
out.extra = 'style="border:0px;"'
)
```
The Reserve Bank of Australia publishes lots of useful [statistical tables on its website](https://rba.gov.au/statistics/tables/). The `{readrba}` package helps you:
1. Download RBA statistical tables; and
2. Import the data into R as a tidy tibble.
You can import the data using either the table number or the series ID.
```{r setup, results=FALSE, message=FALSE, warning=FALSE}
library(readrba)
library(tidyr)
library(dplyr)
library(ggplot2)
library(lubridate)
theme_set(theme_minimal())
```
### Example: Individual series - 10-year bond yield
Let's start off by visualising the yield on a 10 year Australian Government bond over time.
I want to find the series ID for the 10 year Australian Government bond yield. The function `browse_rba_series()` will help me find it. If you use the function with no argument, it will return a tibble listing every data series published by the RBA (and readable by {readrba}). I'll specify a search string:
```{r 10yearnorun, eval=FALSE}
browse_rba_series("Australian government 10 year")
```
```{r 10year, echo=FALSE}
browse_rba_series("Australian government 10 year") %>%
knitr::kable()
```
OK, so we have two unique series for 10 year bond yield - one is daily data, the other monthly. These two series are split across four tables - a 'current' and 'historical' table for each of the daily and monthly series.
I'll get the monthly data, which we can see from the table above has the series ID `FCMYGBAG10`.
If you prefer, you can find the series ID by looking at the relevant spreadsheet from the RBA's website.
Now we'll use that series ID to download the data:
```{r bondyield, eval = F}
bond_yield <- read_rba(series_id = "FCMYGBAG10")
```
```{r, include = F, eval = F}
bond_yield <- read_rba(series_id = "FCMYGBAG10")
save(bond_yield, file = file.path("vignettes", "FCMYGBAG10.rda"))
```
```{r, include = F}
load("FCMYGBAG10.rda")
```
A quick aside: the code above gives identical results to using `read_rba_seriesid("FCMYGBAG10")`. The `read_rba_seriesid("SOMETHING")` function is a wrapper around `read_rba(series_id = "SOMETHING")`.
OK, now we have the bond yield data in tibble form, let's see what it looks like:
```{r glimpsebondyield}
glimpse(bond_yield)
```
The data you import using `read_rba()` is always in this standard tidy format. The values are in the `value` column.
Let's make a graph of the 10 year bond yield over time:
```{r vizbondyield}
bond_yield %>%
ggplot(aes(x = date, y = value)) +
geom_line()
```
That's a bit normcore-basic ggplot, but not bad. With a few lines of code, we've got an up-to-date graph of the 10 year bond yield.
### Example: Multiple series from a table - 2, 3, 5 and 10 year bond yields
Now we'll have a look at another example, this time using multiple data series from the one table. I want to make a graph of Australian Government bond yields at different maturities, over time. This time I'll confine myself to the recent data, at daily frequency.
```{r yieldbrowse, eval=FALSE}
browse_rba_tables("government bond")
```
```{r yieldbrowse2, echo=FALSE}
browse_rba_tables("government bond") %>%
knitr::kable()
```
The daily data is in table F2. If you prefer, you can look up the table on the [RBA website](https://www.rba.gov.au/statistics/tables/) and find the table number that way.
Now we know the table number that contains the data we want, let's load it into r.
```{r variousyields, eval = F}
f2 <- read_rba("f2")
```
```{r, include = F}
load("f2.rda")
```
This table looks just like the single series table we downloaded earlier: `r glimpse(f2)`. Unlike the single series table - which only contained the ten year bond yield - we now have a tidy tibble containing a number of data series. Here's what we've got:
```{r uniquef2}
unique(f2$series)
```
I'm not interested in NSW bonds, nor indexed bonds, so we'll need some brief {dplyr}-ing of the data before we can get down to graphing.
```{r filterf2}
filtered_f2 <- f2 %>%
filter(grepl("Australian Government", series) &
!grepl("Indexed", series))
```
We've dropped the series we're not interested in, going from `r nrow(f2)` rows to `r nrow(filtered_f2)` rows. Now let's graph:
```{r vizf2}
filtered_f2 %>%
ggplot(aes(x = date, y = value, col = series)) +
geom_line()
```
Nice! Again, normcore aesthetics aside, we've got a decent plot with a few lines of code. Using the same data, we can have a look at the spread between the yield on 10 year and 2 year bonds, as a rough measure of the slope of (a portion of) the yield curve.
```{r}
filtered_f2 %>%
select(date, series, value) %>%
spread(key = series, value = value) %>%
mutate(spread_10_2 = `Australian Government 10 year bond` - `Australian Government 2 year bond`) %>%
ggplot(aes(x = date, y = spread_10_2)) +
geom_line()
```
### Example: RBA forecasts
The package also includes all public forecasts of key economic variables made
by the Reserve Bank since 1990. The `rba_forecasts()` function returns
these forecasts in a tidy tibble -- including the latest forecasts, scraped
from the Statement on Monetary Policy.
```{r, eval = F}
forecasts <- rba_forecasts()
```
```{r, include = F}
forecasts <- rba_forecasts(refresh = FALSE)
```
Here's what they look like:
```{r, echo = F}
dplyr::glimpse(forecasts)
```
Let's visualise all the Bank's unemployment rate forecasts since 1990:
```{r viz-unemp-forecasts}
forecasts %>%
filter(series == "unemp_rate") %>%
ggplot(aes(x = date,
y = value,
group = forecast_date,
colour = forecast_date)) +
geom_line()
```
### Example: change in RBA forecasts
Now let's make a chart that compares the RBA's latest forecasts to its previous forecasts.
```{r change-in-forecasts, fig.height = 6}
# We've already created the `forecasts` object, like this:
# forecasts <- rba_forecasts()
latest_two <- forecasts %>%
filter(forecast_date %in% c(max(forecast_date),
max(forecast_date) - months(3)))
latest_two %>%
group_by(series_desc) %>%
# Only include series for which we have forecasts in both of the latest SMPs
filter(length(unique(forecast_date)) >= 2) %>%
ungroup() %>%
mutate(forecast_date = format(forecast_date, "%b %Y")) %>%
ggplot(aes(x = date, y = value, col = forecast_date)) +
geom_line() +
guides(colour = guide_legend(title = "Forecast issued: ")) +
facet_wrap(~series_desc, scales = "free_y",
labeller = label_wrap_gen(17)) +
theme_minimal(base_size = 12) +
theme(legend.position = "top",
legend.direction = "horizontal",
legend.title = element_text(),
axis.title = element_blank(),
axis.text = element_text(size = 6),
plot.margin = margin(),
strip.text = element_text(size = 8)) +
labs(subtitle = paste0("RBA's forecasts issued in ",
unique(latest_two$forecast_date) %>% format("%B %Y") %>% paste(collapse = " and ")),
caption = "Source: RBA Statement on Monetary Policy")
```