About
This tool was developed by Felix Vadakumchery as part of a Bachelor's thesis in Economics at the University of Zurich, under the supervision of Prof. Dr. Christian Ewerhart. It provides an interactive web-based visualization of exchange rate dynamics across three currencies, projecting three bilateral exchange rates onto a single moving point in 2D using a log-based triangular transformation.
An accompanying working paper applies the visualization to the EUR/CHF/USD triple over the period from December 2014 to the present, connecting the trajectory visible in the chart to key monetary policy decisions by the Swiss National Bank, the European Central Bank, and the US Federal Reserve. It covers the mathematical foundations, data sources, design decisions, and an example analysis, and is available for download here: [Download Working Paper (PDF)]
1. The problem
At any given moment, three currencies (A, B, C) produce three loop rates: A→B, B→C, C→A. Each rate changes every trading day, yielding three time series running in parallel. Plotted separately, the interactions between them are easy to miss. The goal here is to reduce all three to a single moving point in 2D without losing information — one point per time period, connected by arrows showing the direction of movement.
2. Data source
Exchange rate data comes from the ECB Data Portal, which publishes official daily reference rates for around 40 currencies against the Euro. These are mid-point quotes with no bid-ask spread, so the no-arbitrage product u×v×w is within 0.01% of 1 on any given day. All rates are available from January 1999 onwards.
The ECB only publishes rates on trading days. Weekends and fixed ECB holidays — New Year's Day, Labour Day, Christmas, and a handful of others — are absent from the feed entirely. If a selected date boundary falls on a non-trading day, the nearest available trading day is used instead; this is expected, not a data error.
Where an individual currency series is missing an isolated trading-day entry (for example, a country-specific market closure not observed by all ECB counterparts), the last known rate is carried forward within the set of available trading days (forward-fill). No imputation is applied across weekends or holidays, since those dates are never present in the ECB feed.
3. Display and performance limits
Two automatic thresholds adapt the chart's visual features to the size of the requested dataset.
Movement arrows
Arrow rendering has three tiers. Up to 500 data points, arrows draw automatically. Between 501 and 1,500 a Show Arrows button appears below the chart — arrows are available but off by default, since drawing that many SVG elements takes a moment on older hardware. Beyond 1,500 points arrows are not generated at all; that volume of shapes would freeze most browsers. The colour gradient carries direction information in all cases.
Approximate cutoffs for the default-on tier per granularity:
- Daily — arrows on by default for ranges up to roughly 2 years
- Weekly — arrows on by default for ranges up to roughly 9 years
- Monthly — arrows always on by default (ECB history is under 320 months)
- Quarterly — arrows always on by default (ECB history is under 120 quarters)
- Yearly — arrows always on by default (ECB history is under 30 years)
When arrows are hidden the chart's legend shows a note to that effect.
Time-slider animation
The play/pause slider is available for every dataset size. For datasets with more than 300 data points the slider is subsampled: instead of one step per data point, the timeline is divided into at most 300 evenly spaced steps. Each step of the slider therefore advances the animation by multiple data points at once. The first and last steps always correspond exactly to the earliest and latest dates in the selected range.
While the animation is playing, the browser is continuously redrawing the chart at each frame, which can noticeably reduce responsiveness for other interactions — in particular opening or closing the Events panel, pinning or unpinning events, toggling event visibility, and switching tabs. It is recommended to pause or let the animation finish before interacting with the Events panel or other controls.