Synthetic prices are calibrated from free public sources
Table of Contents
- 1. Summary
- 2. Detail
- 2.1. Why a calibration source and not a vendor
- 2.2. The sources
- 2.3. What was read, and when
- 2.4. Frankfurter as the access route for FX
- 2.5. What this page does not settle
- 2.6. The overnight rate of each IR currency
- 2.7. How the overnight rates are stored
- 2.8. How a generator uses a source
- 2.9. The history every environment holds
- 2.10. How a volatility surface starts
- 2.11. How derived values relate to their sources
- 2.12. What this replaces
- 3. See also
1. Summary
A synthetic tick needs an initial value and a volatility. The values come from free public sources, never from a vendor, and each generator config names its source. For FX the sources are the daily rates of the central banks and public bodies that the Frankfurter API reaches, the ECB and the Federal Reserve H.10 among them, and for curves the US Treasury par yield curve with the central banks' overnight rates. Each publisher is a market data provider, and an adapter publishes what it published every day as a fixing tick, so a feed that starts takes the newest value. The screen shows the time of the value. The table in "What was read, and when" says which terms were read from an official page and which were not. A volatility surface has no free public source, so its starting quotes are inferred from the spot fixings of its pair by a derived source of our own, as "How a volatility surface starts" describes.
2. Detail
2.1. Why a calibration source and not a vendor
The synthetic ticks are native to the vendor: a Bloomberg generator sends Bloomberg ids. The level of the price has no link to the vendor. The level comes from the world, so it comes from a public source that anyone can check. The calibration source is a property of the generator config, and it does not depend on the provider.
2.2. The sources
| Source | Gives | Access | Terms |
|---|---|---|---|
| ECB euro foreign exchange reference rates | About 30 currencies against the euro, daily since 1999. A USD pair comes from the EUR cross. | CSV, XML and HTML, updated about 16:00 CET. | Free for any use if the source is quoted ("Source: ECB statistics") and the statistics are not modified. Third-party data needs the originator's permission. The rates are for information only. |
| Federal Reserve H.10, read through the FRED API | USD against the main currencies, daily. | A FRED API key. | The Board's own content is in the public domain, and the Board asks for a credit. The FRED terms add: a series whose notes say "Copyright" needs the owner's permission, an application must show the non-endorsement notice, and the terms do not say whether storing series is allowed. |
| US Treasury daily par yield curve | The USD curve from 1 month to 30 years, since 1990. | GET on /resource-center/data-chart-center/interest-rates/pages/xml with data=daily_treasury_yield_curve and a year or a month. The first 300 rows come by default. |
The feed page states no terms. An archived copy of the old Treasury policy says that work of federal employees carries no copyright and may be copied freely, with a credit requested. The current policy page was not found. |
| New York Fed SOFR | The overnight USD rate. | The New York Fed markets data. | A licence to use, copy, distribute and modify for business purposes. A reference rate needs the stated notice and disclaimer, a label on any modified data, and no claim of endorsement. SOFR is calculated from data that DTCC Solutions licenses. |
| Bank of England SONIA | The overnight GBP rate. | The statistical database, by 10:00 on the next business day. | The Bank's legal page puts the database under the Open Government Licence. Its exact credit line is stated for SONIA only: "SONIA and/or SONIA Compounded Index data licensed under the Open Government Licence v3.0 and copyright the Governor and Company of the Bank of England". |
| ECB €STR | The overnight EUR rate. | The ECB statistics. | The ECB usage policy above. |
2.3. What was read, and when
On 2026-10-23 the pages below were read from the official site. The rows of the table that rest on any other page say so.
| Terms | Read from | State |
|---|---|---|
| ECB statistics usage policy | the ECB usage policy page | read |
| Federal Reserve Board content | the Board disclaimer page | read |
| FRED API | the FRED terms page | read |
| New York Fed content and reference rates | the New York Fed terms page | read |
| Bank of England | a search summary of the Bank's legal page, not the page | not read |
| US Treasury | the feed page and an archived copy of the old policy | not read |
| Frankfurter | the LICENSE file of the repository and the documentation, on 2026-10-28 |
read |
| The ECB as a Frankfurter provider | the ECB disclaimer page that /v2/providers names, on 2026-10-28 |
read |
| Each other Frankfurter provider | the list of terms pages in /v2/providers |
not read; 65 of 106 have none |
| Bank of England SONIA licensing | the SONIA key features and policies page, on 2026-11-06 | read |
| Bank of Japan | the copyright page, on 2026-11-06 | read |
| SIX SARON | the SARON licensing FAQ, on 2026-11-06 | read |
| Reserve Bank of Australia | the copyright and disclaimer notice, on 2026-11-06 | read |
| Bank of Canada | the terms page, on 2026-11-06 | read |
| Reserve Bank of New Zealand | the terms page refused the request with 403; a search summary only | not read |
| The twenty other IR publishers | no page | not read |
A source whose row says not read blocks the storing of its values until its terms page is read and the result is written here.
2.4. Frankfurter as the access route for FX
Frankfurter is an open source (MIT) exchange rate API. It reads the daily rates of about 105 central banks and official sources, among them the ECB, the Federal Reserve through FRED, the BIS and the central banks of Taiwan, Chile and Brazil. Its documentation, which also describes the per-provider path /v2/providers/<key>/rates, says the rates go back to 1948, that there are no quotas but requests are rate-limited, and that storing daily data locally is encouraged. A call to /v2/rates returns the latest, a past date or a time series, as JSON, CSV or NDJSON. The hosted API is api.frankfurter.dev, and a Docker image runs it on our own host with a SQLite file. Some providers need a free key of their own, such as FRED.
It answers the coverage gap, because one client reads the pairs that neither the ECB nor the H.10 carries. A call to /v2/providers lists a terms page for most providers, and some providers have none.
Three rules keep the provenance honest:
- The adapter asks for one provider at a time and never takes the blended rate. The blended rate is Frankfurter's own calculation, and it hides which bank the number comes from. Each stored value keeps the provider key, so the credit and the terms of that provider apply.
- The hosted service is a convenience. The adapter reads the address from a setting, so a team can point it at its own Frankfurter in Docker without a change of code.
- Frankfurter is the route for FX only. The Treasury curve and the overnight rates are read from their own sources.
What the terms say, read on 2026-10-28:
- Frankfurter is under the MIT licence, "Copyright (c) Hakan Ensari". Its documentation says that storing daily observations locally "is encouraged to keep API traffic light", that there are no quotas but requests are rate-limited, and that "direct queries to individual provider endpoints remain subject to each provider's terms".
- For the ECB,
/v2/providersnames the ECB disclaimer page. It allows free use of the information when it "must appear accurately and the ECB must be cited as the source", and a change to the information "must be stated explicitly". This agrees with the statistics usage policy above. A cross rate computed from ECB rates is such a change, so it is marked derived and names its inputs. - Of the 106 providers that
/v2/providerslists, 65 give no terms page. A provider without one is not loaded until its own site is read.
2.5. What this page does not settle
- Whether the Bank of Japan allows this project's use of the call rate, which turns on whether the use is commercial.
- Whether a SIX Data License for SARON is worth having, or CHF keeps a fixed level.
- How to read the RBA and RBNZ tables, whose servers refused a script, and what the RBNZ terms page says.
- The route and terms of the twenty IR currencies outside the derived FX pairs, and the overnight index of PLN and TWD.
- Whether the Treasury feed carries a current licence. The next step is to read the current site policy of the Treasury.
- Which series of the Bank of England database other than SONIA fall under the Open Government Licence.
- Whether the FRED terms allow a copy of a series in a stored snapshot. The H.10 notes of each series say whether the word "Copyright" appears. The other route is the Board's own H.10 download, which the Board's public domain notice covers.
- Which of the 26 FX pairs of the mapping inventory the ECB and the H.10 do not cover. The pairs that no source covers keep a fixed level, and the config says so.
2.6. The overnight rate of each IR currency
The synthetic IR feeds of the system tenant cover 28 currencies, each on the overnight index of its config. The table names, for each, the public overnight rate, its publisher, the route by which it can be read, and what its terms allow. The eight currencies of the derived FX pairs come first, and their terms and routes were read and probed on 2026-11-06. For the other twenty the publisher is the index's administrator as commonly cited, and neither the route nor the terms was read.
A source is usable when its terms allow storing its history and computing from it a synthetic level and a curve, and when a route reads it without a person.
| Currency | Feed index | Public overnight rate | Publisher | Route | Terms | Usable |
|---|---|---|---|---|---|---|
| USD | SOFR | SOFR | New York Fed | markets.newyorkfed.org/api/rates/secured/sofr, JSON; probed, it answered |
read 2026-10-23: a licence to use, copy, distribute and modify for business purposes, with the stated notice and disclaimer and a label on modified data | yes |
| EUR | ESTR | €STR | ECB | data-api.ecb.europa.eu/service/data/EST/B.EU000A2X2A25.WT, CSV; probed, it answered |
read 2026-10-23: free use with the source cited, and a change stated explicitly | yes |
| GBP | SONIA | SONIA | Bank of England | the statistical database, series IUDSOIA, CSV; probed, it answered |
read 2026-11-06 on the SONIA key features page: the database is reproduced under the Open Government Licence; a direct licence is needed to redistribute SONIA to clients or to value clients' portfolios | yes, for our own calibration and curves |
| JPY | TONA | uncollateralised overnight call rate | Bank of Japan | one Excel file per release day on the mutan statistics page; probed. History needs the BOJ Time-Series Data Search, not probed |
read 2026-11-06: copying allowed with the Bank credited; copying for commercial purposes needs the Bank's permission in advance | only after the Bank's permission for any commercial use |
| CHF | SARON | SARON | SIX | the Swiss reference rates page links a download; probed, it answered | read 2026-11-06 in the SIX SARON licensing FAQ: historical SARON may be downloaded and redistributed after one business day with no licence, but derived data, which names yield-curve building, needs a SIX Data License even for internal use | the history yes; a curve from it, no |
| AUD | AONIA | interbank overnight cash rate | Reserve Bank of Australia | statistical table F1 as CSV; probed, the server refused a script with 403 | read 2026-11-06: the cash rate may be used for personal or commercial use with "Source: RBA [year]", no implied endorsement, and no improper commercial exploitation | the terms yes; the route is open |
| CAD | CORRA | CORRA | Bank of Canada | the Valet API, series AVG.INTWO; probed, it answered |
read 2026-11-06: free use, copy and distribution with the Bank credited and any change indicated | yes |
| NZD | NZONIA | overnight interbank cash rate | Reserve Bank of New Zealand | table B2 on the wholesale interest rates page; probed, the server refused a script with 403 | not read: the terms page also refused with 403; a search summary says reuse is allowed with the Bank acknowledged | open: the terms and the route |
| BRL | CDI | CDI | B3 | not read | not read | unknown |
| CLP | CAMARA | Índice Cámara Promedio | Banco Central de Chile | not read | not read | unknown |
| CNH | HIBOR | CNH HIBOR, a term rate, not an overnight average | Treasury Markets Association | not read | not read | unknown |
| CNY | SHIBOR | SHIBOR overnight | National Interbank Funding Center | not read | not read | unknown |
| COP | IBR | IBR overnight | Banco de la República | not read | not read | unknown |
| CZK | CZEONIA | CZEONIA | Czech National Bank | not read | not read | unknown |
| DKK | DESTR | DESTR | Danmarks Nationalbank | not read | not read | unknown |
| HKD | HONIA | HONIA | Treasury Markets Association | not read | not read | unknown |
| HUF | BUBORON | HUFONIA is the overnight average; BUBOR overnight is a quote | Magyar Nemzeti Bank | not read | not read | unknown |
| ILS | TELBORON | SHIR; TELBOR ceased after 30 June 2025 | Bank of Israel | not read | not read | unknown |
| INR | MIBOR | MIBOR overnight | FBIL | not read | not read | unknown |
| KRW | KOFR | KOFR | Korea Securities Depository | not read | not read | unknown |
| MXN | TIIE | TIIE de Fondeo | Banco de México | not read | not read | unknown |
| NOK | NOWA | NOWA | Norges Bank | not read | not read | unknown |
| PLN | POLONIA | unresolved: sources conflict on POLONIA, WIRON and POLSTR | NBP or GPW Benchmark | not read | not read | unknown |
| SEK | SWESTR | SWESTR | Sveriges Riksbank | not read | not read | unknown |
| SGD | SORA | SORA | Monetary Authority of Singapore | not read | not read | unknown |
| TRY | TLREF | TLREF | Borsa Istanbul | not read | not read | unknown |
| TWD | TAIBOR | unresolved: TAIBOR is a term rate, and the overnight benchmark was not found | not found | not read | not read | unknown |
| ZAR | ZARONIA | ZARONIA | South African Reserve Bank | not read | not read | unknown |
Four of the eight are usable now: USD, EUR, GBP and CAD. AUD has usable terms but no open route, because the RBA's server refused a script. JPY waits on the Bank of Japan's view of commercial use, CHF cannot give a curve without a SIX licence, and NZD needs both its terms and a route.
Four feeds quote the wrong index, and one is unresolved. The ILS feed quotes TELBOR, which ceased; the CNH feed quotes HIBOR, a term rate; the HUF feed quotes the BUBOR overnight quote rather than HUFONIA, the overnight average; and the TWD feed quotes TAIBOR, a term rate. The PLN feed is the unresolved one, because the sources conflict on its index.
2.7. How the overnight rates are stored
Each overnight rate is stored as a decimal, because the rates of the system are decimals and ORE reads a fixing as one. The publishers state their rates in percent, so the adapter moves the decimal point two places in the published text: a SOFR of 3.97 percent is stored as 0.0397. No digit changes and no binary rounding enters. This is a change of unit. The New York Fed asks for a label on modified data and the ECB asks that a change be stated, so this page states it, and the vendor field of each series, such as percentRate, names the published unit. The provider of each fixing keeps its credit.
Each publisher's adapter reads one series through its own feed. A first demand stores the last backfill_days of history, 400 by default, and each later read fetches only the days after the latest stored fixing.
| Series | Publisher | History the route serves | Measured |
|---|---|---|---|
| SOFR | New York Fed | 2,149 rates, from 2018-04-02 to 2026-11-06, in one response of search.json |
2026-11-10 |
| €STR | ECB | 1,820 rates, from 2019-10-01 to 2026-11-06, in one CSV answer of the Data Portal | 2026-11-10 |
The ECB Data Portal answers a query it has not cached with a 504 after thirty seconds, and the same query again from its cache in under a second. The adapter asks up to three times before it reports the read as failed. A window with no observation is a 200 with an empty body.
2.8. How a generator uses a source
Each generator config names the fixing items it may start from, with a rank, a policy and a window for the volatility. The initial value is the latest fixing on or before the date of the market clock, and the volatility is the spread of the log returns over the window. The config does not fetch anything. A feed whose daily variance follows a GJR-GARCH reads the same item over the policy's longer variance window, and that history is fitted, stored and reviewed before the feed runs it; see Calibrating a synthetic feed: from fixings to a reviewed run. The public sources adapter publishes the fixings as durable ticks, and a reader returns the value with its provider and its time. See Public sources publish daily fixings through an adapter.
A copy of a source's statistics keeps the credit and the notice that its terms ask for. The ECB rule is the strictest, because it allows reuse when the statistics are not modified. So each ECB value is stored exactly as the ECB published it, with the credit "Source: ECB statistics". A pair that one publisher does not quote is usually quoted by another, so a feed takes it directly where it can. Where none does, a cross rate, such as USD/JPY from EUR/JPY and EUR/USD, is computed when the generator starts, from two fixings of one publisher. It is an input to a synthetic price and is not published as an ECB statistic. That is our reading of the policy, and the owner of the ECB policy has not confirmed it. If it proves too strict, the pairs that need a cross take their level from a source that quotes the pair directly.
2.9. The history every environment holds
The GARCH fit of a spot and the derived quotes of a surface need years of fixings, where the level of a spot needs only the latest. Every environment holds five years of daily fixings for each catalogued provider and pair from a static DQ snapshot, taken on a stated date and refreshed by hand. The public sources adapter fetches, for each item, only the days from its latest stored fixing to today, so an environment loaded from an old snapshot catches up in one request per item. The snapshot is published with the repository, which is public, so a provider is in it only if its terms allow its statistics to be redistributed; a provider whose terms allow storage and not redistribution stays adapter-only.
2.10. How a volatility surface starts
A synthetic volatility surface needs starting quotes, and no free public source publishes FX implied volatilities: DBnomics has no such dataset, the BIS and the ECB publish none, the free volatility indices on FRED are equity and rates indices whose storage terms are unread, and the ICE indices there may not be reproduced. The daily FX surfaces on offer are commercial. The starting quotes therefore come from a derived source, a publisher of our own whose quotes are inferred from the spot fixings of the pair; Derivation of FX volatility quotes from historical fixings describes how it sits in the system. A real vol source of the same items, where one is available, ranks above it in the generator's calibration policy and replaces it.
The inference reads the Gram-Charlier smile of Backus, Foresi, Li and Wu at the market's delta pillars. With \(\sigma\) the volatility of the log spot over the expiry, \(\gamma_1\) its skewness and \(\gamma_2\) its excess kurtosis, the 25-delta risk reversal is about \(0.225\,\sigma\gamma_1\), the 25-delta smile butterfly about \(0.019\,\sigma\gamma_2\), and the ATM volatility \(\sigma(1 - \gamma_2/24)\); the paper summary gives the 10-delta points and the derivation. Each input is estimated as follows.
- The level. \(\sigma\) for an expiry is the realised volatility over a window of the same length, annualised, and never shorter than one month. Option markets price volatility above what is later realised; Della Corte, Ramadorai and Sarno (2016) measure this volatility risk premium in currencies. No free source publishes it, so the ATM level is the realised volatility times an authored multiplier per pair, which defaults to one.
- The shape. Skewness and kurtosis are measured on daily returns over the whole history held, because a pair's shape changes more slowly than its level, and shrunk toward authored priors, \(\tilde{\gamma} = w\hat{\gamma} + (1 - w)\gamma^{prior}\) with \(w = n/(n + n_0)\). The shrinkage answers the noise: for normal data the standard errors of the two moments are about \(\sqrt{6/n}\) and \(\sqrt{24/n}\), 0.15 and 0.31 on a year of daily returns, and fat tails make them larger. The shrunk pair, scaled to each expiry as below, is held inside the region where the Gram-Charlier expansion is a density (Jondeau and Rockinger, 2001): the excess kurtosis in \([0, 4]\), and the skewness scaled toward zero as little as keeps the expansion non-negative.
- The term structure. For independent days the skewness and excess kurtosis of an $n$-day return are \(\gamma_1/\sqrt{n}\) and \(\gamma_2/n\), so the risk reversal falls as \(1/\sqrt{t}\), as the skew of the SSVI surface the generator fits does, and the butterfly as \(1/t\).
- The convention. The quotes follow the pair's
fx_option_convention. Where its butterfly style is the broker strangle, the market strangle is solved against a smile fitted to the inferred volatilities.
The computation is native to ores.analytics.quant. math/return_moments.hpp holds the moments, the shrinkage, the region and the term scaling; math/fx_delta.hpp the deltas and strikes of the four delta conventions and the ATM strike; math/fx_smile_quotes.hpp the smile and its quotes in a convention, the broker butterfly solved so that the broker strangle prices on the smile as it does at the single volatility; and math/fx_vol_derivation.hpp the one entry point from a pair's daily returns and its expiries to its quotes.
The quotes are plausible and not observed. A spot path carries no view of the events an option market prices, no risk premium beyond the authored multiplier, and, with clustered returns, more kurtosis at long horizons than the independent-day scaling gives.
2.11. How derived values relate to their sources
A derived quote, and a cross rate computed from two fixings, are the output of our own computation, and they are never presented as the statistics of the publisher whose fixings fed them. The inputs are stored exactly as published, with their credit, such as "Source: ECB statistics". The outputs carry the identity of the derived publisher alone: no publisher's credit, no publisher's name in their provenance as their source, and no claim that they are a publisher's figures. A person who follows a derived quote's provenance finds the derived publisher and the computation; the fixings it read are an internal input of that computation.
2.12. What this replaces
The 2016 ORE sample vintage no longer calibrates any generator. The datasets that depend on it are replaced when the sources are in place. The uniform demo is not calibrated from any source: its exaggerated volatility is the point, and it keeps fixed levels.
3. See also
- The market data path: a public fixing, a curve, a report — the structure note that orders this cluster, and where to read this page in it.
- Market Data Architecture — the structure note that orders this cluster.
- Generators belong to the system tenant and the system party — completes: who owns the configs that carry the calibration entry.
- The mapping inventory lists the vendor instruments each provider carries — completes: the vendor ids the calibrated generators publish.
- Paper summary: accounting for biases in Black-Scholes — the smile the starting surface is read from.
- Derivation of FX volatility quotes from historical fixings — completes: where the derived source sits behind the adapter seam.
- Volatility clustering and GARCH models — completes: the GARCH fit the five-year history feeds.
3.1. Further reading
- Della Corte, P., Ramadorai, T. and Sarno, L. (2016). "Volatility risk premia and exchange rate predictability." Journal of Financial Economics, 120(1), 21-40. doi:10.1016/j.jfineco.2016.02.015.
- Jondeau, E. and Rockinger, M. (2001). "Gram-Charlier densities." Journal of Economic Dynamics and Control, 25(10), 1457-1483. Serval record.
- Real Statistics: analysis of skewness and kurtosis. The large-sample standard errors and their limits.