Currency-Converted Index
Install and import#
npm install fintech-algorithmsimport { calculate } from "fintech-algorithms/index-and-benchmark-engineering/return-variants/currency-converted-index";Signature#
calculate(data)Restates an index in another currency by compounding local returns with FX returns. Unhedged: the holder takes the currency exposure, and this is the variant that shows it.
Parameters#
| Name | Type | Notes |
|---|---|---|
data | { localReturns: number[]; fxReturns: number[]; baseLevel: number; quote: string } | quote names the direction of the FX quotation. Getting that direction backwards inverts the currency effect, and the result still looks plausible. baseLevel is the index value at the start of the series; it scales the level but never the returns. |
Returns#
{ baseCurrencyReturns, levels, endingLevel, quote }
Converted returns and levels, with the quote convention echoed back for checking.
Errors#
- When the return series differ in length — throws
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#
{
"localReturns": [0.01, -0.004, 0.006, 0.002, -0.003],
"fxReturns": [0.002, 0.001, -0.003, 0.004, -0.001],
"baseLevel": 1000,
"quote": "base currency per local currency"
}Call#
calculate(data)Returns#
object with 4 fields: baseCurrencyReturns, levels, endingLevel, quote
{
"baseCurrencyReturns": [0.01202, -0.003004, 0.002982, 0.006008, -0.003997],
"levels": [1000, 1012.02, 1008.979892, 1011.98867, 1018.068698, 1013.999477],
"endingLevel": 1013.999477,
"quote": "base currency per local currency"
}Diagrams#
Calculation flow#
Currency-Converted Index calculation flow
flowchart LR
A["Point-in-time inputs"] --> B["Validate units and timing"]
B --> C{"Contract feasible?"}
C -->|No| D["Reject with reason"]
C -->|Yes| E["Calculate Currency-Converted Index"]
E --> F["Recompute invariants"]
F --> G{"Checks pass?"}
G -->|No| D
G -->|Yes| H["Publish audited output"]
Currency-Converted Index methodology state
stateDiagram-v2
[*] --> FrozenInputs
FrozenInputs --> Validated: contract passes
FrozenInputs --> Rejected: missing or infeasible
Validated --> Calculated: apply named rule
Calculated --> Audited: invariants pass
Calculated --> Rejected: invariant fails
Audited --> Published: version and timestamp recorded
Published --> Revised: approved correction
Revised --> FrozenInputs: rebuild from retained source state
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#
- S&P Dow Jones Indices Index Mathematics Methodology — S&P Dow Jones Indices
- S&P DJI Equity Indices Policies & Practices — S&P Dow Jones Indices
- FTSE Russell Capping Methodology — FTSE Russell, LSEG
- FTSE Russell Index Policy and Methodology Library — FTSE Russell, LSEG
- MSCI Global Investable Market Indexes Methodology Library — MSCI
- MSCI Minimum Volatility Indexes Methodology — MSCI
- S&P Risk Control 2.0 Indices Methodology — S&P Dow Jones Indices
- Principles for Financial Benchmarks — International Organization of Securities Commissions
- Regulation (EU) 2016/1011 — European Union
- Portfolio Selection — Harry Markowitz
- On the Properties of Equally-Weighted Risk Contributions Portfolios — Sébastien Maillard, Thierry Roncalli, and Jérôme Teïletche
- Fundamental Indexation — Robert Arnott, Jason Hsu, and Philip Moore
- FTSE Currency Hedging Methodology Overview — FTSE Russell, LSEG