About me

My name is Henry Bowers, I graduated from CUNY Baruch College, Zicklin School of Business with a Bachelors of Business Administration in Finance & Investments. I have always had an interest in learning data science for finance to make better informed investment decisions. After taking online courses through Data Camp and reading many articles on R for finance. I decided to take a capstone course in financial econometrics, which was my favorite course in college. Throughout the class I was able to learn even more about risk management and data visualization of time series. I have a growing passion for understanding data science for finance and applying those skills to make better-informed investment decisions for my personal portfolio using quantitative investment strategies with R programming. Skills I developed include multi-asset portfolio construction, optimization, quantitative risk management and volatility modeling.

Linkedin: https://www.linkedin.com/in/henry-bowers/

Introduction

Throughout this research, I will be covering the current state of the markets and where I believe they could be heading. Topics that will be covered will include currency market risk, equity market risk, and fixed income market risk. As the US Federal Reserve continues to fight inflation by raising the feds fund rate, interest rates such as the 10yr treasury & 30yr Mortgage rate will continue to rise, causing markets to reach lower valuations. Data Shown here will indicate how rising interest rates contribute to market risk.

Disclosures

Data gathered for research has been downloaded from yahoo finance API, World Bank API, & FRED API. Historical returns are also not predictors of future performance. Opinions written here are of my own and not of my current employer.

Analyzing Interest Rates

As with everything in life there is good and bad to all situations. If the Federal Reserve continues to increase the Feds Fund Rate to fight inflation this will help cause a stronger dollar compared to other nations. However, this is not a good thing for the long term because even though as Americans we would be able to benefit by traveling to other nations and getting more in return, it will cost foreign countries more to do business with the U.S. since the dollar is stronger it will require more capital investments from countries and foreign businesses which will affect the U.S. exports. At this moment the Fed Funds rate is above the 5yr average causing treasuries and mortgage rates to rise at a rapid rate.


fred = c("DGS10", "MORTGAGE30US", "DFF", "DGS20", "DGS30", "DGS7", "DGS5", "DGS3", "DGS2", "DGS1", "DGS6MO", "DGS3MO", "DGS1MO", "CPIAUCSL")

getSymbols(fred, src = "FRED")
 [1] "DGS10"        "MORTGAGE30US" "DFF"          "DGS20"        "DGS30"       
 [6] "DGS7"         "DGS5"         "DGS3"         "DGS2"         "DGS1"        
[11] "DGS6MO"       "DGS3MO"       "DGS1MO"       "CPIAUCSL"    
Ten.Yr = na.omit(DGS10 / 100)  

Twenty.Yr = na.omit(DGS20 / 100)

Thirty.Yr = na.omit(DGS30 / 100)

Seven.Yr = na.omit(DGS7 / 100)

Five.Yr = na.omit(DGS5 / 100)

Three.Yr = na.omit(DGS3 / 100)

Two.Yr = na.omit(DGS2 / 100)

One.Yr = na.omit(DGS1 / 100)

SixMo = na.omit(DGS6MO / 100)

ThreeMo = na.omit(DGS3MO / 100)

OneMo = na.omit(DGS1MO / 100)


FFR <- na.omit(DFF / 100)

FFR.Rate <- window(FFR, start = "2018-1-1")

autoplot(FFR.Rate) + theme_hc() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.0025)) + geom_line(size = 0.8, color = "darkblue") + 
  geom_hline(yintercept = mean(FFR.Rate), color = "red", size = 0.7) + labs(title = "Federal Funds Rate", x = "", y = "Rate", caption = "Data Source: FRED") + 
  scale_x_date(date_breaks = "years", date_labels = "%Y")

Rising Feds fund rate will also increase the 10yr treasury and even 30yr mortgage rates. The 10yr treasury is used by investment banks and analysts for the risk-free rate when computing CAPM in the WACC formula which is the discount rate used in projecting future cash flows. When the WACC increases this is one of many indicators that will lead to decreasing future cash flows and lower valuation prices on equities, hence causing bearish signals in the market and causing retail investors to even sell off more. As we can see below since the Fed has been increasing the fund rate, the 10yr treasury has begun to rise sharply. The 10yr treasury is also the RF used to calculate risk-adjusted measures such as Sharpe ratios and Treynor ratios since the 10yr is increasing this will lead to potentially lower metrics for risk-adjusted measures.


Ten.Year = window(Ten.Yr, start = "2018-1-1")

autoplot(Ten.Year) + theme_hc() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.0025)) + geom_line(size = 0.8, color = "darkblue") + 
  geom_hline(yintercept = mean(Ten.Year), color = "red", size = 0.7) + labs(title = "1O Year Treasury", x = "", y = "Rate", caption = "Data Source: FRED") + 
  scale_x_date(date_breaks = "years", date_labels = "%Y")

When the 10yr treasury rises this will also trigger an increase in the 30yr mortgage rate, when the 30yr mortgage rate increases this leads to higher cost to housing supplies and less people wanting to buy homes therefore affecting the home builders industry and real estate industry as whole. As shown below the 30yr mortgage rate is above 5yr highs.


Mortgage.30 <- na.omit(MORTGAGE30US / 100)

Mortgage.30 = window(Mortgage.30, start = "2018-1-1")

autoplot(Mortgage.30) + theme_hc() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.0025)) + geom_line(size = 0.8, color = "darkblue") + 
  geom_hline(yintercept = mean(Mortgage.30), color = "red", size = 0.7) + labs(title = "30 Year Mortgage Rate", x = "", y = "Rate", caption = "Data Source: FRED") + 
  scale_x_date(date_breaks = "years", date_labels = "%Y")

Analyzing Historical Spreads

Typically, longer-term treasuries are often given higher interest rates than shorter-term treasuries given that there is more interest rate risk in the longer term than there is in the shorter term. However, it becomes a problem when shorter-term treasures start to increase greater than longer-term treasuries. this will then mean that shorter-term treasuries are becoming riskier than long term, below are historical spreads of the 10-year treasury compared to its shorter-term counter parts.


# 10 year - 7 year 

TenYr.SevenYr_Spread = na.omit(Ten.Yr - Seven.Yr)

p4 = autoplot(TenYr.SevenYr_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.002)) + 
  labs(title = "10 - 7 Year Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.8)

# 10 Year - 5 Year

TenYr.FiveYr_Spread = na.omit(Ten.Yr - Five.Yr)

p5 = autoplot(TenYr.FiveYr_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.003)) + 
  labs(title = "10 - 5 Year Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.8)


#10 Year - 3 year

TenYr.ThreeYr_Spread = na.omit(Ten.Yr - Three.Yr)

p6 = autoplot(TenYr.ThreeYr_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.005)) + 
  labs(title = "10 - 3 Year Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)


#10 Year - 2 year

TenYr.TwoYr_Spread = na.omit(Ten.Yr - Two.Yr)

p7 = autoplot(TenYr.TwoYr_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.010)) + 
  labs(title = "10 - 2 Year Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)


#10 Year - 1 year

TenYr.OneYr_Spread = na.omit(Ten.Yr - One.Yr)

p8 = autoplot(TenYr.OneYr_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.010)) + 
  labs(title = "10 - 1 Year Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)


# 10 Year - 6 Month

TenYr.SixMO_Spread = na.omit(Ten.Yr - SixMo)

p9 = autoplot(TenYr.SixMO_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.007)) + 
  labs(title = "10 Year - 6 Month Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)

# 10 Year - 3 Month

TenYr.ThreeMO_Spread = na.omit(Ten.Yr - ThreeMo)

p10 = autoplot(TenYr.ThreeMO_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.010)) + 
  labs(title = "10 Year - 3 Month Treasury Yield Spread", x = "", y = "Spread") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)


# 10 Year - 1 Month

TenYr.OneMO_Spread = na.omit(Ten.Yr - OneMo)

p11= autoplot(TenYr.OneMO_Spread) + theme_tq() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.010)) + 
  labs(title = "10 Year - 1 Month Treasury Yield Spread", x = "", y = "Spread", 
       caption = "Below 0 represents economic weakness and fear within the economy, Source: FRED") + 
  geom_line(size = 0.8, color = "lightblue") + geom_hline(yintercept = 0, color = "black", size = 0.7)


grid.arrange(p4,p5,p6,p7,p8,p9,p10,p11, ncol = 2, top=textGrob("10 Year Yield Curves"))

At the time I am drafting this analysis, all 10-year yield curves have inverted, from the 10 minus 7-year to the 10-year minus 1 month. Many financial articles talk about 10-year minus 2-year or 10-year minus 3 months, cause Historically speaking when those yield curves have inverted (meaning when the shorter-term treasury has a higher rate than the longer-term treasury) they predicted recessions within the US. There is another yield curve that is not talked about much and I want to shed some light on it and that would be the 10-year minus 1 month. The 1-month treasury is the shortest the FRED offers and is supposed to be the least risky, even though this yield has inverted during the housing market collapse and right before the recession proceeding to COVID. At the time I am drafting this research report as well the Federal Funds Effective rate is at 4.25%, which still has more room to grow, below will showcase the historical performance of inflation compared to the FED Funds Rate.


US.Inflation <- na.omit(diff(log(CPIAUCSL$CPIAUCSL), 12)) 

colnames(US.Inflation) <- "US.Inflation"

names(FFR) = "Fed.Rate"

Inflation.FFR = na.omit(cbind(US.Inflation, FFR))

chart.TimeSeries(Inflation.FFR, plot.engine = "ggplot2") + theme_hc() + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.02)) + 
  labs(title = "Inflation Rate compared to Federal Funds Rate", caption = "Below 0 Represents Periods of Deflation, Data Source: FRED", y = "Rate") + geom_line(size = 0.8) + 
  geom_hline(yintercept = 0, color = "black", size = 0.7)

Historically speaking, Inflation has not seen a massive decrease until the Fed Funds Rate (FFR) increased to a rate that is above the inflation rate. The Federal reserve’s main initiative it seems at this moment is to lower inflation as much as possible however data shows the FFR needs to rise above which will not be good for equity markets and fixed-income markets in the short term. The reasoning for this is as previously mentioned for equity markets, the 10Yr treasury yield is closely linked to the FFR, therefore a higher FFR could lead to a much higher 10yr treasury, causing higher WACC (even lower equity valuations perhaps), lower bond prices and even higher 30yr mortgage rates. If interest rates continue to rise retail investors could potentially hedge their portfolios by buying puts on bond prices ETFs such as BND and, since as interest rates rise bond prices go down, and when mortgage rates rise home Builders ETF would fall which investors could potentially as well buy puts on XHB (not financial advice).

Currency Market Risk

As earlier mentioned, when interest rise, they could have their positives as well, such a positive could be a stronger dollar. When the dollar becomes stronger this allows US consumers to gain more buying power when visiting foreign nations. Higher interest rates also lead to higher high yield saving account rates and potential opportunities for locking higher rates in CD accounts.

Below shows the performance of the DXY, the dollar index whose nominal value is 100, when the index value goes above 100 this represents the dollar is gaining strength against the major currency pairs of the USD. DXY is long the USD and shorts the major trading pairs such as EUR, JPY, GBP, CAD, SEK, and CHF. the weights of this index are constructed as follows

EUR: 57.6% JPY: 13.6% GBP: 11.9% CAD: 9.1% SEK: 4.2% CHF: 3.6%


tics <- c("UUP", "DX-Y.NYB", "UDN")

getSymbols(tics, from = "2018-1-1", to = Sys.Date())
[1] "UUP"      "DX-Y.NYB" "UDN"     
DXY <- na.omit(Ad(`DX-Y.NYB`))
names(DXY) = "Dollar.Index"

autoplot(DXY) + theme_hc() + labs(title = "Dollar Index Performance", x = "", y = "Value", caption = "Source: Yahoo Finance") + 
  geom_line(size = 0.8, color = "darkblue") + geom_hline(yintercept = mean(DXY), size = 0.7, color = "red") + 
  scale_x_date(date_breaks = "years", date_labels = "%Y")

As shown above. the dollar index is trading above 5-year average levels which is due to rising interest rates causing a stronger dollar, since the DXY is currently at 106.3 this would represent the dollar appreciated 6.3% when interest rates were low back in 2021 the DXY was sitting around 90 which represented the dollar depreciated about 10% against its major trading pairs. retail investors can’t directly invest in DXY however, Invesco offers an ETF known as UUP which tracks the performance of DXY. retail investors who believe the dollar will become stronger due to rising interest rates could buy UUP to take advantage of that opportunity. Shown below is the cumulative returns of DXY and UPP.


UUP.rets <- Return.calculate(Ad(UUP), method = "log")[-1]
names(UUP.rets) <- "UUP.Ret"

DXY.rets <- Return.calculate(DXY, method = "log")[-1]
names(DXY.rets) = "DXY.Ret"

dollar.rets <- na.omit(cbind(UUP.rets, DXY.rets))

chart.CumReturns(dollar.rets, plot.engine = "ggplot2") + theme_hc() + 
  labs(title = "Performance Comparison", x = "", y = "Cumulative Return", caption = "Source: Yahoo Finance") + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.05)) + scale_x_date(date_breaks = "years", date_labels = "%Y")

Investors could see Invesco Dollar bullish fund has done a fairly great job of replicating the performance of the DXY index. However, investors should understand that if interest rates fall suddenly, DXY would then decrease, causing a weakening in the dollar and UUP would decline as well. If an investor believes interest rates would fall causing a potentially weakening dollar, they could buy UDN which is the bearish fund from Invesco which shorts the USD against the major trading partners. Below showcases the performance comparison of UUP (bullish dollar fund) & UDN (bearish dollar fund).


UDN.rets <- Return.calculate(Ad(UDN), method = "log")[-1]
names(UDN.rets) = "UDN.Ret"

dollar.rets_2 <- na.omit(cbind(UUP.rets, UDN.rets)) 

chart.CumReturns(dollar.rets_2, plot.engine = "ggplot2") + theme_hc() + 
  labs(title = "Dollar Bullish VS Dollar Bearish", x = "", y = "Cumulative Return", caption = "Source: Yahoo Finance") + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.05)) + scale_x_date(date_breaks = "years", date_labels = "%Y")

During periods when UUP would fall, UDN would rise. Within the past 5 years, the dollar overall has gained more strength than it did weakening. I won’t be surprised if the DXY ends up reaching 120 or even 125 before the FED starts to decrease rates.

Fixed Income Market Risk

Thus far have mentioned how interest rates affect the markets, I will be diving into how rising/falling interest rates would affect the fixed-income market. Seeking Alpha has an amazing page dedicated to “Key Market ETFs” and I will be utilizing their bond section to capture the performance of US bonds within the past 5 years by constructing an equally weighted portfolio of Bond ETFs.


bond.tics <- c("TLT", "BND", "TIP", "PHB", "VCSH")

getSymbols(bond.tics, from = "2018-1-1", to = Sys.Date())
[1] "TLT"  "BND"  "TIP"  "PHB"  "VCSH"
Bond.prices <- map(bond.tics,function(x) Ad(get(x)))

Bond.prices <- reduce(Bond.prices,merge)

colnames(Bond.prices) <- bond.tics

Bonds.ret <- na.omit(Return.calculate(Bond.prices, method = "log"))

colnames(Bonds.ret) <- bond.tics


Bond.Weights <- rep(1 / ncol(Bonds.ret), ncol(Bonds.ret))

Bonds.Port <- Return.portfolio(Bonds.ret, Bond.Weights, rebalance_on = "years")
names(Bonds.Port) = "Bonds.Port"

Bonds.port_cu <- cumprod(1+Bonds.Port)-1

autoplot(Bonds.port_cu) + theme_hc() + geom_line(size = 0.8, color = "darkblue") + scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.02)) + 
  geom_hline(yintercept = mean(Bonds.port_cu), color = "red", size = 0.7) + 
  labs(title = "US Bond Market Performance", x = "", y = "Cumulative Return", caption = "Source: Yahoo Finance") + scale_x_date(date_breaks = "years", date_labels = "%Y")

During periods when the bond market was above average in returns, the FFR was very minimal, leading to higher bond prices. However, as soon as interest rates started to rise to combat inflation, bond prices began to fall. Bonds historically are supposed to be one of the “safest” investments to make although during periods of rising interest rates they are one of the worse since they are very sensitive to interest rate movements. Now let’s look at the bond market volatility.

Bond Market Volatility

Throughout this research, I will be utilizing Exponential Moving Average with a λ of 0.06 to measure the volatility of returns. Investors could notice that throughout the time the returns of the bond market were very sensitive to interest rate movements, notice at this time interest rates are above their 5yr average, and the volatility of the bond portfolio is also above the 5yr average.


Bond.vol <- na.omit(EMA(Bonds.Port^2, ratio = 0.06))
names(Bond.vol) = "Bond.Vol"
Bond.vols <- Bond.vol^0.5

autoplot(Bond.vols) + theme_hc() + geom_line(size = 0.8, color = "darkblue") + geom_hline(yintercept = mean(Bond.vols), color = "red", size = 0.7) + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1, 0.001)) + scale_x_date(date_breaks = "years", date_labels = "%Y") + 
  labs(title = "Volatility Over Time", x = "", y = "Vol", caption = "Source: Yahoo Finance")

Once interest rates start to cool down, we should start to see lower volatility in returns until then I believe investors should expect to see even more vol in the bond market, my strategy since I think interest rates could rise up to potentially 5% would be to buy puts for the short term and calls for the long-term. The reasoning for this is that when interest rates start to decrease, we are going to see a rise in bond prices causing higher returns for the bond market.

Equity Market Risk

Rising interest rates don’t just affect the bond market and currency market, as mentioned before it has a large impact as well in the equity market. Throughout this section I will be covering the US equity market.


equity.tics <- c("^GSPC")

getSymbols(equity.tics, from = "2018-1-1", to = Sys.Date())
[1] "^GSPC"
SP500.rets <- Return.calculate(Ad(GSPC), method = "log")[-1]
names(SP500.rets) = "SP500"

SP500.rets_cu = cumprod(1+SP500.rets)-1

autoplot(SP500.rets_cu) + theme_hc() + geom_line(size = 0.8, color = "darkblue") + geom_hline(yintercept = mean(SP500.rets_cu), size = 0.7, color = "red") + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.1)) + scale_x_date(date_breaks = "years", date_labels = "%Y") + 
  labs(title = "SP500 5yr Performance", x = "", y = "Cumulative Return", caption = "Source: Yahoo Finance") 

Within the last few years, the US equity market has been very volatile, from geopolitical risk to global inflation concerns and rising interest rates have all affected equity prices. At this moment, the US equity market is still above 5yr average however it is border lining. If interest rates continue to rise to potentially even above 5%, this could cause more fear within the equity market and even more retail investors to sell their positions, potentially leading to much lower prices for the SP500. Investors could hedge their portfolios by shorting the market in the short term on betting interest rates increase, however it would be very wise to also continue the dollar cost average into the mark to take advantage of this opportunity of lower prices, because eventually the market will rise again, it will just take some time for the US economy to recover.


SP500.vol <- na.omit(EMA(SP500.rets^2, ratio = 0.06))
names(SP500.vol) = "SP500.Vol"
SP500.vols <- SP500.vol^0.5

autoplot(SP500.vols) + theme_hc() + geom_line(size = 0.8, color = "darkblue") + geom_hline(yintercept = mean(SP500.vols), color = "red", size = 0.7) + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1, 0.005)) + scale_x_date(date_breaks = "years", date_labels = "%Y") + 
  labs(title = "S&P Volatility Over Time", x = "", y = "Vol", caption = "Source: Yahoo Finance")

Since interest rates started to increase and fears of potentially entering a recession this has increased volatility in returns. As long there is fear within the market investors should expect to see an increase in volatility, and once the economy stabilizes investors would notice vols decreasing and returns rising once again.


SP.Drawdowns = Drawdowns(SP500.rets, geometric = TRUE)

autoplot(SP.Drawdowns) + theme_hc() + geom_line(size = 0.8, color = "darkblue") + geom_hline(yintercept = mean(SP.Drawdowns), color = "red", size = 0.7) + 
  scale_y_continuous(labels = scales::percent, breaks = seq(-1,1,0.05)) + scale_x_date(date_breaks = "years", date_labels = "%Y") + 
  labs(title = "Drawdowns", x = "", y = "Drawdown", caption = "Source: Yahoo Finance")

Within the last 5yrs, the market has reached a drawdown of -35% and that was when COVID-19 took the world by surprise, now with the geopolitical risk of increasing tensions with Ukraine & Russian war potentially causing a global recession the US equity market has roughly fell 25% from its previous highs. Global recession fears because of geopolitical risk are dominantly the main causes of the decrease we have today, however by the FED rising interest rates to help fight off inflation in the US to bring it back to its normal rate of around 2%, we could see larger declines in the overall equity market because equity valuations will most likely decrease from rising WACC leading to lower projected cash flows and more fear within the equity markets causing more sell offs.