Arithmetic versus Geometric Average Return
Install and import#
npm install fintech-algorithmsimport { arithmeticVersusGeometricAverageReturn } from "fintech-algorithms/foundations/financial-arithmetic-time-value-and-returns/arithmetic-geometric-return";Signature#
arithmeticVersusGeometricAverageReturn(input)Averages the same return series two ways, by adding and by compounding, so the gap between the plain mean and the rate actually realised is visible.
Parameters#
| Name | Type | Notes |
|---|---|---|
input | D00Input | A plain object. Every F02 topic first reads principal, rate and periods and validates them before any per-topic branch runs. Before reaching this branch the engine also rejects a startValue or endValue that is zero or negative (omitting them entirely is not caught, because Number(undefined) is NaN), and returns to be a non-empty array of finite numbers none of which is at or below -1. Only returns feeds the result; the rest are validated but not used. |
Returns#
{ arithmeticAverage: number; geometricAverage: number }
arithmeticAverage is the plain mean of the series. geometricAverage is the compound growth factor taken to the power 1 / n and reduced by 1, where n is the number of returns.
Errors#
- When input is not a plain object — throws TypeError
- When principal is negative, periods is negative, or rate is at or below -1 — throws RangeError
- When startValue or endValue is zero or negative — throws RangeError
- When returns is missing, empty, not an array, or contains a non-finite number — throws RangeError
- When any entry of returns is at or below -1, a loss of 100% or worse — throws RangeError
Complexity: time O(n),
space O(n).
Worked example#
verified This is the worked example published in the article, replayed by the test suite on every run. The output cannot drift.
Input#
{
"principal": 1000,
"rate": 0.05,
"periods": 3,
"compoundsPerPeriod": 12,
"futureValue": 1200,
"cashFlows": [-1000, 400, 400, 400],
"startValue": 100,
"endValue": 110,
"returns": [0.1, -0.05, 0.08],
"frequency": 12,
"periodicReturn": 0.01
}Call#
arithmeticVersusGeometricAverageReturn(input)Returns#
object with 2 fields: arithmeticAverage, geometricAverage
{
"arithmeticAverage": 0.043333333333333335,
"geometricAverage": 0.04115010832757027
}Diagrams#
Calculation flow#
Arithmetic versus Geometric Average Return — four-part map
flowchart LR
A["Name the input"] --> B["Apply: arithmetic mean = (r1 + r2 + ... + rn)/n; geometric mean = [(1+r1)...(1+rn)]^(1/n) - 1"]
B --> C["Check units and boundary"]
C --> D["Explain the output"]
How it works#
This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.
References#
- CFA_QM - CFA Institute Quantitative Methods Study Session — CFA Institute
- INVESTOR_RETURN - Annual Return — U.S. Securities and Exchange Commission
- Author-derived and synthetic boundary