Section 5.3 Time-weighted annual rate of return
Suppose now that we make investments into a fund over time and know the outstanding balance befoer each deposit or withdrawl occurs. Notationally, let B0 be the initial balance in the fund and Bk the balance in the fund immediately before time tk with Wk the amount of each deposit (if negative, then withdrawal). On a time line:
Time0t1t2…tn−1tnBalance Before0B1B2...Bn−1BnDeposit/Withdrawal0W1W2...Wn−1WnBalance AfterB0B1+W1B2+W2...Bn−1+Wn−1Bn+Wn
Theorem 5.3.1. Time Weighted Annual Rate of Return Formula.
The "time-weighted annual rate of return" r is the solution of
(1+r)tn=B1B0⋅B2B1+W1⋅…⋅BnBn−1+Wn−1
Proof.
From the beginning of time, the growth over the first time period is given by \(B_1 = B_0(1+r_1)^{t_1}\) or
\begin{equation*}
\frac{B_1}{B_0} = (1+r_1)^{t_1}\text{.}
\end{equation*}
For subsequent time periods, the growth is given by \(B_{k+1} = B_k(1+r_2)^{t_{k+1}-t_k}\) or
\begin{equation*}
\frac{B_{k+1}}{B_k} = (1+r_2)^{t_{k+1}-t_k}\text{.}
\end{equation*}
Multiplying these together yields
\begin{align*}
\frac{B_1}{B_0} \cdot \frac{B_2}{B_1} ... \cdot \frac{B_n}{B_{n-1}}\\
& = (1+r_1)^{t_1} \cdot (1+r_2)^{t_2-t_1} ... \cdot (1+r_n)^{t_n-t_{n-1}} \\
& = (1+r)^{t_n}
\end{align*}
noting that \(r_k = r\) for all k would allow all of the powers to cancel except for the last. Define the time-weighted annual rate of return to be the value of r that makes this happen.
Example 5.3.2.
Consider the sequence of investments described in the table below:
Time11/1/163/1/178/1/172/1/184/1/18Balance Before$14516$14547$18351$16969$18542Deposit/Withdrawal0$3000−$2000$25000
Then the time-weighted annual effective yield rate is given by
(1+r)17/12=1454714516⋅1835114547+3000⋅1696918351−2000⋅1852416969+2500≈1.035877
and by solving yields r≈0.025193371
xxxxxxxxxx
pretty_print('Time Weighted Annual Rate of Return')
​
def _(n = slider(2,10,1,5,label='Number of Investment Changes')):
head = 'Times BalanceBefore Dep/Withdraw'
def __(M=(head, input_grid(3, n, default = [[0,4/12,9/12,15/12,17/12,4,5,6,7,8,9],[14516,14547,18351,16969,18542,1,1,1,1,1,1],[0,3000,-2000,2500,0,0,0,0,0,0,0]]))):
pretty_print('State of Investments')
times = M[0][0:n]
BalBefore = M[1][0:n]
Inv = M[2][0:n]
A = matrix(QQ,[times,BalBefore,Inv])
show(A)
s=1
for k in range(n-1):
s=s*BalBefore[k+1]/(Inv[k]+BalBefore[k])
​
r = (e^(ln(s)/times[n-1])-1).n()
pretty_print(html('The Dollar-Weighted Rate of Return = %1.6f'%r))