Methodology
How ParallaxFX computes the numbers it shows you, and why specific denominators are chosen where they are.
Forecast Impact denominator — why operating income, not face value
ParallaxFX computes severity in two places, and they answer two different questions:
- "How risky is this in proportional terms?" — the per-currency severity tables (Currency Risk Breakdown, Hedge Recommendation by Currency) use each currency's own face-value exposure as the denominator. A 5% EUR move against your EUR position reads high-severity regardless of whether your company is $5M or $5B. That's the right framing for policy bands like "hedge EUR exposure 50–80% when net EUR exceeds 5% of EUR revenue."
- "How material is this to the business?" — the Forecast Impact KPI on this page uses your operating-income and revenue baselines as the denominator instead. A $120K worst-case FX swing reads very different against a $6M operating income (2% of OI, material) than against a $60M operating income (0.2%, a rounding error). FP&A audiences anchor on the operating-income framing — boards want EBITDA impact, not exposure %.
Both views ship side-by-side. The KPI strip shows the business-anchored framing; the per-currency tables retain the face-value framing. The two are internally consistent and answer their respective questions correctly — collapsing them into one denominator would lose information.
To enable the business-anchored framing, fill in annual revenue + operating income on the profile edit form. Both fields are optional; the per-currency tables work without them.
Currency netting (Inflows / Outflows / Net)
For each currency, ParallaxFX computes Level 1 same-currency netting (Inflows − Outflows = Net position) alongside the face-value gross exposure. The redesigned currency table shows all three columns. Both shapes ship on every engine output; neither replaces the other.
Competitive engine pass-through coefficient
The Competitive engine applies a pass-through coefficient to model how much of an FX move flows into your pricing. Industry default is 50% (half the move absorbed, half passed through). Differentiated SaaS / branded products typically run 30–50% (pricing power absorbs); commodity / pass-through resellers run 80–100%. Configure per profile on the profile edit form.
Hedge recommendation weights
The hedge recommendation balances downside reduction against upside preservation, with an additional anti-full-hedge bias at 100% coverage. The weights are driven by your company's risk appetite (Conservative / Balanced / Aggressive), set on the Company Settings page and overridable per profile:
- Conservative — upside-loss weight 0.25, full-hedge penalty 0.20× total upside. Downside reduction wins easily.
- Balanced — upside-loss weight 0.50, full-hedge penalty 0.40× total upside. Default behavior.
- Aggressive — upside-loss weight 0.75, full-hedge penalty 0.60× total upside. Preserves upside; recommends lower coverage.
ECB data layer — where rates come from, how drift and VaR are computed
ParallaxFX prices everything against the European Central Bank's daily reference rates (the ECB euro foreign exchange reference rates, published each Eurozone trading day at ~16:00 CET). The feed is free, audit-defensible, and covers 30+ currencies against EUR going back to 1999. We store the last two years of history on a fresh install and append the latest close each weekday via a scheduled job.
ECB is EUR-base — it publishes EUR/USD, EUR/JPY, and so on, but never USD/JPY directly. For any pair where neither side is EUR, we derive the cross rate per day via the EUR bridge:rate(X/Y) = rate(EUR/Y) / rate(EUR/X). Storage stays compact and consistency questions stay simple: there's exactly one source row per (currency, trading day).
Stale-data check — what "drift" means
When you import a forecast or a batch of invoices, ParallaxFX snapshots the rates we have at that moment onto the import batch. The freshness signal on every analysis view ("valued 1 day ago", "within tolerance", "stale") compares that snapshot to the latest ECB close. Drift is reported as max |%| across all pairs in the snapshot — one currency drifting 2.5% is enough to mark the snapshot Aging, even if the rest are unchanged. Historical analysis runs freeze the drift figure against the rate that was current on the day the run was saved.
Annualized volatility (σ_annual)
For Forecast Risk and VaR, we compute the annualized volatility of each relevant pair from its last 90 trading days of closes. Daily log returns r_t = ln(price_t / price_{t-1}) go through a sample standard deviation (n−1 denominator), then scaled to annual via σ_annual = σ_daily × √252. For sanity checks: as of mid-2026, σ_annual(EUR/USD) over the last 90 days runs ≈ 6.5%, EUR/JPY ≈ 6.7%, GBP/USD (derived as a cross) ≈ 7.4% — typical ranges for developed-market major pairs.
Parametric VaR
The "Forecast Risk" / VaR figure is the parametric (variance– covariance) Value-at-Risk for a single position:
VaR = |Net Exposure| × σ_annual × z × √(t / 252)
where z is the one-tailed normal quantile for the chosen confidence (1.2816 for 90%, 1.6449 for 95%, 2.3263 for 99%) and t is the horizon in trading days (90 ≈ a quarter, 252 ≈ a year). Reads as "the largest loss we'd expect with X% confidence over t trading days, in your home-currency units." Worked example: a $1M GBP/USD position over 90 days at 95% confidence ≈ $1M × 0.074 × 1.6449 × √(90/252) ≈ $73,000.
The single-position formula is exact only when positions are uncorrelated. v1 sums per-currency VaR across a portfolio, which is an upper bound on the correlated total — natural offsets (e.g. EUR receivables and GBP costs that tend to move together) would reduce the true figure. Portfolio VaR with a full covariance matrix is a future enhancement; the upper-bound shape is the conservative read.