Methodology

Transparent methodology for every metric we calculate. Data sources, formulas, update frequencies, and known limitations — all documented.

Real Yield

Nominal yield adjusted for local inflation using the Fisher formula:

real_yield_local     = (1 + nominal_yield) / (1 + inflation) − 1
real_yield_investor  = (1 + real_yield_local) × (1 + fx_change_1y) − 1
  • Nominal yield from Ticker.info'sdividendYield (Yahoo Finance). Trailing 12-month.
  • Inflation: FRED monthly CPI YoY where available (JP, KR, ID, IN, US, GB, EU), otherwise World Bank annual CPI YoY. TH/MY/SG/PH use WB annual. Taiwan has neither and is excluded from real-yield rankings.
  • FX change: point-to-point 1Y move of stock-country currency vs investor currency, from daily Yahoo Finance forex closes. Not volatility-adjusted.
  • Refresh: dividend yields daily at 02:30 UTC; real-yield snapshots recomputed daily at 03:00 UTC.

Real Yield methodology details →

REIT Tracker

  • NAV per share from Yahoo Finance bookValue. Price-to-NAV from priceToBook. Updated daily.
  • NAV Premium/Discount = (price − NAV) / NAV × 100. We flag REITs with < −60% discount as likely stale-NAV artifacts and exclude them from the "Biggest Discounts" homepage list.
  • Distribution Safety Score (0–100): four components, 25 points each if threshold passes — payout ratio < 90%, coverage ratio > 1.1×, occupancy > 90%, debt/assets < 40%. Components missing from yfinance (coverage, occupancy, WALE) stay null and cap the maximum achievable score.
  • Aristocrat flag: 10+ consecutive years of distributions and no year-over-year cut in the last 5 years. Derived from Ticker.dividends history.
  • Refresh: fundamentals 02:45 UTC daily, derived metrics 03:15 UTC daily.

REIT methodology details →

Foreign Flows

Daily aggregate foreign-investor net buy/sell pulled directly from each exchange's public release. Phase-1 coverage:

MarketSourceCadenceTier
TaiwanTWSE BFI82U + TWT38U JSONDailyAggregate + per-stock top-20
IndiaNSE /api/fiidiiTradeReactDailyAggregate FII + DII
JapanJPX weekly XLSWeekly (Thu)TSE Prime section
Hong KongHKEX Highlightsearch ASMXDailyTurnover-only proxy
MalaysiaBursa HTML (Playwright)DailyAggregate by investor type
PhilippinesPSE monthly PDFMonthly (3rd)Monthly net-foreign

Beta notice: derived metrics (Pan-Asian Flow Index, Smart Money Score, divergence alerts) require 6–8 weeks of accumulated daily history before activation. Until then only raw daily aggregates are shown.

Foreign Flows methodology details →

Data sources

  • Yahoo Finance via the yfinance Python library — daily OHLCV, dividend history, ticker info, forex pairs.
  • World Bank Open Data — annual CPI (indicator FP.CPI.TOTL.ZG) and other macro series. Direct HTTP rather than wbgapi, since the latter aborts on slow-connection partial-JSON responses from our DC IP.
  • FRED — US macro (Fed Funds, treasury spreads, WTI oil, gold, HY spread) weekly; OECD-sourced monthly CPI (CPALTT01xxM659N) for countries where FRED carries them.
  • Exchange-direct scrapers — TWSE, NSE, JPX, HKEX (via ASMX), Bursa Malaysia (via Playwright — the only source that requires a real browser because Cloudflare blocks datacenter-IP HTTP requests), PSE (monthly PDF).

Update schedule

DataSourceFrequencyCron (UTC)
Index levelsYahoo FinanceDaily02:00
Stock pricesYahoo FinanceDaily02:10
Forex ratesYahoo FinanceDaily02:15
Dividend yieldsYahoo FinanceDaily02:30
REIT fundamentalsYahoo FinanceDaily02:45
FRED US macroFREDWeekly (Mon)Mon 03:00
Asian monthly CPIFRED (OECD)Weekly (Mon)Mon 05:00
World Bank annualWorld BankMonthly1st 04:00
Real-yield recomputeDerivedDaily03:00
REIT metrics recomputeDerivedDaily03:15
TWSE foreign flowsTWSEDaily10:30
HKEX highlightsHKEXDaily08:30
Bursa participationBursaDaily12:00
NSE FII/DIINSEDaily14:30
JPX investor-typeJPXWeekly (Thu)Thu 08:00
PSE monthly reportPSEMonthly3rd 06:00

Quality commitment

  • Every metric page documents known limitations in-line.
  • Outliers — e.g., REITs with < −60% NAV discount — are flagged rather than shown at face value on summary pages.
  • Collector runs are logged in the data_source_runs table; failures trigger alerts in our internal dashboards.
  • User-reported errors should be sent via the Contact page with the affected URL and value.