The Effect of a Cash Buffer on Returns

Simon Saves over at wrote a fantastic article entitled “Cash Buffer Will Save You In Retirement“. He argues that holding cash (he plans to hold three years worth of expenditure) in addition to investments, means that if the stock market falls you can use the cash buffer rather than being forced to eat into your capital. He illustrates this with an example.  I wanted to look in more detail at what effect holding cash might have and how much it would reduce the chance of running out of money.


My first assumption is that the annual returns in the future will be similar to the past. I have used the UK real returns (i.e. including reinvesting dividends and accounting for inflation) from the Barclay’s Equity Gilt Study. This has 116 years of returns from 1900 to 2015. Rather than just assuming that the returns form a normal distribution, I have sampled from the 116 known returns. This should give a better estimate of the “fat tails” so prevalent in stock market returns. I have not chosen 30 years of sequential returns (as many people like to do) in order to do a larger number of simulations. There is therefore a slightly greater chance of having a fabulous 30 years or an absolutely catastrophic 30 years. However the evidence for auto-correlation in annual returns in the stock market is very weak (i.e. a bad year doesn’t necessarily lead to a good year in the near future) and if each year’s return really is independent of others then that catastrophic 30 year period could be just round the corner!
I’ve assumed that 100% of the investments is in shares and none is in bonds. This might be considered reckless!
I have assumed that the cash buffer has a real return of zero. i.e. it keeps pace with inflation but nothing more.
I’ve assumed transaction costs, taxes etc are zero and that your actual return is the UK real return.

Features of the model

30 year period starting with £500k of capital (stock market investments) and spending £20k pa (4% withdrawal rate).
An additional cash buffer ranging from zero to  5 years of expenditure i.e. from nothing to £100k


Each year
  • Work out the return for that year by randomly picking  a number from the 116 possible returns in the Barclay study.
  • Ideally this growth (and any retained excess from previous years) would be sufficient for our expenditure. Any excess is added to the capital for next year.
  • If there is not enough money in the the capital pot (i.e. it would go below £500k) use the cash buffer to keep it at £500k
  • If the cash buffer runs out, use capital (this will take it below £500k)
  • Pay back money into the cash buffer if the capital exceeds £500k up to the target amount in the buffer
  • Stop iteration if capital falls to zero (This is a failure!)
  • Do the whole process again for each of the 30 years using the new capital  and cash buffer amounts from the end of the previous year.
I then repeated the whole process 10,000 (yes ten thousand!) times to simulate 10,000 possible futures each based on sampling 30 times from the distribution. I also repeated the process for the different cash buffer amounts.

The results

Holding no cash buffer means that there is roughly a 10% chance of failure i.e. running out of money at some point in the  30 year period. Holding a three year cash buffer (£60k in our example) reduces this chance to approximately 1%. You could, of course, argue that I’m not comparing like with like, as in one case I’m starting with £500k and in the other case I effectively have £560k. Rerunning the simulation with a starting capital pot of £560k and no cash buffer gives a failure rate of about 8%. The full results are listed below. Note that the sums of money you could be left with at the end of 30 years are eye-watering. The problem is, that after 30 years the width of the distribution of possible final returns is so wide that the upside is huge.  This seems like a good argument for reducing both  returns and risk by introducing bonds or other less volatile assets.

 Capital remaining after 30 years. All values in £k

Cash Buffer Min. 1st Qu. Median Mean 3rd Qu. Max. s.d. No. of fails
0 Year(s) 0 758 1482 2608 3080 104300 3860 1034
1 Year(s) 0 948 1758 2912 3413 69700 3809 395
2 Year(s) 0 1002 1810 2975 3472 72290 3775 200
3 Year(s) 0 1026 1822 3051 3497 303800 4965 67
4 Year(s) 0 1046 1842 3007 3466 210600 4201 32
5 Year(s) 0 1039 1830 3081 3521 175200 4461 16


Finally this is the R code. Regular readers will know that I’m really only learning R and it’s quite possible the code could be made faster or that I’ve made some huge error. Comments welcome as normal.

mysummary <- function(x){
        s <- as.numeric(summary(x))
        s[7] <- sd(x)
        s[8] <- sum(x <= 0)
        names(s) <-  c("Min." ,   "1st Qu.", "Median" , "Mean"  ,  "3rd Qu.", "Max."  , 
                                          "s.d." ,"No. of fails" )
        round(s, digits = 0)

years <- seq(1900, 2015) 
ret <- c(0.115,-0.035,0.035,0.018,0.123,0.038,0.186,-0.089,0.019,0.109,0.021,-0.015,0,-0.034,-0.005,
         0.169,0.088,0.189,0.114,0.01,-0.304,0.259,0.089,-0.078,0.087, 0.174, -0.004, -0.001)

muret <- mean(ret)
sdret <- sd(ret)

## These are the variables to change

I0 <- 500 ## starting capital
nyrs <- 30 ## Number of years that money needs to last
spend <- 20 ## Annual expenditure
by <- c(0:5) ## buffer as years of expenditure


CBfin <- NULL
Ifin <- NULL
smryI <- NULL
smryCB <- NULL

## ret <- 0.04 For testing only!!

for(k in 1:length(by)){
CB0 <- by[k]*spend
for(j in 1:10000){
        I <- I0
        CB <- CB0
for(i in 1:nyrs){

r <- sample(ret, 1)

## r <- rnorm(1,muret,sdret) ## Alternative way of estimating future return

e <- r*I  ## e = earnings

        I <- I+e-spend
                        CB <- CB-spend
                        I <- I + CB - spend
                        CB <- 0

if((CB < CB0) & (I > I0)){
        CB <- CB+I-I0
        if(CB >= CB0){
                CB <- CB0
                I <- I + CB - CB0

        I <- 0

CBfin[j] <- CB
Ifin[j] <- I


smryI[[k]] <- mysummary(Ifin)
smryCB[[k]] <- mysummary(CBfin)


completesmryI <-"rbind", smryI)
rownames(completesmryI) <- paste(by, "Year(s)")

completesmryCB <-"rbind", smryCB)
rownames(completesmryCB) <- paste(by, "Year(s)")


4 thoughts on “The Effect of a Cash Buffer on Returns

    1. Thanks John. I had increased the cash buffer using excess capital but forgotten to reduce the capital by the same amount. Setting I back to I0 is exactly the right thing to do.

      However I disagree that I haven’t updated the investment unless cash is greater than initial cash. What I haven’t done is updated the investment if it falls in value!!

      Here’s my updated code with comments

      I =spend){
      CB <- CB-spend ### If there isn't use the cash buffer
      I <- I+e ### This is what I forgot. Even though you haven't touched the capital it still needs to change
      I <- I + e + CB – spend ## if all else fails you eat into the capital and exhaust your cash buffer. I'd forgotten to include e in this.
      CB <- 0


      if((CB I0)){ ### Not enough cash in the buffer but excess capital
      CB <- CB+I-I0 ### increase cash buffer by the growth in the capital
      I = CB0){
      CB <- CB0 #### If there is now too much cash in the buffer reinvest the excess
      I <- I + CB – CB0

      Here's the updated table showing the effect of different numbers of years of cash

      Min. 1st Qu. Median Mean 3rd Qu. Max. s.d. No. of fails
      0 Year(s) 0 83 748 1826 2193 53830 3144 2094
      1 Year(s) 0 76 500 1589 1749 53680 3139 2072
      2 Year(s) 0 116 500 1575 1753 84540 3066 1831
      3 Year(s) 0 166 524 1648 1783 83510 3366 1628
      4 Year(s) 0 188 538 1594 1806 85650 3096 1505
      5 Year(s) 0 244 573 1699 1901 144300 3459 1265

      The numbers are a lot worse but the message is the same. Holding no cash means a 21% chance of failure. Holding 5 years cash means a 13% chance of failure. Remember though that this is a 100% equities portfolio invested entirely in the UK stock market.

      Also as you pointed out, I'm not really comparing like with like as holding 5 yrs cash (100k) is an extra 20% wealth. Rerunning the model with a fixed total of 600k with up to 100k of this in cash gives a completely different answer.

      Min. 1st Qu. Median Mean 3rd Qu. Max. s.d. No. of fails
      0 Year(s) 0 298 1185 2518 2939 124100 4383 1353
      1 Year(s) 0 216 732 2019 2337 58070 3594 1433
      2 Year(s) 0 178 599 1786 2035 176200 3618 1549
      3 Year(s) 0 129 480 1505 1654 57860 2800 1747
      4 Year(s) 0 23 379 1070 1110 33270 2118 2350
      5 Year(s) 0 0 161 529 396 55560 1443 3588

      The drag of the cash on performance actually increases the chance of failure from 14% to 36%.

      I'll put the entire updated code in a new blog post


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s