fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Currency-Converted Index

Install and import#

bash
npm install fintech-algorithms
ts
import { 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#

NameTypeNotes
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#

data
{
  "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#

Currency-Converted Index — article hero
Currency-Converted Index — failure guard
Currency-Converted Index — worked example

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.

Read the article →

References#

The rest of the Return Variants family#