Arithmetic progression annuity

An arithmetic progression annuity (or arithmetic gradient annuity) is a type of annuity where payments either increase or decrease by a fixed amount each period. This contrasts with a standard annuity, where payments remain constant over time. In this post, we'll explore the formulas for an arithmetic progression annuity and build a cash flow model to help illustrate how it works.


Contents:

  1. Key features
  2. Present value formula
  3. Future value formula
  4. Modelling example

Key features

An arithmetic progression annuity has the following key features:

  • Initial payment - the first payment, typically denoted \( P \), is a fixed amount.
  • Constant change - each subsequent payment increases or decreases by a fixed amount \( g \) (the gradient).
  • Term - the total number of payments, \( n \).
  • Interest rate - the discounting or accumulation is based on an interest rate \( i \) per period.

These features are fundamental for calculating both the present and future values of an arithmetic progression annuity.

Present value formula

The present value of an arithmetic progression annuity can be calculated as the sum of two components:

  1. The level annuity - the present value of constant payments \( P \) over \( n \) periods, discounted at rate \( i \).
  2. The gradient component - the present value of the incremental (or decremental) payments, represented by the gradient \( g \).

The formula for calculating the present value is as follows:

\[ PV = P \cdot \frac{1 - (1+i)^{-n}}{i} + g \cdot \frac{\frac{1 - (1+i)^{-n}}{i} - n \cdot (1+i)^{-n}}{i} \]

Where:
- \( P \) is the initial payment,
- \( g \) is the gradient,
- \( n \) is the number of periods,
- \( i \) is the interest rate.

This formula captures the time value of money for both the fixed and changing payment components.

Future value formula

The future value of an arithmetic progression annuity represents the total accumulated value at the end of \( n \) periods. It consists of two components:

  1. The level annuity - the accumulated value of constant payments \( P \) over \( n \) periods.
  2. The gradient component - the accumulated value of the incremental payments, represented by the gradient \( g \).

The formula is given by:

\[ FV = P \cdot \frac{(1+i)^n - 1}{i} + g \cdot \frac{\frac{(1+i)^n - 1}{i} - n}{i} \]

Where:
- \( P \) is the initial payment,
- \( g \) is the gradient,
- \( n \) is the number of periods,
- \( i \) is the interest rate.

This formula accounts for the compounding effect of both the fixed and changing payments over time.

Modelling example

Let's apply our understanding of arithmetic progression annuities with an example. Assume the following parameters:

  • \( P = 100 \) (initial payment)
  • \( g = 5 \) (gradient or constant increase)
  • \( n = 12 \) (term in periods)
  • \( i = 3\% \) (interest rate per period)

Using the formulas derived earlier, we can calculate the present and future values:

\[ PV = 100 \cdot \frac{1 - (1+0.03)^{-12}}{0.03} + 5 \cdot \frac{\frac{1 - (1+0.03)^{-12}}{0.03} - 12 \cdot (1+0.03)^{-12}}{0.03} = 1251.64 \] \[ FV = 100 \cdot \frac{(1+0.03)^{12} - 1}{0.03} + 5 \cdot \frac{\frac{(1+0.03)^{12} - 1}{0.03} - 12}{0.03} = 1784.54 \]

Now, let's replicate these calculations using a Python cash flow model built with the cashflower package.

# input.py
from cashflower import ModelPointSet
import pandas as pd

annuity = ModelPointSet(data=pd.DataFrame({
    "initial_payment": [100],
    "gradient": [5],
    "term": [12]
}))

assumption = {
    "interest_rate": 0.03
}

Here, we define an annuity with an initial payment of 100, a gradient of 5 over 12 periods, and an interest rate of 3%.

# model.py
from cashflower import variable
from input import assumption, annuity
from settings import settings

@variable()
def payment(t):
    if t == 1:
        return annuity.get("initial_payment")
    elif 1 < t <= annuity.get("term"):
        return payment(t-1) + annuity.get("gradient")
    else:
        return 0

@variable()
def present_value(t):
    if t == settings["T_MAX_CALCULATION"]:
        return payment(t)
    else:
        return present_value(t+1) * (1/(1+assumption["interest_rate"])) + payment(t)

@variable()
def future_value(t):
    if t == 0:
        return payment(t)
    else:
        return future_value(t-1) * (1 + assumption["interest_rate"]) + payment(t)

In this model, we define three key variables:

  • payment(t) - calculates the payment at time \( t \).
  • present_value(t) - recursively computes the present value at time \( t \).
  • future_value(t) - recursively computes the future value at time \( t \).

The resulting cash flow model produces the following table:

# output
 t  payment  future_value  present_value
 0     0.00          0.00        1251.64
 1   100.00        100.00        1289.19
 2   105.00        208.00        1224.87
 3   110.00        324.24        1153.46
 4   115.00        448.97        1074.77
 5   120.00        582.44         988.56
 6   125.00        724.91         894.62
 7   130.00        876.66         792.70
 8   135.00       1037.96         682.59
 9   140.00       1209.09         564.01
10   145.00       1390.37         436.73
11   150.00       1582.08         300.49
12   155.00       1784.54         155.00

As expected, the calculated results match the theoretical values, validating the model and demonstrating its accuracy in capturing the time value of money for both the fixed and changing components of the annuity.


Feel free to share your thoughts or ask questions in the comments below - we'd love to hear your experiences with arithmetic progression annuities!

Read also:

Log in to add your comment.

Comments

crimson_phoenix (2024-12-21)

It's an interesting topic, but more of a learning exercise for me. In my professional work, I've never really come across arithmetic progression - I've mostly dealt with geometric progression (like indexation, etc.).