library(tidyverse)
library(stringr)
library(lubridate)
library(kableExtra)
library(knitr)
We use specialist knowledge of financial markets to read and manually label all 102 FOMC statements from 2007 to May 2019. Specifically, five attributes were reviewed and manually collected into a CSV file. This file was then merged with the previous FOMC web scraped data to build a merged classification enriched dataset. In this section, we demonstrate the data wrangling steps for to merge the 2 data sets. Then we define and illustrate with examples from various statements each of the possible outcomes for each of the 5 attributes. Providing transparency to the classification method is essential to understand the challenges even to human judgment of understanding “FedSpeak”.
First we load the FOMC statement data set into memory as a dataframe.
d4<-readRDS(file = "fomc_data.rds")
dim(d4)
## [1] 102 5
str(d4)
## 'data.frame': 102 obs. of 5 variables:
## $ year : chr "2007" "2007" "2007" "2007" ...
## $ statement.dates : chr "20070131" "20070321" "20070509" "20070628" ...
## $ links : chr "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070131a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070321a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070509a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070618a.htm" ...
## $ statement.content: chr "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ ...
## $ statement.length : int 181 167 168 179 207 130 260 304 281 255 ...
We explicitly override the Date column to be imported as string because we will join these two dataframes on this data. In other words, we use a date column of the format “yyyymmdd” in string format as the common key for joining disparate datasets.
classificationFile = "Classification_FOMC_Statements.csv"
cls = read_csv(classificationFile , col_types = cols( Date = col_character() ) )
cls %>% rename( Economic.Growth = "Economic Growth", Employment.Growth = "Employment Growth", Medium.Term.Rate = "Medium Term Rate", Policy.Rate = "Policy Rate") -> cls
str(cls)
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 102 obs. of 8 variables:
## $ Index : num 1 2 3 4 5 6 7 8 9 10 ...
## $ Date2 : chr "1/31/07" "3/21/07" "5/9/07" "6/28/07" ...
## $ Date : chr "20070131" "20070321" "20070509" "20070628" ...
## $ Economic.Growth : chr "Up" "Flat" "Down" "Up" ...
## $ Employment.Growth: chr "Flat" "Flat" "Flat" "Flat" ...
## $ Inflation : chr "Down" "Up" "Up" "Down" ...
## $ Medium.Term.Rate : chr "Hawk" "Hawk" "Hawk" "Hawk" ...
## $ Policy.Rate : chr "Flat" "Flat" "Flat" "Flat" ...
## - attr(*, "spec")=
## .. cols(
## .. Index = col_double(),
## .. Date2 = col_character(),
## .. Date = col_character(),
## .. `Economic Growth` = col_character(),
## .. `Employment Growth` = col_character(),
## .. Inflation = col_character(),
## .. `Medium Term Rate` = col_character(),
## .. `Policy Rate` = col_character()
## .. )
d4 %>% inner_join( cls , by = c("statement.dates" = "Date")) %>%
mutate( date_mdy = mdy(Date2)) %>%
select(Index,
year ,
statement.dates,
links,
statement.content,
statement.length ,
date_mdy,
Economic.Growth,
Employment.Growth,
Inflation,
Medium.Term.Rate,
Policy.Rate ) -> mgData
str(mgData)
## 'data.frame': 102 obs. of 12 variables:
## $ Index : num 1 2 3 4 5 6 7 8 9 10 ...
## $ year : chr "2007" "2007" "2007" "2007" ...
## $ statement.dates : chr "20070131" "20070321" "20070509" "20070628" ...
## $ links : chr "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070131a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070321a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070509a.htm" "https://www.federalreserve.gov/newsevents/pressreleases/monetary20070618a.htm" ...
## $ statement.content: chr "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ "The Federal Open Market Committee decided today to keep its target for the federal funds rate at 5-1/4 percent."| __truncated__ ...
## $ statement.length : int 181 167 168 179 207 130 260 304 281 255 ...
## $ date_mdy : Date, format: "2007-01-31" "2007-03-21" ...
## $ Economic.Growth : chr "Up" "Flat" "Down" "Up" ...
## $ Employment.Growth: chr "Flat" "Flat" "Flat" "Flat" ...
## $ Inflation : chr "Down" "Up" "Up" "Down" ...
## $ Medium.Term.Rate : chr "Hawk" "Hawk" "Hawk" "Hawk" ...
## $ Policy.Rate : chr "Flat" "Flat" "Flat" "Flat" ...
Let us view the sample data from the statements
mgData %>% select( Index, date_mdy, Economic.Growth, Employment.Growth, Inflation, Medium.Term.Rate, Policy.Rate) %>% kable() %>% kable_styling(bootstrap_options = c("hover", "striped")) %>%
scroll_box(width = "90%", height = "300px")
| Index | date_mdy | Economic.Growth | Employment.Growth | Inflation | Medium.Term.Rate | Policy.Rate |
|---|---|---|---|---|---|---|
| 1 | 2007-01-31 | Up | Flat | Down | Hawk | Flat |
| 2 | 2007-03-21 | Flat | Flat | Up | Hawk | Flat |
| 3 | 2007-05-09 | Down | Flat | Up | Hawk | Flat |
| 4 | 2007-06-28 | Up | Flat | Down | Hawk | Flat |
| 5 | 2007-08-07 | Up | Flat | Flat | Hawk | Flat |
| 6 | 2007-08-17 | Down | Flat | Flat | Dove | Flat |
| 7 | 2007-09-18 | Flat | Flat | Down | Dove | Lower |
| 8 | 2007-10-31 | Up | Flat | Down | Dove | Lower |
| 9 | 2007-12-11 | Down | Flat | Down | Dove | Lower |
| 10 | 2008-01-22 | Down | Down | Flat | Dove | Lower |
| 11 | 2008-01-30 | Down | Down | Flat | Dove | Lower |
| 12 | 2008-03-18 | Down | Down | Up | Dove | Lower |
| 13 | 2008-04-30 | Down | Down | Up | Dove | Lower |
| 14 | 2008-06-25 | Up | Down | Up | Hawk | Flat |
| 15 | 2008-08-05 | Up | Down | Up | Hawk | Flat |
| 16 | 2008-09-16 | Down | Down | Up | Dove | Flat |
| 17 | 2008-10-08 | Down | Flat | Down | Dove | Lower |
| 18 | 2008-10-29 | Down | Flat | Down | Dove | Lower |
| 19 | 2008-12-16 | Down | Down | Down | Dove | Lower |
| 20 | 2009-01-28 | Down | Down | Down | Dove | Flat |
| 21 | 2009-03-18 | Down | Down | Down | Dove | Flat |
| 22 | 2009-04-29 | Down | Down | Flat | Dove | Flat |
| 23 | 2009-06-24 | Down | Down | Down | Dove | Flat |
| 24 | 2009-08-12 | Flat | Down | Down | Dove | Flat |
| 25 | 2009-09-23 | Up | Down | Down | Dove | Flat |
| 26 | 2009-11-04 | Up | Down | Down | Dove | Flat |
| 27 | 2009-12-16 | Up | Flat | Down | Dove | Flat |
| 28 | 2010-01-27 | Flat | Flat | Down | Dove | Flat |
| 29 | 2010-03-16 | Flat | Flat | Down | Dove | Flat |
| 30 | 2010-04-28 | Flat | Flat | Flat | Dove | Flat |
| 31 | 2010-06-23 | Flat | Up | Down | Dove | Flat |
| 32 | 2010-08-10 | Down | Down | Down | Dove | Flat |
| 33 | 2010-09-21 | Down | Down | Flat | Dove | Flat |
| 34 | 2010-11-03 | Flat | Flat | Down | Dove | Flat |
| 35 | 2010-12-14 | Flat | Down | Down | Dove | Flat |
| 36 | 2011-01-26 | Flat | Down | Down | Dove | Flat |
| 37 | 2011-03-15 | Up | Flat | Up | Dove | Flat |
| 38 | 2011-04-27 | Up | Flat | Up | Dove | Flat |
| 39 | 2011-06-22 | Flat | Down | Up | Dove | Flat |
| 40 | 2011-08-09 | Flat | Down | Down | Dove | Flat |
| 41 | 2011-09-21 | Flat | Down | Down | Dove | Flat |
| 42 | 2011-11-02 | Up | Down | Flat | Dove | Flat |
| 43 | 2011-12-13 | Up | Flat | Down | Dove | Flat |
| 44 | 2012-01-25 | Up | Up | Flat | Dove | Flat |
| 45 | 2012-03-13 | Up | Up | Flat | Dove | Flat |
| 46 | 2012-04-25 | Up | Up | Up | Dove | Flat |
| 47 | 2012-06-20 | Up | Flat | Down | Dove | Flat |
| 48 | 2012-08-01 | Down | Flat | Down | Dove | Flat |
| 49 | 2012-09-13 | Up | Flat | Flat | Dove | Flat |
| 50 | 2012-10-24 | Up | Flat | Up | Dove | Flat |
| 51 | 2012-12-12 | Up | Up | Flat | Dove | Flat |
| 52 | 2013-01-30 | Flat | Up | Flat | Dove | Flat |
| 53 | 2013-03-20 | Up | Up | Flat | Dove | Flat |
| 54 | 2013-05-01 | Up | Up | Flat | Dove | Flat |
| 55 | 2013-06-19 | Up | Up | Down | Dove | Flat |
| 56 | 2013-07-31 | Up | Up | Flat | Dove | Flat |
| 57 | 2013-09-18 | Up | Up | Flat | Dove | Flat |
| 58 | 2013-10-30 | Up | Up | Flat | Dove | Flat |
| 59 | 2013-12-18 | Up | Up | Flat | Dove | Flat |
| 60 | 2014-01-29 | Up | Up | Flat | Dove | Flat |
| 61 | 2014-03-19 | Down | Up | Flat | Dove | Flat |
| 62 | 2014-04-30 | Up | Up | Flat | Dove | Flat |
| 63 | 2014-06-18 | Up | Up | Flat | Dove | Flat |
| 64 | 2014-07-30 | Up | Up | Up | Dove | Flat |
| 65 | 2014-09-17 | Up | Up | Flat | Dove | Flat |
| 66 | 2014-10-29 | Up | Up | Down | Dove | Flat |
| 67 | 2014-12-17 | Up | Up | Down | Dove | Flat |
| 68 | 2015-01-28 | Up | Up | Down | Dove | Flat |
| 69 | 2015-03-18 | Flat | Up | Down | Dove | Flat |
| 70 | 2015-04-29 | Down | Flat | Flat | Dove | Flat |
| 71 | 2015-06-17 | Up | Up | Flat | Dove | Flat |
| 72 | 2015-07-29 | Up | Up | Flat | Dove | Flat |
| 73 | 2015-09-17 | Up | Up | Down | Dove | Flat |
| 74 | 2015-10-28 | Up | Flat | Down | Dove | Flat |
| 75 | 2015-12-16 | Up | Up | Flat | Dove | Raise |
| 76 | 2016-01-27 | Down | Up | Down | Dove | Flat |
| 77 | 2016-03-16 | Up | Up | Up | Dove | Flat |
| 78 | 2016-04-27 | Down | Up | Flat | Dove | Flat |
| 79 | 2016-06-15 | Up | Flat | Down | Dove | Flat |
| 80 | 2016-07-27 | Up | Up | Flat | Dove | Flat |
| 81 | 2016-09-21 | Up | Up | Flat | Dove | Flat |
| 82 | 2016-11-02 | Flat | Up | Flat | Dove | Flat |
| 83 | 2016-12-14 | Up | Up | Up | Dove | Raise |
| 84 | 2017-02-01 | Up | Up | Up | Dove | Flat |
| 85 | 2017-03-15 | Up | Up | Flat | Hawk | Raise |
| 86 | 2017-05-03 | Down | Up | Down | Hawk | Flat |
| 87 | 2017-06-14 | Up | Up | Down | Hawk | Raise |
| 88 | 2017-07-26 | Up | Up | Down | Hawk | Flat |
| 89 | 2017-09-20 | Up | Up | Down | Hawk | Flat |
| 90 | 2017-11-01 | Up | Up | Down | Hawk | Flat |
| 91 | 2017-12-13 | Up | Up | Down | Hawk | Raise |
| 92 | 2018-01-31 | Up | Up | Flat | Hawk | Flat |
| 93 | 2018-03-21 | Up | Up | Up | Hawk | Raise |
| 94 | 2018-05-02 | Up | Up | Flat | Hawk | Flat |
| 95 | 2018-06-13 | Up | Up | Flat | Hawk | Raise |
| 96 | 2018-08-01 | Up | Up | Flat | Hawk | Flat |
| 97 | 2018-09-26 | Up | Up | Flat | Hawk | Raise |
| 98 | 2018-11-08 | Up | Up | Flat | Hawk | Flat |
| 99 | 2018-12-19 | Up | Up | Flat | Hawk | Raise |
| 100 | 2019-01-30 | Up | Up | Down | Dove | Flat |
| 101 | 2019-03-20 | Flat | Flat | Down | Dove | Flat |
| 102 | 2019-05-01 | Up | Up | Flat | Dove | Flat |
We export the merged dataframe as a single RDS object for research use.
rds_filename = "fomc_merged_data_v2.rds"
saveRDS(mgData, file = rds_filename)
The attribute Economic.Growth is assigned one of 3 classification: Up, Flat or Down. It refers to the near term trend in economic growth since the last FOMC meeting or within the last quarter (whichever is mentioned). Most statements give an explicit assessment of economic growth in the first 3 sentences. An example of a UP classification is the July 29, 2015 statement (below coloring is mine):
Information received since the Federal Open Market Committee met in June indicates that \(\color{red}{\text{economic activity has been expanding moderately in recent months}}\).
An example of a FLAT classification is the March 18, 2015 statement:
Information received since … January suggests that \(\color{red}{\text{economic growth has moderated somewhat.}}\)
An example of a DOWN classification is in the May 3, 2017 statement:
Information received since … March indicates that … \(\color{red}{\text{growth in economic activity slowed.}}\).
Rarely does the FOMC statement exclude an assessment of near-term economic growth trends in the US.
The attribute Employment.Growth refers to the near-term trend of the labor market in the US. We use the same classification values as for Economic.Growth. If the labor market indicators are improving, we mark the indicator as UP. This requires a decrease in the unemployment rate (if stated) and/or an increase in jobs creation. These two key indicators broadly define the health of the labor market.
An example of an UP classification is in the Feb 1, 2017 statement:
the labor market has continued to strengthen … Job gains remained solid and the unemployment rate stayed near its recent low.
An example of a FLAT classification is the Dec 13, 2011 statement where the indicators are mixed:
While indicators point to some improvement in overall labor market conditions, >the unemployment rate remains elevated.
An example of a DOWN classification is the April 29, 2009 statement where the labor market is discussed indirectly:
Household spending has shown signs of stabilizing but remains constrained by >\(\color{red}{\text{ongoing job losses}}\), lower housing wealth, and tight >credit. Weak sales prospects and difficulties in obtaining credit have led >businesses to cut back on inventories, fixed investment, and \(\color{red}{\text{staffing.}}\)
Sometimes the FOMC statement does not mention labor market conditions. In this case, we assume information is irrelevant or not a concern and assign a FLAT classification.
When measuring inflation, we refer to the realized price fluctuation of core PCE (where available) in the period since the last FOMC meeting. Sometimes, this is not explicitly stated. Then, we see the overall price movements (including food and energy) since the last meeting. Where this is unstated, we rely on market driven indicators of medium term inflation risk as described by the statement. We don’t rely on shifts in the long term inflation expectations. Of the various metrics from the FOMC statements, this indicator is the most challenging to classify due to the multiple dimensions of inflation.
An example of a UP classification comes from the April 27, 2011 meeting:
\(\color{red}{\text{Commodity prices have risen}}\) significantly since last summer, and concerns about global supplies of crude oil have contributed to a further \(\color{red}{\text{increase in oil prices}}\) since the Committee met in March. \(\color{red}{\text{Inflation has picked up}}\) in recent months, but longer-term inflation expectations have remained stable and measures of underlying inflation are still subdued.
An example of a FLAT classification comes from the November 8, 2018 meeting. Note that the FOMC views a 2 percent inflation rate as the natural rate of inflation, thus inflation near 2 percent is perceived as flat. FLAT refers to either an absence of information or a rate near the natural rate.
On a 12-month basis, \(\color{red}{\text{both overall inflation and inflation for items other than food and energy remain near 2 percent}}\). Indicators of longer-term inflation expectations are little changed, on balance.
An example of a DOWN classification comes from the Jan 28, 2009 statement during the depths of the final crisis.
In light of the \(\color{red}{\text{declines in the prices}}\) of energy and other commodities in recent months and the prospects for considerable economic slack, the Committee expects that \(\color{red}{\text{inflation pressures}}\) will remain subdued in coming quarters. Moreover, the Committee sees some risk that inflation could persist for a time below rates that best foster economic growth and price stability in the longer term.
The FOMC tries to provide guidance of where it believe the 1-2 year outlook for the target fed funds rate will be positioned based on current information. Medium Term Outlook attempts to measure this guidance:
An example of a HAWK classification comes from the March 15, 2017 statement:
The Committee expects that economic conditions will evolve in a manner that will warrant \(\color{red}{\text{gradual increases in the federal funds rate}}\); the federal funds rate is likely to remain, for some time, below levels that are expected to prevail in the longer run. However, the actual path of the federal funds rate will depend on the economic outlook as informed by incoming data.
An example of a DOVE classification comes from the Sept 17, 2014 statement:
the Committee today reaffirmed its view that a \(\color{red}{\text{highly accommodative stance of monetary policy remains appropriate}}\). In determining how long to maintain the current 0 to 1/4 percent target range for the federal funds rate, the Committee will assess progress–both realized and expected–toward its objectives of maximum employment and 2 percent inflation. This assessment will take into account a wide range of information, including measures of labor market conditions, indicators of inflation pressures and inflation expectations, and readings on financial developments. The Committee continues to anticipate, based on its assessment of these factors, that it likely will be appropriate to \(\color{red}{\text{maintain the current target range for the federal funds rate for a considerable time}}\) after the asset purchase program ends, especially if projected inflation continues to run below the Committee’s 2 percent longer-run goal, and provided that longer-term inflation expectations remain well anchored.
This last attribute is objective not subjective. It identifies whether the FOMC decides to raise, keep unchanged or lower the federal funds target rate. On that basis, the classification is assigned.