library(tidyverse)
library(fredr)
library(ggplot2)
library(plotly)
Data using API
In this story, I’ll use FRED API Key to get and load the data
fredr_set_key("f7e805d1fb29e39764c10eb3feccac31")
# Get data for the last 25 years
end_date <- Sys.Date()
start_date <- end_date - 25 * 365
# Retrieve data from FRED API
cpi <- fredr(series_id = "CPIAUCNS",
observation_start = start_date,
observation_end = end_date)
fed_funds_rate <- fredr(series_id = "FEDFUNDS",
observation_start = start_date,
observation_end = end_date)
unemployment <- fredr(series_id = "UNRATE",
observation_start = start_date,
observation_end = end_date)
Data Visualization
- Let’s plot the data for the Consumer Price Index over time.
The consumer Price Index has been steadily growing.
ggplot(data = cpi, aes(x = date, y = value)) +
geom_line(color = "blue") +
labs(title = "Consumer Price Index (CPI) Trend",
x = "Year",
y = "CPI") +
theme_minimal()

- Let’s plot the data for the FED Funds Rate over time.
Currently, The Federal Rate has been one of the highest in the past
25 years.
ggplot(data = fed_funds_rate, aes(x = date, y = value)) +
geom_line(color = "blue") +
labs(title = "FED Funds Rate Trend",
x = "Year",
y = "FED Funds Rate (%)") +
theme_minimal()

- Let’s plot the data for the Unemployment Rate
Based on the plot, we observe that the unemployment has been kept
under 10% for the past 25 years until a spike due to COVID19.
ggplot(data = unemployment, aes(x = date, y = value)) +
geom_line(color = "blue") +
labs(title = "Unemployment Rate Trend",
x = "Year",
y = "Unemployment Rate (%)") +
theme_minimal()

Feds Dual manadate
The Feds has a dual mandate:
Keep unemployment low
Keep inflation low
The CPI trend indicates a general trend of inflation in the economy.
Let’s get the data for the inflation rate.
inflation <- fredr(series_id = "FPCPITOTLZGUSA",
observation_start = start_date,
observation_end = end_date)
Let’s plot the inflation rate, the FED Fund Rate, and the
unemployment rate on the same graph. We can use the library plotly to
make an interactive graph.
plot <- plot_ly()
# Inflation plot
plot <- add_lines(plot, x = ~inflation$date, y = ~inflation$value, name = 'Inflation', line = list(color = 'blue'))
# Unemployment Plot
plot <- add_lines(plot, x = ~unemployment$date, y = ~unemployment$value, name = 'Unemployment', line = list(color = 'red'))
# Federal Funds Rate Plot
plot <- add_lines(plot, x = ~fed_funds_rate$date, y = ~fed_funds_rate$value, name = 'Fed Funds Rate', line = list(color = 'grey'))
# Customize layout
plot <- layout(plot, title = "Feds Dual Mandate",
xaxis = list(title = "Date"),
yaxis = list(title = "Rate (%)"),
legend = list(x = 1, y = 1.1))
plot
- Rising Inflation and Increasing Federal Funds Rate:
Periods of rising inflation, such as after 2002 and 2015, prompted
the Federal Reserve to increase the Federal Funds Rate to curb price
increases.However, this led to higher unemployment.
- High Unemployment and Lowering Federal Funds Rate:
During times of high unemployment, like after 2008, the Federal
Reserve reduced the Federal Funds Rate to stimulate borrowing and
spending. Yet, this action have resulted in increased inflation,
reflecting the trade-off between employment and price stability.
Conclusion
The goal of the Feds was to keep the inflation at 2% and the
unemployment rate at 4.5%.
Let’s visualize the inflation and the unemployment rate to find if
the Fed rate has been successful.
# Filter unemployment data to get yearly data
monthly_unemployment <- unemployment %>%
filter(as.POSIXlt(date)$mon == 1)
# Create colors
inflation$colors <- ifelse(inflation$value <= 2 | monthly_unemployment[1:24, ]$value <= 4.5, "grey", "red")
# Create a scatter plot with inflation on the y-axis and unemployment on the x-axis
ggplot() +
geom_point(data = inflation, aes(x = monthly_unemployment[1:24, ]$value, y = inflation$value, color = colors), size = 3) +
geom_vline(xintercept = 4.5, color = "lightblue", linetype = "dashed", size = 1) +
geom_hline(yintercept = 2, color = "lightblue", linetype = "dashed", size = 1) +
scale_color_manual(values = c(grey = "grey", red = "red")) +
labs(title = "Inflation vs. Unemployment",
x = "Unemployment Rate",
y = "Inflation Rate") +
theme_minimal()

Based on the graph above:
The Federal Reserve has successfully maintained both inflation
and unemployment within their target range only twice in the past 25
years.
In some years, the Federal Reserve’s policies have effectively
controlled either the unemployment or the inflation rate, but not both
simultaneously.
There have been nine years in the past 25 where the Federal
Reserve has failed to meet either of its dual mandate targets.
These findings may lead to different interpretations. Some may argue
that the Federal Reserve has struggled and failed to fulfill its mandate
effectively and should focus on only one goal to improve its
effectiveness.
On the other hand, others may contend that the Federal Reserve’s task
is inherently challenging, and despite occasional shortcomings, it is
making concerted efforts to balance both objectives in a complex
economic environment.
Sources:
https://fred.stlouisfed.org/docs/api/fred/
https://www.chicagofed.org/research/dual-mandate/dual-mandate
https://upfina.com/how-the-federal-reserve-decides-policy/
…
LS0tDQp0aXRsZTogIkZFRCBEdWFsIE1hbmRhdGUiDQphdXRob3I6ICJLb3NzaSBBa3BsYWthIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGZyZWRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpgYGANCg0KIyMgRGF0YSB1c2luZyBBUEkNCkluIHRoaXMgc3RvcnksIEknbGwgdXNlIEZSRUQgQVBJIEtleSB0byBnZXQgYW5kIGxvYWQgdGhlIGRhdGENCg0KYGBge3J9DQpmcmVkcl9zZXRfa2V5KCJmN2U4MDVkMWZiMjllMzk3NjRjMTBlYjNmZWNjYWMzMSIpDQoNCiMgR2V0IGRhdGEgZm9yIHRoZSBsYXN0IDI1IHllYXJzDQplbmRfZGF0ZSA8LSBTeXMuRGF0ZSgpDQpzdGFydF9kYXRlIDwtIGVuZF9kYXRlIC0gMjUgKiAzNjUgIA0KDQojIFJldHJpZXZlIGRhdGEgZnJvbSBGUkVEIEFQSQ0KY3BpIDwtIGZyZWRyKHNlcmllc19pZCA9ICJDUElBVUNOUyIsIA0KICAgICAgICAgICAgICAgICAgb2JzZXJ2YXRpb25fc3RhcnQgPSBzdGFydF9kYXRlLCANCiAgICAgICAgICAgICAgICAgIG9ic2VydmF0aW9uX2VuZCA9IGVuZF9kYXRlKQ0KDQpmZWRfZnVuZHNfcmF0ZSA8LSBmcmVkcihzZXJpZXNfaWQgPSAiRkVERlVORFMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZhdGlvbl9zdGFydCA9IHN0YXJ0X2RhdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmF0aW9uX2VuZCA9IGVuZF9kYXRlKQ0KDQp1bmVtcGxveW1lbnQgPC0gZnJlZHIoc2VyaWVzX2lkID0gIlVOUkFURSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZhdGlvbl9zdGFydCA9IHN0YXJ0X2RhdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZhdGlvbl9lbmQgPSBlbmRfZGF0ZSkNCmBgYA0KDQoNCg0KIyMgRGF0YSBWaXN1YWxpemF0aW9uDQoNCi0gTGV0J3MgcGxvdCB0aGUgZGF0YSBmb3IgdGhlIENvbnN1bWVyIFByaWNlIEluZGV4IG92ZXIgdGltZS4NCg0KVGhlIGNvbnN1bWVyIFByaWNlIEluZGV4IGhhcyBiZWVuIHN0ZWFkaWx5IGdyb3dpbmcuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBjcGksIGFlcyh4ID0gZGF0ZSwgeSA9IHZhbHVlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmx1ZSIpICsNCiAgbGFicyh0aXRsZSA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSBUcmVuZCIsDQogICAgICAgeCA9ICJZZWFyIiwNCiAgICAgICB5ID0gIkNQSSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQotIExldCdzIHBsb3QgdGhlIGRhdGEgZm9yIHRoZSBGRUQgRnVuZHMgUmF0ZSBvdmVyIHRpbWUuDQoNCkN1cnJlbnRseSwgVGhlIEZlZGVyYWwgUmF0ZSBoYXMgYmVlbiBvbmUgb2YgdGhlIGhpZ2hlc3QgaW4gdGhlIHBhc3QgMjUgeWVhcnMuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBmZWRfZnVuZHNfcmF0ZSwgYWVzKHggPSBkYXRlLCB5ID0gdmFsdWUpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJibHVlIikgKw0KICBsYWJzKHRpdGxlID0gIkZFRCBGdW5kcyBSYXRlIFRyZW5kIiwNCiAgICAgICB4ID0gIlllYXIiLA0KICAgICAgIHkgPSAiRkVEIEZ1bmRzIFJhdGUgKCUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KIA0KDQotIExldCdzIHBsb3QgdGhlIGRhdGEgZm9yIHRoZSBVbmVtcGxveW1lbnQgUmF0ZQ0KDQpCYXNlZCBvbiB0aGUgcGxvdCwgd2Ugb2JzZXJ2ZSB0aGF0IHRoZSB1bmVtcGxveW1lbnQgaGFzIGJlZW4ga2VwdCB1bmRlciAxMCUgZm9yIHRoZSBwYXN0IDI1IHllYXJzIHVudGlsIGEgc3Bpa2UgZHVlIHRvIENPVklEMTkuDQogDQpgYGB7cn0NCmdncGxvdChkYXRhID0gdW5lbXBsb3ltZW50LCBhZXMoeCA9IGRhdGUsIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiVW5lbXBsb3ltZW50IFJhdGUgVHJlbmQiLA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgeSA9ICJVbmVtcGxveW1lbnQgUmF0ZSAoJSkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIEZlZHMgRHVhbCBtYW5hZGF0ZQ0KDQpUaGUgRmVkcyBoYXMgYSBkdWFsIG1hbmRhdGU6DQoNCi0gS2VlcCB1bmVtcGxveW1lbnQgbG93DQoNCi0gS2VlcCBpbmZsYXRpb24gbG93DQoNCg0KVGhlIENQSSB0cmVuZCBpbmRpY2F0ZXMgYSBnZW5lcmFsIHRyZW5kIG9mIGluZmxhdGlvbiBpbiB0aGUgZWNvbm9teS4gTGV0J3MgZ2V0IHRoZSBkYXRhIGZvciB0aGUgaW5mbGF0aW9uIHJhdGUuDQoNCg0KYGBge3J9DQppbmZsYXRpb24gPC0gZnJlZHIoc2VyaWVzX2lkID0gIkZQQ1BJVE9UTFpHVVNBIiwgDQogICAgICAgICAgICAgICAgICBvYnNlcnZhdGlvbl9zdGFydCA9IHN0YXJ0X2RhdGUsIA0KICAgICAgICAgICAgICAgICAgb2JzZXJ2YXRpb25fZW5kID0gZW5kX2RhdGUpDQoNCmBgYA0KDQoNCkxldCdzIHBsb3QgdGhlIGluZmxhdGlvbiByYXRlLCB0aGUgRkVEIEZ1bmQgUmF0ZSwgYW5kIHRoZSB1bmVtcGxveW1lbnQgcmF0ZSBvbiB0aGUgc2FtZSBncmFwaC4gV2UgY2FuIHVzZSB0aGUgbGlicmFyeSBwbG90bHkgdG8gbWFrZSBhbiBpbnRlcmFjdGl2ZSBncmFwaC4NCg0KYGBge3J9DQpwbG90IDwtIHBsb3RfbHkoKQ0KDQojIEluZmxhdGlvbiBwbG90DQpwbG90IDwtIGFkZF9saW5lcyhwbG90LCB4ID0gfmluZmxhdGlvbiRkYXRlLCB5ID0gfmluZmxhdGlvbiR2YWx1ZSwgbmFtZSA9ICdJbmZsYXRpb24nLCBsaW5lID0gbGlzdChjb2xvciA9ICdibHVlJykpDQoNCiMgVW5lbXBsb3ltZW50IFBsb3QNCnBsb3QgPC0gYWRkX2xpbmVzKHBsb3QsIHggPSB+dW5lbXBsb3ltZW50JGRhdGUsIHkgPSB+dW5lbXBsb3ltZW50JHZhbHVlLCBuYW1lID0gJ1VuZW1wbG95bWVudCcsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcpKQ0KDQojIEZlZGVyYWwgRnVuZHMgUmF0ZSBQbG90DQpwbG90IDwtIGFkZF9saW5lcyhwbG90LCB4ID0gfmZlZF9mdW5kc19yYXRlJGRhdGUsIHkgPSB+ZmVkX2Z1bmRzX3JhdGUkdmFsdWUsIG5hbWUgPSAnRmVkIEZ1bmRzIFJhdGUnLCBsaW5lID0gbGlzdChjb2xvciA9ICdncmV5JykpDQoNCiMgQ3VzdG9taXplIGxheW91dA0KcGxvdCA8LSBsYXlvdXQocGxvdCwgdGl0bGUgPSAiRmVkcyBEdWFsIE1hbmRhdGUiLA0KICAgICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkRhdGUiKSwNCiAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJSYXRlICglKSIpLA0KICAgICAgICAgICAgbGVnZW5kID0gbGlzdCh4ID0gMSwgeSA9IDEuMSkpDQoNCnBsb3QNCmBgYA0KDQotIFJpc2luZyBJbmZsYXRpb24gYW5kIEluY3JlYXNpbmcgRmVkZXJhbCBGdW5kcyBSYXRlOg0KDQpQZXJpb2RzIG9mIHJpc2luZyBpbmZsYXRpb24sIHN1Y2ggYXMgYWZ0ZXIgMjAwMiBhbmQgMjAxNSwgcHJvbXB0ZWQgdGhlIEZlZGVyYWwgUmVzZXJ2ZSB0byBpbmNyZWFzZSB0aGUgRmVkZXJhbCBGdW5kcyBSYXRlIHRvIGN1cmIgcHJpY2UgaW5jcmVhc2VzLkhvd2V2ZXIsIHRoaXMgbGVkIHRvIGhpZ2hlciB1bmVtcGxveW1lbnQuDQoNCi0gSGlnaCBVbmVtcGxveW1lbnQgYW5kIExvd2VyaW5nIEZlZGVyYWwgRnVuZHMgUmF0ZToNCg0KRHVyaW5nIHRpbWVzIG9mIGhpZ2ggdW5lbXBsb3ltZW50LCBsaWtlIGFmdGVyIDIwMDgsIHRoZSBGZWRlcmFsIFJlc2VydmUgcmVkdWNlZCB0aGUgRmVkZXJhbCBGdW5kcyBSYXRlIHRvIHN0aW11bGF0ZSBib3Jyb3dpbmcgYW5kIHNwZW5kaW5nLg0KWWV0LCB0aGlzIGFjdGlvbiBoYXZlIHJlc3VsdGVkIGluIGluY3JlYXNlZCBpbmZsYXRpb24sIHJlZmxlY3RpbmcgdGhlIHRyYWRlLW9mZiBiZXR3ZWVuIGVtcGxveW1lbnQgYW5kIHByaWNlIHN0YWJpbGl0eS4NCg0KIyMjIENvbmNsdXNpb24NCg0KVGhlIGdvYWwgb2YgdGhlIEZlZHMgd2FzIHRvIGtlZXAgdGhlIGluZmxhdGlvbiBhdCAyJSBhbmQgdGhlIHVuZW1wbG95bWVudCByYXRlIGF0IDQuNSUuIA0KDQpMZXQncyB2aXN1YWxpemUgdGhlIGluZmxhdGlvbiBhbmQgdGhlIHVuZW1wbG95bWVudCByYXRlIHRvIGZpbmQgaWYgdGhlIEZlZCByYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWwuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojIEZpbHRlciB1bmVtcGxveW1lbnQgZGF0YSB0byBnZXQgeWVhcmx5IGRhdGENCm1vbnRobHlfdW5lbXBsb3ltZW50IDwtIHVuZW1wbG95bWVudCAlPiUNCiAgZmlsdGVyKGFzLlBPU0lYbHQoZGF0ZSkkbW9uID09IDEpDQoNCiMgQ3JlYXRlIGNvbG9ycyANCmluZmxhdGlvbiRjb2xvcnMgPC0gaWZlbHNlKGluZmxhdGlvbiR2YWx1ZSA8PSAyIHwgbW9udGhseV91bmVtcGxveW1lbnRbMToyNCwgXSR2YWx1ZSA8PSA0LjUsICJncmV5IiwgInJlZCIpDQoNCiMgQ3JlYXRlIGEgc2NhdHRlciBwbG90IHdpdGggaW5mbGF0aW9uIG9uIHRoZSB5LWF4aXMgYW5kIHVuZW1wbG95bWVudCBvbiB0aGUgeC1heGlzDQpnZ3Bsb3QoKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGluZmxhdGlvbiwgYWVzKHggPSBtb250aGx5X3VuZW1wbG95bWVudFsxOjI0LCBdJHZhbHVlLCB5ID0gaW5mbGF0aW9uJHZhbHVlLCBjb2xvciA9IGNvbG9ycyksIHNpemUgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQuNSwgY29sb3IgPSAibGlnaHRibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMiwgY29sb3IgPSAibGlnaHRibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoZ3JleSA9ICJncmV5IiwgcmVkID0gInJlZCIpKSArDQogIGxhYnModGl0bGUgPSAiSW5mbGF0aW9uIHZzLiBVbmVtcGxveW1lbnQiLA0KICAgICAgIHggPSAiVW5lbXBsb3ltZW50IFJhdGUiLA0KICAgICAgIHkgPSAiSW5mbGF0aW9uIFJhdGUiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkJhc2VkIG9uIHRoZSBncmFwaCBhYm92ZToNCg0KLSBUaGUgRmVkZXJhbCBSZXNlcnZlIGhhcyBzdWNjZXNzZnVsbHkgbWFpbnRhaW5lZCBib3RoIGluZmxhdGlvbiBhbmQgdW5lbXBsb3ltZW50IHdpdGhpbiB0aGVpciB0YXJnZXQgcmFuZ2Ugb25seSB0d2ljZSBpbiB0aGUgcGFzdCAyNSB5ZWFycy4NCg0KLSBJbiBzb21lIHllYXJzLCB0aGUgRmVkZXJhbCBSZXNlcnZlJ3MgcG9saWNpZXMgaGF2ZSBlZmZlY3RpdmVseSBjb250cm9sbGVkIGVpdGhlciB0aGUgdW5lbXBsb3ltZW50IG9yIHRoZSBpbmZsYXRpb24gcmF0ZSwgYnV0IG5vdCBib3RoIHNpbXVsdGFuZW91c2x5Lg0KDQotIFRoZXJlIGhhdmUgYmVlbiBuaW5lIHllYXJzIGluIHRoZSBwYXN0IDI1IHdoZXJlIHRoZSBGZWRlcmFsIFJlc2VydmUgaGFzIGZhaWxlZCB0byBtZWV0IGVpdGhlciBvZiBpdHMgZHVhbCBtYW5kYXRlIHRhcmdldHMuDQoNClRoZXNlIGZpbmRpbmdzIG1heSBsZWFkIHRvIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbnMuIFNvbWUgbWF5IGFyZ3VlIHRoYXQgdGhlIEZlZGVyYWwgUmVzZXJ2ZSBoYXMgc3RydWdnbGVkIGFuZCBmYWlsZWQgdG8gZnVsZmlsbCBpdHMgbWFuZGF0ZSBlZmZlY3RpdmVseSBhbmQgc2hvdWxkIGZvY3VzIG9uIG9ubHkgb25lIGdvYWwgdG8gaW1wcm92ZSBpdHMgZWZmZWN0aXZlbmVzcy4gDQoNCk9uIHRoZSBvdGhlciBoYW5kLCBvdGhlcnMgbWF5IGNvbnRlbmQgdGhhdCB0aGUgRmVkZXJhbCBSZXNlcnZlJ3MgdGFzayBpcyBpbmhlcmVudGx5IGNoYWxsZW5naW5nLCBhbmQgZGVzcGl0ZSBvY2Nhc2lvbmFsIHNob3J0Y29taW5ncywgaXQgaXMgbWFraW5nIGNvbmNlcnRlZCBlZmZvcnRzIHRvIGJhbGFuY2UgYm90aCBvYmplY3RpdmVzIGluIGEgY29tcGxleCBlY29ub21pYyBlbnZpcm9ubWVudC4NCg0KDQotLS0NCg0KU291cmNlczoNCg0KMS4gaHR0cHM6Ly9mcmVkLnN0bG91aXNmZWQub3JnL2RvY3MvYXBpL2ZyZWQvDQoNCjIuIGh0dHBzOi8vd3d3LmNoaWNhZ29mZWQub3JnL3Jlc2VhcmNoL2R1YWwtbWFuZGF0ZS9kdWFsLW1hbmRhdGUNCg0KMy4gaHR0cHM6Ly91cGZpbmEuY29tL2hvdy10aGUtZmVkZXJhbC1yZXNlcnZlLWRlY2lkZXMtcG9saWN5Lw0KDQogDQoNCg0KDQoNCi4uLg0KDQo=