KredereFX Monitor
← Back to dashboard

Data Sources & Methodology

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

Data Flow

EXCHANGE RATESMACRO DATAMSEI / RBIECBBOE · IMF · BNMFrankfurter v2Investing.comWorldGovBondsBrowserless.ioOur ServerDashboard

Exchange rates flow through Frankfurter (35+ central banks). For INR-base, MSEI is queried directly for RBI official rates; Frankfurter is the fallback. Macro data is scraped via Browserless.io and CDN-cached for 2 hours.

Exchange Rate Providers

ProviderCurrenciesPublishesMethod
MSEI / RBIUSD, EUR, GBP, JPY, AED vs INR~1:30 PM ISTDirect scrape; 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

MSEI / FBIL — Official RBI Reference Rates

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 totaling $25M+ required; outliers beyond ±3σ excluded. Cross-currency rates (EUR, GBP, JPY) are derived from the USD/INR reference using mean closing prices from the same window.

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

% 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

MSEI/FBIL gives direct INR rates. 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
MSEI: 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

Exchange Rates1h CDNMSEI / FrankfurterAuto-refreshes every 5 min; Refresh button busts CDN cache
Historical Rates1h CDNFrankfurterPast dates immutable — cache is effectively permanent
10Y Yields2h CDNInvesting.com via Browserless+ 2h in-memory module cache; daily cron at 2 AM UTC pre-warms
S&P Ratings2h CDNWorldGovBonds via BrowserlessFetched together with yields in one Browserless session
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.