Simulating A Fund’s Value Over Time in R

Suppose you have $1 million  invested in a trust fund at 8% annually with a standard deviation of 30%.  Assume that inflation averages 3% over the term with a standard deviation of 9%.   You plan to withdraw $80,000 a year in monthly installments of $6,666.67.  What are the chances that the $1 million lasts you ten years?

This problem can be modeled using simulation.  The fund will lose and gain money according to a process that has both deterministic and random components.  The interest rate will fluctuate in a similar fashion and impact the fund’s bottom line.  The goal is to model how likely the fund is to last the desired 10 years.

I’ve seen problems like this approached by simulating random price paths in excel, but they almost always look like shit because each solitary trial involves periodic iterations, quickly turning the spreadsheet into a clusterfuck. Excel also makes it incredibly hard to make a simple histogram or Kernel Density Estimate, which I personally think are the most effective approaches to model the fund’s survival.  Instead of Excel, I’ll use R to quickly visualize the behavior of the fund and compute descriptive and inferential statistics using the same (admittedly questionable) Brownian Motion approach.  First set the parameters:

#Fund balance and rates
start.capital = 1000000
annual.mean.return = 8 / 100
annual.ret.std.dev = 30 / 100
annual.inflation = 3 / 100
annual.inf.std.dev = 9 / 100

Withdrawals

monthly.withdrawals = 80000/12
n.obs = 10*12

Number of simulations

n.sim = 100

It’s easiest to treat the each iteration of the simulation as a sequence of 120 months and convert our annual return and inflation measures into monthly ones:

monthly Investment and Inflation assumptions

monthly.mean.return = annual.mean.return / 12
monthly.ret.std.dev = annual.ret.std.dev / sqrt(12)
monthly.inflation = annual.inflation / 12
monthly.inf.std.dev = annual.inf.std.dev / sqrt(12)

With just one line of code, R can perform a wide range of simulations.  Some are parametric, meaning their validity depends on an assumption(s) that must be made about the shape of the underlying distribution.  Other techniques, like bootstrapping and subsampling, are called robust, meaning distributional assumptions aren’t necessary for sound results.

Brownian motion is a process characterized by periodic returns that are normally distributed and independent of each other.  To simulate it, we must first generate normally distributed and independent returns and inflation rates for each of the 120 periods over which we will model the fund’s value.  This completes one simulated ten year period.  Since we can’t learn shit from just one simulated outcome, we iterate this process to a desired frequency, which is positively related to the model’s accuracy.  First we simulate the required number of returns and inflation rates to simulate 100 outcomes:
monthly.invest.returns = matrix(0, n.obs, n.sim)
monthly.inflation.returns = matrix(0, n.obs, n.sim)

monthly.invest.returns[] = rnorm(n.obs * n.sim, mean = monthly.mean.return, sd = monthly.ret.std.dev)
monthly.inflation.returns[] = rnorm(n.obs * n.sim, mean = monthly.inflation, sd = monthly.inf.std.dev)

So now we’ve generated a matrix monthly.invest.returns with 120 rows, corresponding to months, and 100 columns, corresponding to iterations of the random entire 120-month long random process.  The matrix monthly.inflation.returns is the same thing but for inflation.

The fund starts out with $1 million, and each period three adjustments are made to the net asset value (NAV): it is multiplied by a factor of 1 plus the random return, it’s discounted by the random inflation rate, and a withdrawal is made.  So, to get to NAV at time x+1, the previous NAV is multiplied by:

(1+monthly.invest.returns(x, ) – monthly.inflation.returns(x ,))

Notice I left the column number blank when I called the matrices because I want to calculate values for month x (row x) over all columns.  Using a simple code I can loop through all 100 columns efficiently for each row.  Putting everything together, I have:

nav = matrix(1000000, n.obs + 1, n.sim)
for (j in 1:n.obs) {
      nav[j + 1, ] = nav[j, ] * (1 + monthly.invest.returns[j, ] –            monthly.inflation.returns[j, ]) – monthly.withdrawals
}

Since negative fund values don’t make any sense, I tell R to replace negative fund values with NA.  Characterizing all such funds this way also gives me an easy way to count how many cases there are:

nav[ nav < 0 ] = NA

p.alive = 1 – rowSums(is.na(nav)) / ncol(nav)

The vector p.alive is the percentage of funds that haven’t yet run out of money.  Plotting the probability of fund survival by period gives us an idea of the time at which funds start to experience solvency troubles:

paying.funds

About halfway through the 10 years the percentage of living funds turns downward and continues on a linear ish trend until the end of the term, though the proportion of living funds remains larger than the proportion of insolvent funds throughout.

I can get a snapshot of how the strong the 100 funds finished by printing out the 120th row of the matrix:

end

If I wanna know how big a typical surviving fund’s financial cushion is, I’m going to want to sort the final NAVs into groups. Aesthetically, the NA values everywhere just kind of fuck me up.  Use the ! operator to group the final NAV values that aren’t equal to NA (i.e. all the surviving funds):

surv

So of the 100 funds 56 survived the entire 120 months.  Formally they represent the conditional distribution of the funds given they survived to month 120.  This might be of interest in a more detailed analysis, but for now I’ll just point out one thing – the fact that only about half of the funds survived but more than a few of the ones that did survive have balances well above 1 million suggests to me that the issue stems from too much risk (variability) not insufficient return.

Finally, R makes it very easily to plot the density of the surviving funds, which is hard and annoying to do in Excel:

  if(length(final.nav) == 0) return()
plot(density(final.nav, from=0, to=max(final.nav)), las = 1, xlab = ‘Final Capital’,
main = paste(‘Distribution of Final Balance,’, 100 * p.alive[120], ‘% still solvent’))

hist

Ta-da.  Personally, I think a density estimate of the final fund value for surviving funds, appropriately labeled with the proportion of the total 100 funds that belong to this group, gives a clearer, more precise, and more complete summary of the simulation results than could be obtained by just simulating and plotting price paths in Excel.

Histograms and Density Estimation in R

It’s well-known that monthly returns tend to be closer to normally distributed than daily returns. In their analysis of daily returns for the purposes of event studies, Stephen J. Brown (Yale) and Jerold B. Warner (U Rochester) say “The daily stock return for an individual security exhibits substantial departure from normality that are not observed with monthly data” (source).  They attribute this to the kurtosis of daily returns – in other words, the distribution of daily returns are fat tailed.

In this presentation, Martin Groth finds that 100% of funds surveyed reject the hypothesis that daily returns are normally distributed using the Jacque-Berra test of normality, versus 20% for monthly data.  The results are similar using the Lilliefors test (source).

It’s true that monthly returns tend to be “more” normal, though I prefer the wording “at the very least, the simplifying assumption of normality is much less crazy for monthly returns than it is for daily returns” (from stackexchange).

I loaded into R monthly continuously compounded return data of the S&P500, the MSCI Emerging Market Index (EEM), the Vanguard total stock market index (VTI), and finance and healthcare sector ETFs (XLF and XLV, respectively) since the year 2004.  I created a dataframe called “allreturns” that looks like this:

dataframe

We can examine this claim with a normal Q-Q plot, which compares the quantiles observed in the monthly return data from 2004-2015 with the quantiles of the normal distribution.  Though we’re interested in the normal at the moment, we could compare the data to any probability distribution using a Q-Q plot, not just the normal.  Below is the S&P500 data, which we can access from the data frame using allreturns$SP500:

qqnorm(allreturns$SP500)

qqline(allreturns$SP500

QQPlot_S&P500_Monthly_10yr

The data appear to be skewed to the left (i.e negatively skewed) as evidenced by points falling below the line on only the left hand side.  A negatively skewed distribution is one characterized by frequent and small positive values and a few large negative values.  In this context, you could say large negative returns are more common than large positive ones.  To verify this, I’ll calculate the sample skewness for all of the assets in my data frame using the command apply(allreturns,2,skewness).  R tells me that the skewness of the S&P500 is -1.08395 in the sample.  The financial sector ETF was the most skewed (-1.2527).

A histogram is a type of continuous frequency distribution that aids in visualizing the shape of data.  Data is divided into bins (consecutive, non-overlapping intervals of the variable in question), and rectangles are plotted adjacently with height proportional to the frequency of observations within a bin.  It’s basically a depiction of the density of the sample data, its purpose being to estimate the density of the population from which it was drawn – i.e. the probability density function.  It was invented by Karl Pearson.  Below is a histogram of monthly returns on the S&P500 over the period and the code used to generate it:

Hist(allreturns$SP500, probability=TRUE, col=”slateblue1″,main=”Histogram of S&P500 Monthly Returns”, ylim=c(0,12))

histogram_sp500_monthly

You can see that the data is indeed left-skewed (also called negatively skewed), because its tail on the left-hand side is longer.  For the sake of comparison, I want to know what the returns on the S&P500 would look like if they were actually normally distributed.  To do this I can use the rnorm() function, which produces random deviates according to the normal distribution, with the parameters of rnorm equal to the sample mean and sample standard deviation of my S&P500 data:

n <- 1000

X <- rnorm(n, mean=mean(returns$SP500), sd=sd(returns$SP500))

X is a vector of 1000 normally distributed values with a mean of 0.447% and a standard deviation of 4.14%, which are the sample mean and standard deviation of the monthly returns on the S&P500 from 2004 to April 2015.  Here’s a histogram of X:

Simulated Normal S&P500 Returns Monthly

The simulated data looks more bell-shaped than the sample data, but because they don’t have the same scale or number of bins, it’s hard to tell with precision how much ‘more normal’ it is.  That they are sensitive to the number of bins chosen is a big drawback of histograms.  A more effective way to visualize the distribution of a variable is by plotting a density estimate of the sample.  A density estimate basically just makes the histogram smooth, and thus takes us one step closer to visualizing the pdf. It’s incredibly easy to produce in R:

sp500.density = density(allreturns$SP500)

Below, I’ve plotted the density estimate of the S&P500 returns along with its histogram.  You can see they have the same shape but the density estimate is smooth, thus providing a better estimate of the pdf of the data:

hist(allreturns$SP500,col=”slateblue1″,probability=TRUE,main=”Histogram of S&P500 Monthly Returns”)

points(sp500.density,type=”l”,col=”orange”,lwd=2)

histogram_KDE_sp500_monthly

Now, let’s compare the density of the S&P500 with the normally-distributed values that we simulated by superimposing the density estimate on the histogram:

n <- 1000

x <- rnorm(n,mean=mean(returns$SP500),sd=sd(returns$SP500))

hist(x,probability=TRUE,col=”light blue”,xlab=”Monthly Returns”,main=”S&P500 Density vs. Normal”,ylim=c(0,12))

points(sp500.density,type=”l”,col=”orange”,lwd=2, ylim=c(0,12))

sp500_density_vs_normal

They don’t match up all that well, but it could be worse.  Adding a vertical line at the sample mean with abline() shows that the normal random deviates, i.e. vector ‘x’ , are more symmetric with respect to the sample mean than the observed sample values.  Hence our data is skewed, as the QQ plot implied:

n <- 1000

x <- rnorm(n,mean=mean(allreturns$SP500),sd=sd(allreturns$SP500))

hist(x,probability=TRUE,col=”light blue”,xlab=”Monthly Returns”,main=”S&P500 Density vs. Normal”,ylim=c(0,12))

points(sp500.density,type=”l”,col=”orange”,lwd=2, ylim=c(0,12))

abline(v=mean(allreturns$SP500),lty=3,col=”red”,lwd=2)

sp500_density_vs_normal_w_samplemean

Using the density estimate and the normal deviates produced by R, it’s easy to visualize the negative skew in the sample data.  Next time I’ll plot multiple densities with ggplot2 and analyze the data using a nonparametric bootstrap.

The Assumption of Constant Expected Returns

Time series data – for example, the price of a financial asset over time – is tricky to work with statistically. Though it’s hard to see, the time component complicates sample data, and thus common descriptive statistics can lead to erroneous conclusions. I like the word of caution Analytics Bridge’s Tom Fawcett gives:

http://www.datasciencecentral.com/profiles/blogs/avoiding-a-common-mistake-with-time-series

There are a few ‘models’ that aim to overcome the challenges posed by time series in effectively analyzing financial assets over time. The simplest (that I’ve come across, anyway) is the Constant Expected Returns (CER) model. As the name implies, the major result is that asset returns are constant with respect to time, i.e. time invariant.  Just as important are the assumptions that lead us here:

The first is called covariance stationarity, which says that the covariance of a given pair of returns in a sequence of returns depend only on their position relative to each other.  The important part of this is that the covariance of a given pair of returns don’t depend on time itself, just the distance between each other.  Consider the returns on a particular financial asset this coming June and July.  Their covariance depends only on the fact that they’re one month apart – not that it’s this year as opposed to 2016 or beyond. We would expect the same covariance between returns next June and July, and the following year, etc. under this model.

The second assumption is that the time series is ergodic stochastic.  (Does anyone know if ergodicity/ergodacity is a word…?  i.e. the state of being ergodic?  My stochastic processes professor used to say it but he made up a lot of words).  This assumption states that each return is a random variable drawn independent from the same (unknown) density function/pdf.  So, obviously we don’t know the exact pdf from which the returns are drawn (otherwise we would already know everything there is to know about them, and this would all be pointless) but we assume they’re independently drawn from the same one.  The point of this statistical analysis is to determine the properties of this unknown pdf – its mean, variance, skewness, etc.

Given the preceding assumptions are satisfied, the population of returns on the financial asset in question constitutes a stochastic process, usually denoted with brackets {R}, that is covariance stationary and ergodic stochastic.  Furthermore, returns are normally distributed with a constant mean and variance:

  • Mean: E{Rt} = µ independent of t
  • Variance: Var{Rt} = σ2 independent of t
  • Covar{Rt,Rj} = yj independent of t
  • Cor{Rt,Rj} = yj/ σ2 independent of t

So, the return at time t is distributed: ~N(µ,σ2) for all returns at all times. Another way to express this is to write the expected return at a given time as rt = µ + Et where E is normally distributed with mean 0 and variance σ2, i.e. ~N(0,σ2). E is called “Gaussian White Noise”.  In words, returns are comprised of an expected component and a random component that fluctuates around 0 with constant, normally-distributed variability.

I won’t go into much detail because this next result can be easily derived, but the CER model of asset returns implies that the logarithm of asst prices follow a random walk, where the log price of an asset can be broken down component-wise into the sum of the previous period’s log price, the expected change in the log price µ, and the unexpected change Et.

With the results of this model, we can do a lot: create confidence intervals for the mean and standard deviation, perform hypothesis tests, Monte Carlo simulations, parametric Value at Risk, etc.  These types of computations are parametric i.e. their validity depends heavily on the assumptions we’ve made about the underlying distribution of asset returns – specifically, the assumption that they’re normally distributed with a constant mean and variance.

What does empirical evidence say about the results of the CER model, that asset returns and their volatility are constant in time and prices follow a random walk?  Here are the prices of the MSCI emerging markets index (EEM) and its low volatility counterpart (EEMV):

Historical Prices of EEM and EEMVIt’s hard to look at this graph and conclude whether expected returns and volatility are constant in time (for me anyway).  And I can’t tell by looking at this whether the logs of the two series likely follow a random walk or not.  Instead, let’s analyze whether continuously compounded returns are normally distributed with a mean of 0 and constant variance:

Daily Returns on EEMVIt does look like the mean of returns is (approximately) 0.  However, it looks like the typical deviation from 0 tends to fluctuate in time – ie. variance is not constant.  There are also more outliers (extreme observations) than one would expect for normally distributed data – suggesting the distribution of returns has more kurtosis than the normal distribution.  If I go back in time even farther, the result is more pronounced:
EEM_Since_2005 It’s clear that over longer time frames, volatility is not constant.  In fact, volatility tends to cluster – that is, periods of low volatility are followed by periods of low volatility (2004 to 2007 and mid-2012 onward) and high volatility leads to more high volatility (2008 to 2010).  So perhaps there’s some variable – perhaps a characteristic of the economy, like liquidity or expectations or something – that tends to impact the volatility of asset returns.  Here’s the same data in a QQ plot, which tests whether the data is normal by matching up the empirical quantiles of observed returns on EEM with the quantiles that would be expected if the data were in fact normal:
EEMDaily_QQ
Normally distributed data is evidenced by a straight line. The deviations observed in the QQ plot above – below on the left hand side, above on the right – represent data points uncharacteristically “extreme” for the normal distribution.  That is, extreme values are much more typical for EEM returns than what would be observed if it were truly normally distributed.
These results don’t render the constant expected returns model worthless, but they illustrate the need to consider the assumptions of the model carefully.  The model is still a useful starting point from which more sophisticated and accurate models can be created.  Remember to interpret Monte Carlo simulations, hypothesis tests, etc. that are computed according to the assumption of the CER model with a grain of salt.
A more prudent approach to the traditional Value at Risk, in light of these findings, would be an Empirical Value at Risk.  Recall that the X*100% quantile of a distribution is the value q such that X*100% of observations in the sample are less than q.  The X% value at risk is the loss on an asset that’s more extreme than X% of the observed values; in other words, a greater loss occurs only (1-X)% of the time.  For example, the 95% empirical value at risk is the loss such that it’s more extreme than 95% of the observed data; that is, a greater loss only occurred 5% of the time in the sample data.  Notice that we’re drawing conclusions based strictly on the sample data rather than assuming the data follows a distribution and computing the quantile values implied by a  probability distribution.

The quantile() function  in R makes computing empirical quantiles easy. The default is for the function to return 0%, 25%, 50%, 75%, and 100% quantiles – i.e. the min, max, median, and 25% and 75% quantiles (the median is the same thing as the 50% quantile). The function will return any quantiles you request with the probs argument.  For example, probs=c(0.01,0.05) will return the 1% and 5% quantiles, which are used in the 99% and 95% empirical value at risk computations.  Below is an example, using the daily returns on EEM over the past 4 years and a $10,000 initial investment:

quant_eem = quantile(EEM_Daily, probs=c(0.01,0.05))

var_eem = (exp(quant_eem)-1)*10,000

The variable quant_eem computes the 1% and 5% quantiles – i.e. the returns such that only 1% and 5% of returns, respectively, are lower.  To compute the impact of this return on your $10,000, multiply it by (Exp(return)-1), sometimes called the accumulation factor.  The result I get is $322.28 for the 99% empirical VAR and $189.08 for the 95%.  So, in the sample, you’d have lost more than $322 in a day only 1% of the time, and more than $189 only 5% of the time.  We could compare this to the quantile values implied by the normal distribution, and we’d find that the losses implied by the data are more extreme.

The Downtrend in the LFPR and how it Impacts the Unemployment Rate

The BLS is expected to report that the US economy added almost 250,000 jobs in March, a healthy number despite its decline relative to February.  It has now been over a year since less than 200,000 seasonally adjusted jobs were added in a single month.  Despite robust job creation, analysts expect the Unemployment Rate to remain unchanged or slightly decrease.  There’s only way an economy can add jobs without lowering the rate of unemployment is by adding to the labor force, or in other words increasing the labor force participation rate.  Basically, some of the 250,000 new hires in March were people returning to the work force after a hiatus, not people actively looking for but unable to find work.  Therefore, they were never included in the computation of the unemployment rate but rather counted as “Not in the Labor Force.”  The Labor Force Participation Rate was 62.8% last month, which is considerably lower than this decade’s average.  The graph below shows that the monthly Labor Force Participation Rate has been declining steadily for years, making it reasonable to assume that some discouraged workers have re-entered the work force in response to better job opportunities.

Labor Force Participation During the Past DeacadeFor some reason, everyone seems to get a boner over unemployment numbers but pay little attention to other relevant metrics .  A strong labor force is absolutely vital for sustainable economic growth, a fact which is summarized nicely in this Calculated Risk article.  Another reason why hints of an expanding labor force are encouraging at this stage is that demographic trends, namely a recent downward trend in the prime working age population, stand solidly in our way of doing so.  That strides can be made now, even with the impediment posed from the demographic trends that will reverse and end up giving us a boost in a few years, paints a more comforting picture of the labor force outlook.

Quick Post on Pricing U.S. T-Bills Using Current Market Data

The data I used for this example came from Barron’s (link below).

http://online.barrons.com/mdc/public/page/9_3021-bondyield.html?mod=mdc_bnd_pglnk

A zero-coupon bond maturing next year on the 4th of February is currently priced at $99.81, which corresponds to a yield of 0.193%.  This is an incredibly low yield, but it is in fact accurate.

T-Bills (treasury securities with maturities of less than a year) are quoted on a simple discount basis, and the time convention used is actual/360.  A discount rate, just like a rate of interest, is a way to measure earnings on an investment.  The difference, from the T-Bill investor’s perspective, is when you are compensated for lending money.  (Remember that bondholders effectively lend money, like a bank, to the bond issuer).  If you were to buy an asset, perhaps a house that appreciated in value you would earn some interest – the difference between the sale price and the purchase price – upon selling it.  You were paid interest at the end of the period.  In terms of cash flow, you spent some money on the house (outflow) and were then repaid upon selling (inflow) plus an additional amount you earned because the price on the sale date was higher than when you bought it (interest compensation).  Similarly, when a bank lends money to consumers, they dish out a principal amount and collect that amount back plus a payment of interest at the end of the term.  A security quoted on a discount basis works the other way: compensation is received if you’re the investor/paid if you’re the borrower up front with the initial investment.  A T-Bill investor buys a security worth a face amount $F on some future data but pays an amount less than $F today – basically, he has already been paid his compensation for investing in the security, and this amount (called the discount) subtracts from the purchase price.  Rather than paying face value and receiving a payment at the end of the term, the investor is compensated by purchasing the bond at a price lower than its par value.

According to Bloomberg, I could buy a $100 coupon bond maturing on 2-4-16 for $99.82.  So if I want to loan the US gov’t $100 for 333 days, I’m compensated by being offered a price of $99.82, lower than the bond’s (numerical) worth.  I’ve earned the difference $100 – $99.82.  This is basically my ‘interest’ earned, it’s just called a discount.  And it’s an inconsequential amount of money because it’s 2015 and that’s the way things are.

The yield is the rate such that when we discount $100 for 333/360 of a year we get the current price of $99.82.  That is, $100*(1-d*(330/360)) = 99.82.  We’re using the fraction of the year 333/360 rather than exponents because TBills are quoted on a simple discount basis.

What happens if the yield rate goes up?  The expression $100*(1-d*(330/360)) will be a smaller value, and thus the current price of the bond will decrease.  This means investors are being compensated more for lending the $100, as evidenced by the widening gap between the par value and current price (i.e. the discount).

Untitled picture

Obviously if you already own a TBill, you don’t want to see interest rates go up because the price of your security goes down.  In the real world, a lot of securities are sold before expiration on the secondary market, and as such you get screwed if the current market price of your TBill is less than what you bought it for.

In summary: Treasury Bills are quoted on a simple discount basis, bond holders want prices to rise/yields to fall, and zero coupon bonds currently yield essentially nothing and are almost certainly negative when adjusted for inflation.

US Equity Market Outlook – Bear Side

Here are a few (very brief) points, summarized from various news clippings, articles, and analyses during the past month,  that might make you nervous about investing in US equities, i.e. the “bear” side of the equation:

Bear Side:

Current valuations suggest only modest gains are feasible in developed equity markets, especially the U.S.:

  • From the Fed in July of 2014: “Valuation metrics in some sectors do appear substantially stretched – particularly those for smaller firms in the social media and biotechnology industries.”

Traditionally safe-ish industries face two issues: they’re priced high relative to the historical norm, and they probably won’t fare well when interest rates rise:
• Yields on 2 and 10 yr treasury increased last month, which hurt high-yielding sectors of equity – utilities, REIT (i.e. proxy sectors)
• Utilities currently at 7% premium, though historically they’ve traded at a large discount (result of flight to quality prob)

Emerging Market equities undervalued compared to U.S. despite more volatility

  • Over the past 10 years, Emerging Markets outperformed the U.S. but with more risk

Fed policy will cause U.S. markets to be more volatile, as seen this year 

  • Data-dependent U.S. Fed Policy contributes to volatility
  • Evidenced by the tens of thousands of people holding their breath to see whether or not Janet Yellen will remove the word “patient” from guidance

Brazil and the Fed are the only two central banks planning to raise rates; elsewhere, equities will be helped by monetary policy 

Summary: Nowhere did I make an alarmist prediction of the collapse of the US equity market, though those are easy to find online during all market conditions if you’re interested. My point is, valuations are, according to most people at least moderately stretched, and equities in the US won’t be supported by expansionary monetary policy going forward.  It might make sense to invest where valuations are cheaper and monetary policy is supportive, which requires taking on more risk. Furthermore, traditionally safe industries look bad and policy normalization will increase volatility everywhere, so taking on (relatively) more risk is unavoidable even domestically.

Fixed Income Investing at the Zero Lower Bound – Throw Away Your Fucking Finance Textbook

There’s a hopelessly confusing mess of information – some grounded in fact, some appearing on Squawk Box and similar shows – about fixed income investing in today’s macro environment.  In this post, I’m not predicting the future or recommending any investment strategy, but instead explaining how and why some government securities did really well in 2014 even though pundits abound cursed them as a surefire way to lose money.  And, I should add, said pundits weren’t really all that stupid in doing so because an oversimplified analysis of the interest rate environment pre-2014 pointed in that direction.

Rates on the U.S. 10 year treasury went down in 2014, from about 3% to 2.17%, despite widespread predictions that monetary policy would inevitably cause rates to increase. If pundits everywhere predicted this, why did the opposite materialize?

Global growth slowed down in 2014, dragging inflation down with it. Greece had another…episode, which reintroduced the possibility of a ‘Grexit’, pushing rates down further. So, by 2014’s end, the 10 year treasury rate had decreased by about 75 basis points, moving in the opposite direction from rates on high-yield debt. In other words, credit spreads widened in 2014, meaning investors demanded more compensation in order to take on credit risk (i.e. lend to corporations via bonds).

Intuitively, widening credit spreads are the result of investors demanding more compensation in exchange for lending to corporations and other risky entities, because they perceive them to be increasingly susceptible to risk in comparison to the U.S. government. Why would this be the case? Usually because the economic outlook isn’t so good – investors fear corporations are less credit-worthy due to their prospects and demand to be compensated accordingly. Furthermore, investors tend to seek the safest securities during times like these – i.e. ‘flight to quality’ occurs – namely U.S. government securities, which pushes down rates. This increases the credit spread, pushing risk free rates further away from rates on other debt.

The scenario described above is why in 2014 the average return on the 10 yr. treasury was about 10% despite the consensus forecast that they would perform poorly. Remember, the price of a bond is inversely related to the rate of interest, which is why the widening credit spread and corresponding decrease in rates pushed up the value of 10 year treasuries held by investors. To see why, think about the discount factor associated with a 10 year treasury at 3.02% versus 2.17%. In the first case (i.e. at the beginning of 2014), a $1000 par value bond is worth $741. When the applicable rate of interest falls to 2.17%, however, the corresponding price is $805.87. Clearly, the value of the 10 year US treasuries was impacted favorably by the decrease in rates, benefitting the investors who held them throughout the year. Moral of the story: interest rates are fucked up and hard to predict, and Squawk Box is almost never right.