library(tidyverse)
library(stringr)
library(lubridate)
library(kableExtra)
library(knitr)

Human Classification

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”.

Wrangling the Data into a Merged Dataset

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()
##   .. )

Merging FOMC data and Classification Data

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

Exporting the Merged Data Frame

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)

Economic Growth

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.

Employment Growth

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.

Inflation

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.

Medium Term Outlook

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.

Policy Rate

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.