Skip to main content
Erschienen in:
Buchtitelbild

Open Access 2022 | OriginalPaper | Buchkapitel

3. Building a Tontine Simulation in R

verfasst von : Moshe Arye Milevsky

Erschienen in: How to Build a Modern Tontine

Verlag: Springer International Publishing

Aktivieren Sie unsere intelligente Suche, um passende Fachinhalte oder Patente zu finden.

search-config
loading …

Abstract

In this chapter I explain the core of the (basic, version 1.0) modern tontine simulation algorithm and provide R-scripts that can be used to generate forecasted values for what I have called the Modern Tontine (MoTo) Fund.
In this chapter I explain the core of the (basic, version 1.0) modern tontine simulation algorithm and provide R-scripts that can be used to generate forecasted values for what I have called the Modern Tontine (MoTo) Fund. This work will proceed in three separate sections. Section 3.2 will focus exclusively on simulating (projecting, forecasting) the life and death of participants in the modern tontine. Section 3.3 will move on to modelling portfolio investment returns, using a very simple LogNormal model. Then, Sect. 3.4 will combine mortality and returns from the two prior section to simulate (project, forecast) tontine dividends as well as modern tontine fund values. The basic models presented and assumptions made in this chapter will form the basis of more advanced models that will be developed and presented in further chapters. At times, I will distinguish between the fund manager who selects investments and oversees asset allocation for the underlying fund, and the tontine sponsor who is responsible for the dividend and payout policy. They involve different trade-offs, so it helps to keep them separate, even if managed by the same organization or individual.

3.1 On Rates, Yields and Returns

There are 3 key variables (numbers, percentages, rates) that might sound the same—and might be confused at first—but must be kept distinct in our MoTo simulation model. The first variable is the continuously compounded long-term assumed rate of return (ARR) earned by the MoTo, which I’ll label r. This could be (as low as) r = 2% or (as high as) r = 6% or whatever and obviously depends on how the manager plans to invest the underlying assets of the fund. The ARR is critical to setting the initial tontine dividend payout and also for forecasting the tontine dividend payout made to surviving investors. The ARR value is the single most important system-wide parameter, other than perhaps the mortality assumptions. For most of the numerical examples reported, I will assume its r = 4%. This r number is net, which means after all fees, investment charges and management expenses.
The second variable—or more precisely, vector—is the realized investment return (RIR) over time which I’ll denote by r[, j], where the j is an index for the year (or period) after the fund was launched. So, for example, the fund manager might have expected to earn the above-noted r = 4% in the first year of the MoTo, but the realized investment return could have been \(\tilde {r}[,1]=2\%\), and in the second year \(\tilde {r}[,2]=6\%\), and in the third year \(\tilde {r}[,j]=4\%\), etc. So, although the arithmetic (or path integral) average indeed was 4%, the path itself was rocky. I will be simulating many different (vector) paths for \(\tilde {r}_i\), which I’ll describe in Sect. 3.3. Future chapters will describe more advanced simulations.
The third and final rate variable relates to the annual cash-flow distribution to shareholders, which I’ll call the tontine dividend rate (TDR) and denote it by κ i. It denotes the percentage of the fund value that is distributed to all survivors at the end of period i. So, for example, if the MoTo is worth F 7 at the end of year 7, the tontine dividend shared by all survivors would be denoted by κ 7 F 7. And, the tontine dividend payout per survivor would be: \(\frac {\kappa _7 F_7}{GL_7}\), where GL 7 over here represents the number of survivors alive at the very beginning of year 7. The TDR function κ could in theory be changed, updated and revised on an ongoing basis depending on realized investment returns, realized mortality and other (unplanned) business factors. Nevertheless, at time zero, tontine sponsor should have a good idea or sense of what κ i will look like over time.
In fact, if the tontine sponsor wants to maintain and generate stable tontine dividend for survivors, then they must solve for the κ i function endogenously—and not assume it exogenously. In terms of notation, the sequence κ 1 = 7%, κ 2 = 8%, κ 3 = 9%, means they plan in advance to distribute 7% of the mark-to-market value of the fund at the end of the first year, 8% at the end of the second year, 9% in the third year, etc. To be clear in terms of timelines, though, dividends are declared at the start of the year and paid out at the end of the year. For example, the tontine dividend for the i’th year, i ≥ 1 is paid out just before year (i + 1). Of course, this entire model and set-up can be changed to quarters, months or even weeks.
Regardless of timing, I can’t emphasize enough how important it is to understand that κ i must be: (1.) solved for within the model, and (2.) be an increasing function of time, and (3.) must be greater than the assumed rate of return, that is κ i > r. What I’m trying to say is that to maintain and manage the fund equitably for all initial investors, the sponsor can not simply distribute realized deaths plus realized returns and only give that (rather stingy amount) to surviving shareholders. That rule will create a last-man or (most likely) woman standing tontine, instead of the natural tontine with natural payouts in which cash-flows to unit holders are relatively constant over time. In other words, the modern tontine fund is designed to shrink over time by spending longevity (a.k.a. mortality) credits before they are actually earned.

3.2 Life & Death: Known Parameters

The Gompertz Law of mortality, with modal parameter m and dispersion parameter b is at the core of the tontine simulation model, as noted in Chap. 2. The simplest Gompertz-based model of life & death is the following script, which generates a matrix of N=10,000 simulation paths, assuming GL0=1000 initial lives, over a time horizon of TH=30 years.

                  
                    # Binomial Simulation of Gompertz
                  
                  
                    # Parameters are set.
                  
                  
                    x<-65; m<-90; b<-10; GL0<-1000; TH<-30; N<-10000
                  
                  
                    # Placeholders are created.
                  
                  
                    GLIVE<-matrix(nrow=N,ncol=TH)
                  
                  
                    GDEAD<-matrix(nrow=N,ncol=TH)
                  
                  
                    # Loop through N simulations.
                  
                  
                    for (i in 1:N){
                  
                  
                      # Simulate deaths in year 1.
                  
                  
                      GDEAD[i,1]<-rbinom(1,GL0,1-TPXG(x,1,m,b))
                  
                  
                      # Subtract deaths from GL0 to get survivors .
                  
                  
                      GLIVE[i,1]<-GL0-GDEAD[i,1]
                  
                  
                      # Loop through remaining years.
                  
                  
                      for (j in 2:TH){
                  
                  
                        # Simulate deaths.
                  
                  
                        GDEAD[i,j]<-rbinom(1,GLIVE[i,j-1],1-TPXG(x+j-1,1,m,b))
                  
                  
                        # Count survivors.
                  
                  
                        GLIVE[i,j]<-GLIVE[i,j-1]-GDEAD[i,j]
                  
                  
                      }
                  
                  
                    }
                  
                
Running the above-noted script creates two (rather large) matrices called GDEAD and GLIVE, both of which will be used (later on) to determine natural tontine dividends. Notice how the baseline age is set at x = 65, and the Gompertz parameters are assumed to be m=90 and b=10, the initial size of the tontine pool is GL0, and the time horizon is TH. All of these parameters can (and should) be modified to help develop intuition for their effects. You may have noticed that I simulated and calculated the year one numbers separately. The reason I did this is because year one uses the number GL0 as a parameter which does not appear in the GLIVE matrix, since the first column of GLIVE shows the number of survivors at the end of year one.
Note that this was no more than a trivial accounting assumption, to have a matrix begin with the end of the first period, but obviously has implications for the computation of tontine dividends and fund values. The first column you will see in any of the summary matrices should not be interpreted as the initiating value.

                  
                    plot(c(0,30),c(0,1000),type="n",
                  
                  
                         xlab="YEARS after age 65",
                  
                  
                         ylab="Alive at Year-end")
                  
                  
                    title(main="Number of Survivors",
                  
                  
                          sub="(Original Pool Size = 1,000 )")
                  
                  
                    mtext(side=3, line=0.3,
                  
                  
                    "Range: 99th (Highest, Green)  & 1st (Lowest, Red)percentile"
                  
                  
                          ,cex=1.1,font=3)
                  
                  
                    grid(ny=18,lty=20)
                  
                  
                    for (i in 1:30){
                  
                  
                      pct99<-as.numeric(quantile(GLIVE[,i],0.99))
                  
                  
                      pct01<-as.numeric(quantile(GLIVE[,i],0.01))
                  
                  
                      points(i,pct99,col="green",pch=6)
                  
                  
                      points(i,pct01,col="red",pch=2)
                  
                  
                      segments(i,pct01,i,pct99,lwd=2)
                  
                  
                      text(5,400,"Gompertz Mortality",col="blue")
                  
                  
                      text(5,350,"x=65, m=90, b=10",col="blue")
                  
                  
                      text(5,300,"Binomial Simulation",col="blue")
                  
                  
                    }
                  
                
Figure 3.1 displays a 98% confidence interval for the number of deaths within any given year and the number of survivors at the end of the year. The R-script which generated the survivor plot is listed here for convenience. I will not (needlessly) copy-and-paste this basic R-script over and over again every time I display a figure, but the syntax used to generate the equivalent figure for the number of deaths is similar with the GLIVE[i,j] replaced with GDEAD[i,j], and the y-axis rescaled. Notice the key piece of R-code is the quantile(.) function which computes the 99th and 1st percentile and should also be changed for different confidence intervals.
The figure in the bottom panel echoes the TPXG(x,t,m,b) function, where the value of time is increased from zero to 30. If you look closely there is a noticeable spread between the 99th and 1st percentile, which captures the randomness in the number of survivors. Recall that the TPXG(x,t,m,b) function captures the expected number of survivors, when applied to the initial group size GL0. In contrast, the top panel of Fig. 3.1 offers a clearer view of the uncertainty in the number of survivors, by showing the uncertainty in the number of deaths each year.
The phrase Binomial Simulation, which appears in both the script and the figure, is meant to remind users and readers that deaths were generated by drawing from a Binomial random variable for the number of deaths, in which the probability of death is Gompertzian (1-TPXG(x,1,m,b)). So, while the expected number of deaths in any given year is the realized number of survivors at the end of the prior year, times the Gompertz mortality rate, the actual number will be simulated using rbinom(.). Stated differently, and to explain this from another direction, if the initial size of the tontine pool was very (very) large, the bottom panel in Fig. 3.1 would perfectly match the Gompertz survival curve (all percentiles would be the same), and the top panel would resemble the probability density function (pdf) of the Gompertz distribution. Once again, there would be no upper and lower bound.

3.2.1 Doubly Stochastic Death

In some situations the sponsor of the modern tontine fund might be unsure about the exact Gompertz parameters (m, b) to use for forecasts. This chapter and most of what follows takes the Gompertzian view calibrated to an actuarial mortality table. But, sponsors might want to account for health & gender of the initial investors. This then raises the technical problem of which precise values to use for b, and especially for m. While conservative assumptions as well as scenario analysis are the obvious solutions to this dilemma, I would recommend randomizing the values of the two parameters to get a crude sense of the range of outcomes. In this subsection I will demonstrate how to simulate (forecast, project) future lives & deaths while also randomizing the one or both the values of (m, b). I call this a doubly stochastic simulation because the parameters themselves are randomized as well as the number of deaths. Although this shouldn’t be done haphazardly—mostly because of mortality compensation relationships—a simple script that would perform that double-simulation could look something like this:

                    
                      # Doubly Stochastic Gompertz
                    
                    
                      # Set parameters and define placeholders.
                    
                    
                      x<-65; Em<-90; b<-10; GL0<-1000; TH<-30; N<-10000
                    
                    
                      GLIVE<-matrix(nrow=N,ncol=TH)
                    
                    
                      GDEAD<-matrix(nrow=N,ncol=TH)
                    
                    
                      # Loop through N simulations.
                    
                    
                      for (i in 1:N){
                    
                    
                        # Generate a random m value.
                    
                    
                        m<-runif(1,Em-5,Em+5)
                    
                    
                        # Use that m value to simulate year 1 deaths.
                    
                    
                        GDEAD[i,1]<-rbinom(1,GL0,1-TPXG(x,1,m,b))
                    
                    
                        # Count year 1 survivors.
                    
                    
                        GLIVE[i,1]<-GL0-GDEAD[i,1]
                    
                    
                        # Loop through remaining years.
                    
                    
                        for (j in 2:TH){
                    
                    
                          # Generate a random m value.
                    
                    
                          m<-runif(1,Em-5,Em+5)
                    
                    
                          # Use that m value to simulate deaths in that year.
                    
                    
                          GDEAD[i,j]<-rbinom(1,GLIVE[i,j-1],1-TPXG(x+j-1,1,m,b))
                    
                    
                          # Count the survivors.
                    
                    
                          GLIVE[i,j]<-GLIVE[i,j-1]-GDEAD[i,j]
                    
                    
                        }
                    
                    
                      }
                    
                  
If you look closely at the script and compare with the earlier one labelled the Binomial simulation, the important difference is the extra line m<-runif(1,Em-5,Em+5). Notice the fixed expected modal value, denoted by Em=90, but the simulated actual (to be used) value of m using a uniform distribution in a ten year range. In other words, the m that I used to generate the random number of death is itself simulated with a random value of m that is uniformly distributed between (85, 95). This is doubly stochastic, and perhaps even excessively random. Why excessive? Well, it’s unlikely that over a 30 year horizon the underlying value of m will fluctuate from year-to-year. If you believe that the Gompertz assumption itself is problematic, it won’t be fixed by randomizing m or b. This might sound cryptic, and I will return to more sophisticated models of mortality and longevity in Chap. 7.
Figure 3.2 should be compared with Fig. 3.1. They both display the projected number of people that will die (top panel), from an initial group of GL0=1000, as well as the projected number of survivors (bottom panel), assuming a Gompertz law of mortality. But Fig. 3.2 contains that extra noted amount of randomness.
The key qualitative takeaway is rather obvious, namely that it’s harder to predict—and there are wider bands for—the number of deaths in any given year, although the midpoint (or average) is the same in both Figs. 3.2 and 3.1. I should emphasize (again) the rather simplistic nature of my doubly stochastic simulation, in that I have assumed independence of (random) m values from year to year, and no uncertainty in b, as well as no noticeable or meaningful trend in either m or b over time. All of this will (eventually) be re-examined and questioned to see if-and-how a richer model of life & death might change economic results. Remember, the objective of this simulation exercise isn’t to generate demographic or population forecasts. On those two dimensions, Gompertz would fail. Rather, the point is to see if the tontine dividend payouts and the risk to the tontine sponsor changes in any significant way if, for example, mortality is lower/higher in the first few year, or if mortality plateaus at some advanced age, etc.

3.3 Investment Returns

As I noted in the introductory remarks, there are three critical numbers that all sound like rates (yields, returns) that are baked into a modern tontine fund, and one must be very careful not to confuse them with each other. In this subsection I will explain how to simulate (simple) random values for the realized investment return, which I labelled r i.
Intuitively, the assumed rate of return used to construct and engineer the modern tontine, r, is the average of the expected realized returns, denoted by r i. So, for starters, I will assume that returns are LogNormally distributed, that is their logarithm is Normally distributed with a mean value EXR and standard deviation SDR. So, while I will keep r distinct from EXR for expositional purposes, they really should be the same. In the following script, the mean is assumed to be 4% and the standard deviation is 3%. Future chapters, and in particular #6 will revisit this rather stale assumption and take our investments into the (non-parametric) twenty-first century.

                  
                    # Simulated LogNormal Returns
                  
                  
                    # Set base parameters.
                  
                  
                    EXR<-0.04; SDR<-0.03; TH<-30; N<-10000
                  
                  
                    # Define placeholders.
                  
                  
                    PORET<-matrix(nrow=N,ncol=TH)
                  
                  
                    STPRV<-matrix(nrow=N,ncol=TH)
                  
                  
                    # Simulate N paths of TH returns.
                  
                  
                    for (i in 1:N){
                  
                  
                      PORET[i,]<-exp(rnorm(TH,EXR,SDR))-1
                  
                  
                      }
                  
                  
                    # Calculate stochastic present value.
                  
                  
                    for (i in 1:N){
                  
                  
                      for (j in 1:TH){
                  
                  
                        STPRV[i,j]<-prod(PORET[i,1:j]+1)^(-1)
                  
                  
                      }
                  
                  
                    }
                  
                
Notice how the script generates a new matrix PORET as well as a sister matrix STPRV, which are abbreviations for portfolio returns and stochastic present values. Without any loss of generality, I could have assumed SDR=0 and the above script would represent a (very cumbersome and long) way of setting every entry in the PORET matrix equal to exactly e 0.04 − 1, which is an effective annual rate of: 4.0811%. The STPRV value would be (1.04811)j, which is obviously the present value of a dollar to be received at the end of year j. Once again, more sophisticated and advanced models for PORET will be described in Chap. 6.
I remind readers that it’s best to think of and express the EXR number as the expected continuously compounded investment return, which was very carefully explained in Chap. 2, and is often described as the geometric mean investment return, which is smaller than the arithmetic mean investment return. Indeed, when SDR=0, both means exactly the same. But, as the value of SDR increases—a number that is often denoted by the Greek letter σ—the geometric and arithmetic mean will diverge from each other. You can confirm this to yourself by comparing mean(PORET)+1, which is closer to the arithmetic, versus exp(mean(log(PORET+1))) which is geometric.
Figure 3.3 displays the output of one particular simulation run in which (as mentioned) the expected CC-IR is: EXR=0.04, the standard deviation (or σ) is SDR=0.03, the number of periods is TH = 30 years, and the total number of scenarios is \(N=10,\!000\). The top panel of Fig. 3.3 is rather boring and uninformative. Every year the 98% confidence interval ranges from close to negative 3% to over 11%. Losses are indeed possible and the fund value could decline (absent payouts), but it’s unlikely. After all, the number zero is over 1.3 standard deviations away from 4%, and in a normal distribution 90% of outcomes would fall above zero. And, although Fig. 3.3 is LogNormal, the differences are minor. Finally, the bottom panel of Fig. 3.3 should be interpreted as the present value curve with the dispersion representing the variation of year-by-year returns. The critical role of PORET in driving the fund values over time should be obvious.

3.4 Dividend & Fund Values

3.4.1 Temporary Life Income Annuities

Before I explain how to combine the GLIVE investor survivor matrix and the PORET investment return matrix to compute natural tontine dividends and fund values, I will (re)define the value of a temporary life income annuity in discrete time as follows:

                    
                      # Temporary Life Income Annuity
                    
                    
                      TLIA<-function(x,y,r,m,b){
                    
                    
                        APV<-function(t){exp(-r*t)*TPXG(x,t,m,b)}
                    
                    
                        sum(APV(1:(y-x)))
                    
                    
                      }
                    
                  
Note how I use the sum function to add-up the actuarial present value APV, which is the product of the Gompertz survival rates and constant interest discount rates. Both of those (i.e. mortality and interest) will be modified in later chapters. Moreover, the summation begins at one year (or period)—because payments begin at the end of the period/year—and conclude at time (y-x), which is the end of the temporary period. Needless to say, that can be at the very end of the mortality table and lifespan. So, the TLIA function is just a generalized and standard expression for valuing any-and-all income annuities.

                    
                      TLIA(65,105,0.04,90,10)
                    
                    
                      > 13.23439
                    
                    
                      TLIA(65,100,0.04,90,10)
                    
                    
                      > 13.20022
                    
                    
                      TLIA(65,95,0.04,90,10)
                    
                    
                      > 13.03634
                    
                  
The value (or zero commission cost) of $1 income annuity purchased at age x = 65 would range from $13.04 to $13.23, depending on whether payments terminate at age y = 95, y = 100 or y = 105. The TLIA function and its reciprocal yield value will be used to determine the natural dividend payout rate, which early on here I called κ i. In particular, the (reciprocal) yield will be used and referenced in the R-script.

                    
                      1/TLIA(65,105,0.04,90,10)
                    
                    
                      > 0.07556072
                    
                    
                      1/TLIA(65,100,0.04,90,10)
                    
                    
                      > 0.07575632
                    
                    
                      1/TLIA(65,95,0.04,90,10)
                    
                    
                      > 0.07670865
                    
                  
So, for example, a 65-year-old who buys a temporary income annuity to age 95, would be entitled to a yield of 7.67%. An initial premium or investment of \(\$100,\!000\) would entitle the annuitant to $7 , 671 yearly, until age y = 95, at which point all payments would terminate. This number TLIA and rate κ will make many appearances in the next few pages. Notice that extending the temporary age to y = 105, or even y = 110 won’t make much of a difference to (i.e. and won’t reduce) the yield, which is why the simulations (in the basic core model) will terminate after TH=30 years.

3.4.2 A Perfect Fund Value Over Time

We now arrive at the core section (of this core chapter) which explains how to simulate modern tontine fund values, using the random returns and random lifetimes generated in the prior sections. The process is recursive in the sense that the algorithm begins with an initial modern tontine fund value DETFV at time zero, equal to the initial investment f0 (reported in thousands of dollars) multiplied by the initial number of live investors GL0. The time-zero fund value: f0*GL0 is increased by investment returns during the year, and then reduced by tontine dividend payouts TONDV to survivors at the end of the year. That then becomes the new tontine fund value, and the process continues again for the second year, etc.
Given the centrality of this particular script to the core simulation of the tontine, in the next few pages I will provide three distinct (but similar) versions of the R-script for generating the DETFV as well as the TONDV matrix. The first script doesn’t really represent a true tontine fund but is better described as an annuity fund in which dividend payouts are rigidly fixed at some pre-determined value kappa*f0. The payout is maintained at that fixed dollar level for all TH=30 years, but the annual investment returns credit to the fund are fixed at r and the deaths are deterministic according to the Gompertz survival curve. In other words, there is absolutely no uncertainty in this R-script. Nothing is random. All is deterministic.
I urge readers and users to review this R-script line-by-line very carefully to ensure a proper and careful understanding of how the updating and revision mechanism is reflected in DETFV[i,j] as well TONDV[i,j]. Critically, notice how the value of κ is fixed once at the very beginning of the simulations, which means that the TONDV matrix is identical at all times and in all scenarios. I am resetting its value (thousands of times, again and again) to the same value. The reason for that (waste in computational time) is that it allows me to make only minor changes to the script later on, when I get to the proper Modern Tontine (MoTo) simulation.

                    
                      # Perfect Annuity Fund: Fixed Returns & Deterministic Deaths
                    
                    
                      # Parameters are set.
                    
                    
                      x<-65; r<-0.04; m<-90; b<-10; TH<-30; N<-10000;
                    
                    
                      GL0<-1000; f0<-100;
                    
                    
                      # Placeholders are defined.
                    
                    
                      DETFV<-matrix(nrow=N,ncol=TH)
                    
                    
                      TONDV<-matrix(nrow=N,ncol=TH)
                    
                    
                      # Define single kappa value.
                    
                    
                      kappa<-1/TLIA(x,x+TH,r,m,b)
                    
                    
                      for (i in 1:N){
                    
                    
                        # Dividend and fund value at end of year 1.
                    
                    
                        TONDV[i,1]<-kappa*f0
                    
                    
                        DETFV[i,1]<-f0*GL0*exp(r)-TONDV[i,1]*GL0*TPXG(x,1,m,b)
                    
                    
                        for (j in 2:TH){
                    
                    
                          # Dividend and fund value at end of year j.
                    
                    
                          TONDV[i,j]<-kappa*f0
                    
                    
                          # The next two lines should be combined as one.
                    
                    
                          DETFV[i,j]<-DETFV[i,j-1]*exp(r)
                    
                    
                          -TONDV[i,j]*GL0*TPXG(x,j,m,b)
                    
                    
                        }
                    
                    
                      }
                    
                  
I have denoted this artificial situation the perfect annuity fund case, because it leads to constant fixed (annuity) dividends of kappa*f0 every single year, and the fund value will terminate or mature after TH=30 years at exactly a value of zero. Basically, I have replicated a temporary life income annuity which can be confirmed with the following numerical values of the fund (or reserves supporting the annuity) at the end of various years.

                    
                      > round(summary(DETFV[,30])/1000,3)
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                            0       0       0       0       0       0
                    
                    
                      > round(summary(DETFV[,29])/1000,3)
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        1.538   1.538   1.538   1.538   1.538   1.538
                    
                    
                      > round(summary(DETFV[,28])/1000,3)
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        3.278   3.278   3.278   3.278   3.278   3.278
                    
                    
                      > round(summary(DETFV[,27])/1000,3)
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        5.224   5.224   5.224   5.224   5.224   5.224
                    
                  
As one moves backward in time, from the terminal TH=30 to the prior year 29, 28, etc, the fund value will continue to reverse-shrink (grow) and eventually lead to the original $100 million fund value at time zero, which is the $100,000 investment times the 1000 investors. Note also that the simulation is conducted in units of thousands, and I have divided the value of DETFV[i,j] in the above script by a further 1000 so that the reported numbers are in millions. I have also rounded the numbers to include only three significant digits. And, since this is most definitely not a simulation, you (the user) should get the exact same results I do!
The perfect annuity fund will be worth zero million dollars in the final year, 1.54 million dollars in the 29th year, 3.28 in the 28th year, etc. Figure 3.4 displays those values graphically, which should further confirm the intuition of the perfect annuity fund. For the record, this isn’t a tontine. This is an annuity. In the next subsection I will randomize deaths and randomize returns, in other words I’ll import the PORET and GLIVE matrix, and this perfect picture will disappear.

3.4.3 Fixed Rules in a Variable World

In the next bit of R-script, which is the second of three simulation scripts for the fund itself, I have made two small changes to the algorithm but which have a significant impact on results. Please review the script carefully—compare with the prior perfect annuity fund case—and you will see that the (random) investment return (1+PORET) matrix has now replaced the constant exp(r) value, and the actual (random) number of survivors GLIVE has replaced the estimate based on TPXG.
This introduces two sources of randomness—and we finally have a proper simulation—but notice that dividend payout rule reflected in TONDV is still very much fixed and rigid. This still isn’t a modern or natural tontine. Rather, it’s a very reckless way to manage the liabilities generated by selling temporary income annuities. You will understand why it’s reckless once you see the results.
Before running this script make sure to run the Binomial Simulation of Gompertz script (included below) so that you are using the regular GLIVE matrix and not the Doubly Stochastic one. You should also already have the PORET matrix loaded from running the Simulated LogNormal Returns script.

                    
                      # Redefine GLIVE.
                    
                    
                      x<-65; m<-90; b<-10; GL0<-1000; TH<-30; N<-10000;
                    
                    
                      GLIVE<-matrix(nrow=N,ncol=TH);GDEAD<-matrix(nrow=N,ncol=TH)
                    
                    
                      for (i in 1:N){
                    
                    
                        GDEAD[i,1]<-rbinom(1,GL0,1-TPXG(x,1,m,b))
                    
                    
                        GLIVE[i,1]<-GL0-GDEAD[i,1]
                    
                    
                        for (j in 2:TH){
                    
                    
                          GDEAD[i,j]<-rbinom(1,GLIVE[i,j-1],1-TPXG(x+j-1,1, m,b))
                    
                    
                          GLIVE[i,j]<-GLIVE[i,j-1]-GDEAD[i,j]}}
                    
                  

                    
                      # Annuity Replication: Stochastic Returns and Deaths
                    
                    
                      # Parameters are set.
                    
                    
                      x<-65; r<-0.04; m<-90; b<-10; TH<-30; N<-10000;
                    
                    
                      GL0<-1000; f0<-100;
                    
                    
                      # Placeholders are defined.
                    
                    
                      DETFV<-matrix(nrow=N,ncol=TH)
                    
                    
                      TONDV<-matrix(nrow=N,ncol=TH)
                    
                    
                      # Define single kappa value.
                    
                    
                      kappa<-1/TLIA(x,x+TH,r,m,b)
                    
                    
                      for (i in 1:N){
                    
                    
                        # Dividend and fund value at end of year 1.
                    
                    
                        TONDV[i,1]<-kappa*f0
                    
                    
                        DETFV[i,1]<-f0*GL0*(1+PORET[i,1])-TONDV[i,1] *GLIVE[i,1]
                    
                    
                        for (j in 2:TH){
                    
                    
                          # Dividend and fund value at end of year j.
                    
                    
                          TONDV[i,j]<-kappa*f0
                    
                    
                          # The next two lines should be combined.
                    
                    
                          DETFV[i,j]<-DETFV[i,j-1]*(1+PORET[i,j])
                    
                    
                          -TONDV[i,j]*GLIVE[i,j]
                    
                    
                        }
                    
                    
                      }
                    
                  
Every year the sponsor will extract or withdraw or redeem exactly kappa*f0 (in thousands of dollars) times the number of survivors, regardless of the actual investment performance or the actual number of survivors. The fund value could (theoretically) collapse and everyone could still be alive, and the payout rule is blindly followed. That is a recipe for disaster and the reported numbers reflect the problems with such a strategy. Notice the large probability this fund will hit zero (get ruined) and fall into a deficit situation. Reviewing the numbers in the following script the median fund value is negative in the 30th year, and there is at least a 25% chance the fund has a deficit of $16.8 million. In year 25 the 1st quartile is negative, and in year 15 the worst case scenario has a deficit of $0.36 million.

                    
                      > summary(DETFV[,30])/1000
                    
                    
                          Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
                    
                    
                      -82.2616 -16.8075  -0.8042   0.8374  16.4262 124.6543
                    
                    
                      > summary(DETFV[,25])/1000
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                      -60.123  -4.029   9.064  10.430  23.182 117.246
                    
                    
                      > summary(DETFV[,20])/1000
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                       -27.79   13.25   23.86   24.90   35.39  105.06
                    
                    
                      > summary(DETFV[,15])/1000
                    
                    
                          Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
                    
                    
                       -0.3617  33.4796  42.0511  42.9000  51.4952 104.1820
                    
                  
Figure 3.5 tells the exact same (scary) story, and by year 19 there is a non-trivial (>1%) chance the fund gets ruined. The reason for all this negativity lies in the rule driving the TONDV calculation. Again, the TONDV is rigid, fixed and doesn’t adjust to the fluctuating nature of investment returns and realized mortality. That’s not a tontine. Think back to the bottom corner of the triangle at the beginning of Chap. 2.
In some sense, this is the essence of tontine thinking. An optimized fund adjusts the yearly payout so that in times when the fund is showing a loss—relative to the above mentioned perfect value—the sponsor reduces tontine dividend. In years when the fund is doing better than expected, the dividends are increased. On average, the tontine dividends will be similar to the fixed and rigid payout rule, but the ability to modulate payouts (like a thermostat) will keep the fund solvent. A natural tontine dividend rule goes beyond making TONDV flexible or adapted to returns; it makes them equitable for all participants as well as safe for the sponsor.

3.4.4 The Natural Tontine Rule

This brings me to the third and final (for this chapter) fund simulation script, which adjusts the tontine dividend TONDV by the realized investment returns reflected within the PORET matrix as well as the realized survivors as reflected in the GLIVE matrix. At its essence, the algorithm adjusts the next period’s annuity income the survivors would be able to afford given the current level of assets, by dividing into the relevant annuity factor TLIA at that age.
This 15-line script is the essence (or secret sauce) of the Modern Tontine (MoTo) fund, and the dividends are thus natural. It tries to maintain a constant tontine dividend profile, but adjusts up and down depending on circumstances. In the language of Actuarial Science 101, annuity payouts are adjusted to fit the updated annuity reserves. That’s an explanation of the natural tontine, while standing on one-foot and the rest is implementation. Of course, there is a chance this fund hits zero (at least theoretically) in which case the dividends will be terminated. In practice though, the structure of the thermostat is such that the tontine dividends would have been reduced long before the fund itself reaches such distressful levels. If you want, you can actually count the number of values at or below zero in either DETFV or TONDV matrix, but you likely won’t find any.

                    
                      # The Natural Tontine: Stochastic Returns and Deaths
                    
                    
                      # Parameters are set.
                    
                    
                      x<-65; r<-0.04; m<-90; b<-10; TH<-30; N<-10000;
                    
                    
                      GL0<-1000; f0<-100
                    
                    
                      # Placeholders are defined.
                    
                    
                      DETFV<-matrix(nrow=N,ncol=TH)
                    
                    
                      TONDV<-matrix(nrow=N,ncol=TH)
                    
                    
                      # Vector of kappa values.
                    
                    
                      kappa<-c()
                    
                    
                      for (i in 1:TH){kappa[i]<-1/TLIA(x+i-1,x+TH,r,m,b)}
                    
                    
                      for (i in 1:N){
                    
                    
                        # Dividend and fund value at end of year 1.
                    
                    
                        TONDV[i,1]<-kappa[1]*f0
                    
                    
                        DETFV[i,1]<-f0*GL0*(1+PORET[i,1])-TONDV[i,1] *GLIVE[i,1]
                    
                    
                        for (j in 2:TH){
                    
                    
                          # Dividend and fund value at end of year j.
                    
                    
                          TONDV[i,j]<-kappa[j]*DETFV[i,j-1]/GLIVE[i,j-1]
                    
                    
                          # The next two lines should be combined as one.
                    
                    
                          DETFV[i,j]<-max(DETFV[i,j-1]*(1+PORET[i,j])
                    
                    
                          -TONDV[i,j]*GLIVE[i,j],0)
                    
                    
                          }
                    
                    
                        }
                    
                  
Although the above script is based on the N=10000 scenarios I would urge (new) readers to gain further intuition and start by setting N=1 and manually trace thru the DETFV and TONDV vector year by year, so you understand how the fund value changes in response to investment returns PORAT[1,] and deaths GDEAD[1,]. Using the full N=10000 results generated, let us examine the tontine fund values towards the end of the tontine’s life. Once again, the results are reported in thousands, so I have divided the summary(.) by 1000 and the numbers are in $ millions.

                    
                      > summary(DETFV[,30])/1000
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                      0.00000 0.00000 0.00000 0.02609 0.04192 0.29884
                    
                    
                      > summary(DETFV[,25])/1000
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        4.682   8.640   9.703   9.830  10.866  18.949
                    
                    
                      > summary(DETFV[,20])/1000
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        13.53   21.96   24.32   24.53   26.81   43.10
                    
                  
Notice how the final DETFV[,30] value of the fund is nearly a perfect zero, and as one goes backwards in time (from age 95 to age 65), the fund value grows. In the 25th year of the fund, its value is between $4.68 million and $18.9 million. And, in its 20th year (when survivors are 85 years old), the tontine fund value is worth between $13.5 million and $43.1 million. These numbers and the general pattern are reflected in Fig. 3.6. Without exaggerating, these last 2-3 pages are the core of all future simulations, models and extensions.
Make sure you understand how the kappa[] vector is used to determine dividends, and how it might result in higher/lower values compared to kappa[1]. The tontine dividends themselves (in thousands of dollars) are not fixed and can fluctuate from year to year. Rather, what is determined in advance is the κ i rate used to compute those tontine dividends. It’s the reciprocal of the income annuity factor applicable at the relevant age (x + i). So, if the fund randomly happens to be worth $50 million in year i = 13, and there randomly happens to be 780 survivors at age 78, then in that scenario next year’s natural tontine dividend would be set at \((50,\!000,\!000/780)/8.161=\$7,\!855\). The number 8.161 is the value of TLIA(78,95,0.04,90,10). It represents the annuity 780 survivors could afford at age 78, if they annuitize their fund value.
Let’s focus on those dividends carefully and in more detail. Figure 3.7 displays the usual 98% confidence interval, with the 1% “worst” case and the 99% “best” case, assuming all the parameter values and structure noted earlier. Notice how the cone of uncertainty in the tontine dividend increases over time, although the expected midpoint is stable around the initially determined $7, 671 per year. At the very end of the TH=30 time horizon the range is quite wide but is comfortably north of $4, 500 even in the worst case scenario.
The following set of values are the standard simulation summaries for the tontine dividends in the 1st, 10th, 20th, 25th and 30th year. Notice how the mean value remains in the range of $7 , 600 − $7 , 700 until year 20 (or age 85), after which it increases just slightly. This trend reflects a built-in skew in the underlying return mechanism, which tilts towards higher tontine dividends over time. In fact, one could legitimately claim that the 3rd quartile payments (read: the good scenarios) trend upwards over time. Although one must also be careful to note the extreme volatility in payment that might be observed once the number of survivors (from the initial 1000) reaches the teens and single digits.

                    
                      > summary(TONDV[,1])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        7.671   7.671   7.671   7.671   7.671   7.671
                    
                    
                      > summary(TONDV[,10])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        5.213   7.159   7.656   7.686   8.168  11.051
                    
                    
                      > summary(TONDV[,20])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        4.216   6.918   7.647   7.723   8.440  14.022
                    
                    
                      > summary(TONDV[,25])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        3.656   6.803   7.639   7.745   8.578  15.473
                    
                    
                      > summary(TONDV[,30])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        3.190   6.578   7.625   7.791   8.784  17.654
                    
                  

3.4.5 The Cumulative Payout

One final dataset I would like to define is the cumulative tontine dividends received by survivors: TCPAY. It’s reported in thousands of dollars and grows (i.e. never declines) over time, as new tontine dividends are paid out. This matrix helps us answer the question: Do investors get their money back? The construction is rather trivial, using cumsum() and the next paragraph offers a simple numerical example.

                    
                      TCPAY<-matrix(nrow=N,ncol=TH)
                    
                    
                      for (i in 1:N){
                    
                    
                      TCPAY[i,]<-cumsum(TONDV[i,])}
                    
                    
                      >   summary(TCPAY[,30])
                    
                    
                         Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
                    
                    
                        153.8   214.6   230.0   231.4   246.6   353.5
                    
                  
If you happen to survive for the entire 30 years (from age 65 to 95) the median cumulative payout in this particular simulation run would have been $230 thousand dollars. Obviously, if-and-when you generate your own simulation you will get (slightly) different values, but they shouldn’t differ too much from mine. Here’s how to interpret. If you survived for the entire horizon, your original investment of \(\$100,\!000\) would have generated a total (median) cash-flow of \(\$230,\!000\), with 3rd quartile of $246, 600. This sum is almost two and a half times what you invested at age 65, although it shouldn’t be interpreted as a rate of return since it’s not adjusted for the time value of money, but it could be using the STPRV matrix generated earlier in the chapter.
Finally, Fig. 3.8 displays the TCPAY data graphically, and in particular the point in time at which the original $100,000 is returned to the tontine investors. This takes place sometime between year 12 and year 15. At this point the TCPAY number is just an interesting curiosity or side-product of the calculation. In a later chapter I will return to this number (and concept) when I discuss death benefits in Chap. 5.

3.5 Conclusion and What’s Next

At this point in the (basic) tontine simulation there should be a total of seven distinct data matrices in your R-studio environment. They are: GLIVE and GDEAD, which are the number of surviving investors at the end of the year and deaths during the year, assuming the Gompertz law with parameters (m, b), both of which could also be randomized. The matrices PORET and STPRV capture the randomized annual investment returns, and the present value of a $1 payment assuming the individual path of returns. Finally, the matrices TONDV, TCPAY and DETFV combine the random investment returns and the random deaths to compute the tontine dividends, total cumulative payments and the actual tontine fund value, at the end of each of the TH years, all for each of the N simulated scenarios. If you are keeping track of space and memory, with N = 10, 000 scenario paths, and TH  = 30 years, there are a total of 300,000 data points per matrix.

3.6 Test Yourself

1.
Investigate the impact of changing the Gompertz (m, b) assumptions, in the baseline 4% case. In other words, assume the m = 95 (in all scenarios) or that m = 85 (in all scenarios) and discuss the qualitative difference in the tontine dividends TONDV and the modern tontine fund DETFV values.
 
2.
Instead of the 4% assumption for both r and EXR, please generate simulation results assuming a more conservative 3% return, with a 1% standard deviation, and a more aggressive 5% return, with a 4% standard deviation. In particular, focus on the TONDV matrix and create a summary table of the range of tontine dividend payout in years 10, 20 and 30, with a 50% confidence interval. In other words, compute the first and third quartile at those dates. Explain and comment on the results, and remember that EXR=r.
 
3.
Going back to the r = 4% case, focus on the TCPAY matrix and plot the distribution of the time at which investors get their money back. Remember, there are 10,000 scenarios embedded within TCPAY, and the objective of this question is to get a sense of the times (and ages) at which investors are “made whole” assuming they are still alive.
 
4.
Focus on the GLIVE matrix and the TCPAY matrix and please use those two datasets to compute the number of original investors GL0, who when they died, did not get their full money back. In other words, the sum of the tontine dividends they received until their death didn’t exceed their original investment. Remember that people who die in year i aren’t entitled to any tontine dividends in that year. Once you have figured this out, compute the number of investors who got less than 80% back, less than 60% back and less than 40%, by the time they died.
 
5.
Modify the basic simulation so dividends are paid quarterly, and generate results assuming the same Gompertz: m = 90, b = 10, and r = 4% case. Be very careful when you modify the code (and increase the size of all the matrices) that your returns and payouts are properly adjusted. For example, the 3-month survival probability and investment return is obviously quite different from the 12-month values. Once you are done, confirm the TCPAY values after 10, 20 and 30 years are virtually the same.
 
Open Access This chapter is licensed under the terms of the Creative Commons Attribution 4.0 International License (http://​creativecommons.​org/​licenses/​by/​4.​0/​), which permits use, sharing, adaptation, distribution and reproduction in any medium or format, as long as you give appropriate credit to the original author(s) and the source, provide a link to the Creative Commons license and indicate if changes were made.
The images or other third party material in this chapter are included in the chapter's Creative Commons license, unless indicated otherwise in a credit line to the material. If material is not included in the chapter's Creative Commons license and your intended use is not permitted by statutory regulation or exceeds the permitted use, you will need to obtain permission directly from the copyright holder.
Metadaten
Titel
Building a Tontine Simulation in R
verfasst von
Moshe Arye Milevsky
Copyright-Jahr
2022
DOI
https://doi.org/10.1007/978-3-031-00928-0_3