Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

FX & Currency

SyntheticData generates realistic foreign exchange rates, currency translation entries, and cumulative translation adjustments (CTA) for multi-currency enterprise simulation.

Overview

The FX module in datasynth-generators provides three generators:

GeneratorPurposeOutput
FX Rate ServiceDaily exchange rates via Ornstein-Uhlenbeck processfx/daily_rates.csv, fx/period_rates.csv
Currency TranslatorTranslate foreign-currency financials to reporting currencyconsolidation/currency_translation.csv
CTA GeneratorCumulative Translation Adjustment for consolidationconsolidation/cta_entries.csv

Configuration

fx:
  enabled: true
  base_currency: USD                    # Reporting/functional currency
  currencies:
    - code: EUR
      initial_rate: 1.10
      volatility: 0.08
      mean_reversion: 0.05
    - code: GBP
      initial_rate: 1.27
      volatility: 0.07
      mean_reversion: 0.04
    - code: JPY
      initial_rate: 0.0067
      volatility: 0.10
      mean_reversion: 0.06
    - code: CHF
      initial_rate: 1.12
      volatility: 0.06
      mean_reversion: 0.03

  translation:
    method: current_rate                # current_rate, temporal, monetary_non_monetary
    equity_at_historical: true
    income_at_average: true

  cta:
    enabled: true
    equity_account: "3900"              # CTA equity account

FX Rate Service

Ornstein-Uhlenbeck Process

Exchange rates are generated using a mean-reverting stochastic process (Ornstein-Uhlenbeck), which models the tendency of exchange rates to revert toward a long-term equilibrium:

dX(t) = θ(μ - X(t))dt + σdW(t)

where:
  X(t)  = log exchange rate at time t
  θ     = mean reversion speed (mean_reversion config)
  μ     = long-term mean (derived from initial_rate)
  σ     = volatility
  dW(t) = Wiener process (random walk)

This produces rates that:

  • Mean-revert: Rates drift back toward the initial level over time
  • Have realistic volatility: Day-to-day movements match configurable volatility targets
  • Are serially correlated: Today’s rate depends on yesterday’s rate (not i.i.d.)
  • Are deterministic: Given the same seed, rates are exactly reproducible

Rate Types

Rate TypeUsageCalculation
Daily spotTransaction-date ratesO-U process output for each business day
Period averageIncome statement translationArithmetic mean of daily rates within the period
Period closingBalance sheet translationLast business day rate in the period
HistoricalEquity itemsRate at the date equity was contributed

Output: daily_rates.csv

FieldDescription
dateBusiness day
from_currencySource currency (e.g., EUR)
to_currencyTarget currency (e.g., USD)
spot_rateDaily spot rate
inverse_rate1 / spot_rate

Output: period_rates.csv

FieldDescription
periodFiscal period (YYYY-MM)
from_currencySource currency
to_currencyTarget currency
average_ratePeriod average
closing_ratePeriod-end closing rate

Currency Translation

Translation Methods

SyntheticData supports three standard currency translation methods:

Current Rate Method (ASC 830 / IAS 21 — default)

The most common method for foreign subsidiaries with functional currency different from reporting currency:

ItemRate Used
AssetsClosing rate
LiabilitiesClosing rate
Equity (contributed capital)Historical rate
Equity (retained earnings)Rolled-forward
RevenueAverage rate
ExpensesAverage rate
DividendsRate on declaration date
CTABalancing item → Equity

Temporal Method (ASC 830)

Used when the foreign operation’s functional currency is the parent’s currency (e.g., highly inflationary economies):

ItemRate Used
Monetary assets/liabilitiesClosing rate
Non-monetary assets (at cost)Historical rate
Non-monetary assets (at fair value)Rate at fair value date
RevenueAverage rate
ExpensesAverage rate
DepreciationHistorical rate of related asset
Remeasurement gain/lossIncome statement

Monetary/Non-Monetary Method

ItemRate Used
Monetary itemsClosing rate
Non-monetary itemsHistorical rate

Translation Configuration

fx:
  translation:
    method: current_rate      # current_rate | temporal | monetary_non_monetary
    equity_at_historical: true
    income_at_average: true

CTA Generator

The Cumulative Translation Adjustment arises because assets/liabilities are translated at closing rates while equity is at historical rates. The CTA is posted to Other Comprehensive Income (OCI) in equity:

CTA = Translated Net Assets (at closing rate)
    - Translated Equity (at historical rates)
    - Translated Net Income (at average rate)

CTA Journal Entry

DebitCreditDescription
CTA (Equity 3900)Various BS accountsTranslation adjustment for period

The CTA accumulates over time and is only recycled to the income statement when a foreign subsidiary is disposed of.

Configuration

fx:
  cta:
    enabled: true
    equity_account: "3900"    # OCI - CTA account

Multi-Currency Company Configuration

Multi-currency scenarios require companies with different functional currencies:

companies:
  - code: C001
    name: "US Parent Corp"
    currency: USD
    country: US

  - code: C002
    name: "European Subsidiary"
    currency: EUR
    country: DE

  - code: C003
    name: "UK Subsidiary"
    currency: GBP
    country: GB

  - code: C004
    name: "Japan Subsidiary"
    currency: JPY
    country: JP

fx:
  enabled: true
  base_currency: USD
  currencies:
    - { code: EUR, initial_rate: 1.10, volatility: 0.08, mean_reversion: 0.05 }
    - { code: GBP, initial_rate: 1.27, volatility: 0.07, mean_reversion: 0.04 }
    - { code: JPY, initial_rate: 0.0067, volatility: 0.10, mean_reversion: 0.06 }

intercompany:
  enabled: true
  # IC transactions generate FX exposure

Output Files

FileContent
fx/daily_rates.csvDaily spot rates for all currency pairs
fx/period_rates.csvPeriod average and closing rates
consolidation/currency_translation.csvTranslation entries per entity/period
consolidation/cta_entries.csvCTA adjustments (if CTA enabled)
consolidation/consolidated_trial_balance.csvTranslated and consolidated TB

See Also