KredereFX Monitor
← Back to dashboard

Data Sources & Methodology

How we source, compute, and present exchange rate and macro data

Data Flow

EXCHANGE RATESMACRO DATARBI ArchiveECBBOE · IMF · BNMFrankfurter v2Investing.comWorldGovBondsBrowserless.ioOur ServerDashboard

For INR-base, USD/EUR/GBP/JPY rates come from the RBI Reference Rate Archive (official FBIL fixings), backed by a local 5-year cache. Investing.com via Browserless is the fallback when RBI is unreachable. Other currencies flow through Frankfurter (ECB + 35 central banks). Macro data is scraped via Browserless and CDN-cached for 4 hours.

Exchange Rate Providers

ProviderCurrenciesPublishesMethod
RBI ArchiveUSD, EUR, GBP, JPY vs INR~1:30 PM ISTRBI archive + local cache; investing.com → Frankfurter fallback
ECBAUD, CAD, CHF, CNY, HKD, SGD, NZD, THB, KRW, MYR, ZAR, SEK~4:00 PM CETFrankfurter (EUR → cross-rate)
BlendedSARDailyBOE, IMF, BNM via Frankfurter

RBI Reference Rate Archive — Official FBIL Fixings

Computed from actual interbank spot trades on Refinitiv (Thomson Reuters) and CCIL platforms. A random 15-minute window is selected between 11:30 AM – 12:30 PM IST. Minimum 10 transactions totalling $25M+ required; outliers beyond ±3σ excluded. EUR, GBP, JPY cross-rates are derived from the USD/INR reference using closing prices from the same window.

FBIL (promoted by FIMMDA, FEDAI, IBA) has administered these rates at RBI's direction since 10 July 2018. Before that date, RBI published them directly at the same archive page.

To verify manually
  1. Open the archive page (link below)
  2. Enter From Date and To Date in DD/MM/YYYY format
  3. Check All and click GO
  4. Columns: Date · USD (INR/1 USD) · GBP (INR/1 GBP) · EUR (INR/1 EUR) · JPY (INR/100 JPY) · AED · IDR
  5. For JPY: divide the published value by 100 to get INR per 1 JPY

The archive retains ~3 years of data. Historical USD/INR before April 2022 is sourced from Kredere internal records. EUR/GBP/JPY before April 2022 fall back to Frankfurter at request time.

ECB — Euro Reference Rates

Daily concertation procedure at ~2:15 PM CET. Published as EUR-based rates; Frankfurter cross-rates to any base. For INR-base views: INR_per_quote = INR_per_USD ÷ USD_per_quote.

To verify manually (example: AUD/INR on 2025-01-15)
https://api.frankfurter.dev/v2/rates?base=INR&quotes=AUD&date=2025-01-15
Returns rate as AUD per INR → displayed = 1 / rate

% Return Calculation

The dashboard displays percentage returns for periods 1D through FYTD. All returns are computed in the displayed direction (how much of the quote currency one unit of base buys), not in the stored raw rate direction.

Rates are stored as quote / base (e.g. AUD per INR). The display shows the inverse: INR per AUD.
% Return = (historical_stored_rate / current_stored_rate − 1) × 100

Dividing historical by current in stored form is algebraically equivalent to dividing current displayed rate by historical displayed rate — the inversions cancel out. A positive result means the base currency strengthened (buys more of the quote).

Worked Example — USD/INR 1D Return
Today stored rate: 0.01182 (USD per INR = 1/84.60)
Yesterday stored rate: 0.01180 (1/84.73)
Return = (0.01180 / 0.01182 − 1) × 100 = −0.17%
INR weakened slightly — buys fewer USD today than yesterday

Period Reference Dates

1DrateDate − 1 dayPer-currency; +1 extra if Frankfurter rolled forward
3DrateDate − 3 daysPer-currency
1WrateDate − 7 daysPer-currency
1M – 5YlatestDate − N months/yearsGlobal ref; end-of-month clamped
CYTDDec 31 of previous yearFrankfurter falls back to nearest trading day
FYTDMarch 31 of FY startIndian FY: Apr 1 – Mar 31

Holiday & Weekend Handling

Frankfurter automatically falls back to the nearest prior trading day when a date has no data (weekends, public holidays). The 1D/3D/1W offsets are tuned to prevent spurious 0% readings on non-trading days.

Rolled-Forward Detection

Before FBIL publishes (~1:30 PM IST) and before ECB publishes (~8:30 PM IST), Frankfurter serves yesterday's data under today's date. We detect this when rateDate ≥ todayand apply an extra day of offset so the 1D comparison doesn't reference the same data point (which would give 0%).

Normal trading day
rateDate < today
1D: −1 day   3D: −3 days
Rolled forward (source not yet published)
rateDate ≥ today
1D: −2 days   3D: −4 days
Example — Friday (after market close)
rateDate = 2025-05-02 (Friday, source published)
1D comparison → 2025-05-01 (Thursday)
Frankfurter returns the Thursday rate — correct.
rateDate = 2025-05-05 (Monday, rolled forward = Friday's data)
1D comparison → 2025-05-03 (Saturday → Frankfurter falls back to Friday)
Without +1 offset: 1D would compare Friday vs Friday → 0%.

Cross-Rate Calculation

The RBI archive gives direct INR rates for USD, EUR, GBP, JPY. ECB rates are EUR-quoted; Frankfurter cross-rates them to USD. For INR-based views of ECB currencies, we derive the INR cross-rate on our server:

quote_per_INR = (USD_per_quote) × (INR_per_USD)
INR_per_quote = 1 / quote_per_INR
Worked Example — AUD/INR
ECB via Frankfurter: 1 USD = 1.5418 AUD
RBI Archive: 1 USD = 84.50 INR
AUD per INR = 1.5418 / 84.50 = 0.01824 AUD
Displayed rate (INR per AUD): 1 / 0.01824 = 54.82 INR

The same cross-rate logic is applied to historical dates for computing % returns. For non-INR base currencies, Frankfurter handles cross-rate computation natively.

Macro Data (Yields & Ratings)

10Y Government Bond Yields

Investing.com → Browserless.io headless scrape

Cached 2h
Fields
Yield (%), 1D change (bps), 1D change (%)
Interpretation
Rising yields → tighter monetary conditions → generally currency-positive

A headless Chrome session scrapes the Investing.com world government bonds page. Results are cached in server memory (2h TTL) and on the CDN (2h s-maxage). A Vercel Cron job at 2 AM UTC pre-warms the cache daily; the browser client auto-refreshes every 2 hours.

S&P Sovereign Credit Ratings

World Government Bonds → Browserless.io headless scrape

Cached 2h
Fields
S&P grade (e.g. BBB+) and outlook (Stable / Positive / Negative)
Sort order
AAA → D (investment grade: BBB− and above). Countries without a rating sort last.
CategoryGradesMeaning
Prime / High GradeAAA, AA+, AA, AA−Extremely / very strong capacity
Upper Medium GradeA+, A, A−Strong capacity
Lower Medium GradeBBB+, BBB, BBB−Adequate capacity (investment grade floor)
Speculative / DefaultBB+ and belowJunk / high yield

Technical Indicators

Computed server-side from up to 5 years of daily closes (default ~1Y). Loaded on-demand when you expand a row. The series is sourced from Frankfurter using the same cross-rate logic as % returns.

RSI — Relative Strength Index (14-day, Wilder smoothing)

RS = avg_gain(14) / avg_loss(14)
RSI = 100 − (100 / (1 + RS))
Subsequent: avg_gain = (prev_avg_gain × 13 + gain) / 14
First 14-day avg gain/loss is a simple mean. Subsequent values use Wilder's exponential smoothing (equivalent to EMA with α = 1/14). Gains and losses are computed on the inverted (displayed) rate, not the stored rate.
OVERSOLDNEUTRALOVERBOUGHT03070100
Above 70 — Overbought · Below 30 — Oversold · 30–70 — Neutral

EMA — Exponential Moving Averages (50 & 200-day)

multiplier = 2 / (period + 1)
EMA_today = close × multiplier + EMA_prev × (1 − multiplier)
Seed: EMA_0 = SMA of first N closes
EMA-50 uses α = 2/51 ≈ 0.0385; EMA-200 uses α = 2/201 ≈ 0.00995. Both are seeded with a simple average of the first N data points.
Golden CrossEMA-50EMA-200
Golden Cross: EMA-50 crosses above EMA-200 (bullish)
Death Cross: EMA-50 crosses below EMA-200 (bearish)

Bollinger Bands (configurable)

Middle = SMA(N)
Upper = Middle + k × StdDev(N)
Lower = Middle − k × StdDev(N)
Default: N = 20 days, k = 2σ. Adjustable in the expanded panel: period 10–30 days, deviation 1.5–3σ. StdDev uses population standard deviation (not sample). Bands widen in volatile periods, contract in calm ones.
UpperMid (SMA)Lower
Price near upper band → potentially overbought · near lower → potentially oversold
Narrow bands → low volatility; breakout may follow

Support & Resistance (6-month lookback)

Local minima and maxima are identified over the past ~130 trading days using a 5-bar window: a point is a local minimum if it's lower than the 2 bars on each side (and vice versa for maxima). The median of all identified minima is used as support; the median of all maxima as resistance. Using the median rather than a single extreme reduces sensitivity to outliers.

Composite Signal

RSI condition takes priority over MA crossover:
> 70AnyOverbought
< 30AnyOversold
30–70EMA-50 > EMA-200Golden Cross
30–70EMA-50 < EMA-200Death Cross
30–70InconclusiveNeutral

Data Freshness & Caching

Current Rates1h CDNRBI archive (live) + local cacheRBI live fetch covers last 14 days; local cache covers 2005–present for USD, Apr 2022–present for EUR/GBP/JPY
INR Fallback4h CDNinvesting.com via BrowserlessUsed only when RBI archive is unreachable; market spot rate, not official fixing
Historical ECB24h CDNFrankfurterPre-Apr 2022 EUR/GBP/JPY, and 2Y/3Y/5Y for all; past dates immutable
10Y Yields4h CDNInvesting.com via Browserless+ 4h in-memory module cache; GitHub Actions pre-warms every 4h
S&P Ratings4h CDNWorldGovBonds via BrowserlessFetched in same Browserless session as yields
Technicals1h CDNFrankfurter daily seriesOn-demand when you expand a currency row

Disclaimer: Exchange rates, technical indicators, bond yields, and credit ratings are for informational purposes only. They are reference rates and aggregated data from central banks, financial benchmarking institutions, and third-party providers — not live transaction rates. Do not use for financial, trading, or compliance decisions without consulting authoritative sources directly.