Data Integrity

Every number on this site, sourced. A financial dashboard is only as trustworthy as its honesty about where the data comes from — so here is the whole ledger: what is live, what is a saved snapshot, what is computed, what is an honest illustration, and what is a placeholder. Nothing here is hidden, and nothing fabricated is dressed up as real.

22 of 34 surfaces carry real data (live / cached / computed / yours) · ledger as of 2026-06-18
YOURSYour own real data, entered or imported. PII is scrubbed before it is stored.
Example 1 · your real book/money · Mine vs Dream
SOURCEFund SuperMart statement
METHODHoldings imported, PII scrubbed (no name/account/advisor)
AS OF2026-05-30
ENGINEportfolio-data.ts REAL_HOLDINGS
⚠ LIMITA point-in-time statement; NAVs move daily.
LIVEFetched fresh from a public API on request, then edge-cached briefly.
Fear & Greed IndexDESK · Pulse
SOURCEfeargreedchart.com
METHODScraped composite, no key
AS OF≈5 min
ENGINE/api/* + fetchFearGreed
⚠ LIMITThird-party composite; methodology is opaque and US-centric.
THB / USDDESK · status strip
SOURCEBank of Thailand API
METHODOfficial daily reference rate
AS OFDaily
ENGINEfetchThbRate
⚠ LIMITReference rate, not a tradable quote; lags intraday FX.
US macro — Fed rate, CPI, yieldsDESK · Intel, /plan cycle
SOURCEFRED (St. Louis Fed)
METHODOfficial series via free API
AS OFDaily–monthly
ENGINE/api/macro · fetchMacro
⚠ LIMITOfficial data is revised; release lag of days to weeks.
Global & regional indices, assetsDESK, /markets
SOURCEYahoo Finance (free tier)
METHODQuote + history fetch
AS OF≈15 min delayed
ENGINEfetchAllRegional / fetchAssetClasses
⚠ LIMITUnofficial free feed; rate-limited, occasionally gappy.
World events & sentiment/events, /newsroom
SOURCEGDELT DOC 2.0
METHODEvent + tone query
AS OF≈15 min
ENGINE/api/world-news · /api/events
⚠ LIMITMedia-derived; correlation with prices is not causation.
Economic calendarDESK · Intel
SOURCEPublic calendar feed
METHODUpcoming releases
AS OFHourly
ENGINE/api/econ-calendar
⚠ LIMITConsensus estimates shift; times are exchange-local.
Market regime classification/regime, DESK
SOURCESupabase regime table (← causal pipeline)
METHODClassifier over macro features; deterministic fallback summary when DB is unavailable
AS OFDaily run
ENGINEingestion/regime.py · /api/regime
⚠ LIMITA probabilistic label, not a verdict; falls back to a synthetic summary without the DB.
Thai bond curves, spreads & turnover/yields, /api/thaibma
SOURCEThai Bond Market Association API
METHODAuthenticated government/corporate curves, average credit spreads, and EOD trading summary; daily JSON cache fallback
AS OFDaily after ThaiBMA publication
ENGINEsrc/lib/api/thaibma.ts · ingestion/bonds.py
⚠ LIMITPaid/trial credentials are required; without them the surface is explicitly marked illustrative.
Mr. Market Mood gaugeDESK + /money + subway
SOURCEFRED (VIXCLS, T10Y2Y, BAMLH0A0HYM2, NCBEILQ027S, GDP) + yfinance SET50 + live Fear&Greed
METHODVIX, yield curve, credit spreads from FRED; Buffett Indicator = corporate equities ÷ GDP; SET P/E market-cap-weighted from yfinance; each value scored −2..+2 by documented thresholds → composite mood. /api/mood overlays live Fear & Greed so every surface (gauge, Graham Diagnosis, subway P/E) reads one aligned source
AS OFdaily + live F&G
ENGINEingestion/market_mood.py → market-mood.json · /api/mood · src/lib/market-mood.ts · useMarketMood()
⚠ LIMITFear & Greed shows the labeled illustrative snapshot when its feed is unreachable (only marked live on a genuine response); S&P forward P/E is always illustrative (no free analyst-estimate source). Every signal carries its own LIVE/CALC/EST tag + as-of date.
CACHEDA committed JSON snapshot produced offline by an ingestion script.
SET50 daily OHLCV/trade, /scan, /api/technical
SOURCEyfinance (.BK tickers)
METHODDaily ingest → prices.json, edge-imported
AS OFLast ingest
ENGINEingestion/prices.py · fetch_all_to_json.py
⚠ LIMITEnd-of-day only; refresh depends on running the cron.
SET50 fundamentals — P/E, P/B, ROE, EPS, revenue/scan, /trade · Graham/Buffett scores
SOURCEyfinance (.BK tickers)
METHODDaily ingest via yfinance → fundamentals.json; Graham Number, Buffett Score, Margin of Safety computed from these figures
AS OFLast ingest
ENGINEingestion/fundamentals_refresh.py
⚠ LIMITYahoo Finance free API rate limits or limits the breadth of historical ratios; some sectors like banking use specialized metrics.
Thai macro — GDP growth, inflation, current account/plan · macro context, /signals
SOURCEWorld Bank Open Data (public API, no key required)
METHODWeekly ingest via World Bank REST API → macro snapshot; complements FRED with Thailand-specific official figures
AS OFLast ingest
ENGINEingestion/macro.py
⚠ LIMITWorld Bank data lags by quarters to a year; use for structural context, not near-term signals.
Efficient frontier & optimal weights/portfolio · Optimizer
SOURCERiskfolio-Lib over 3y SET50 returns
METHODMean-variance + HRP, Ledoit-Wolf cov → allocation.json
AS OFOn run
ENGINEingestion/optimize.py
⚠ LIMITOptimizers trust their inputs blindly; a reference, not advice.
Portfolio proxy history/money · Mine vs Dream
SOURCEyfinance proxy ETFs
METHODDaily proxy NAV → dream-history.json
AS OFLast run
ENGINEingestion/track_dream.py
⚠ LIMITProxy approximates the fund's driver, not its exact NAV.
Market Web — causal relationship graph/signals · MarketGraph
SOURCECurated market-graph.json + granger.json + market-states.json + signal-edge.json + narratives.json
METHODStatic trader-knowledge graph enriched offline: Granger edges to SET proxy, KMeans regime on cycle node, narrative clusters on tickers; trader lens filters day/swing/value
AS OFLast cache ingest
ENGINEingestion/market_graph.py · src/components/Desk/MarketGraph.tsx
⚠ LIMITCurated edges are conceptual; Granger ≠ causation or tradable edge. Regime chips are analogues, not forecasts.
COMPUTEDCalculated from real inputs — indicators, compounding, optimization.
Technical indicators/trade
SOURCESET50 OHLCV (above)
METHODEMA/RSI/MACD/BB/VWAP/ADX… computed in-app
AS OFPer render
ENGINEsrc/lib/technical.ts · trade-insights.ts
⚠ LIMITIndicators describe the past; they do not predict it.
Retirement projections/plan
SOURCEYour inputs (age, salary, savings)
METHODMonthly compounding + inflation + VUCA haircut
AS OFLive
ENGINEuse-plan-state.ts
⚠ LIMITNominal assumptions; real life is not a smooth curve.
Market States + today's analogue/patterns
SOURCEFRED T10Y2Y + yfinance ^GSPC/^VIX (2004–now, daily)
METHODKMeans (k=5, unsupervised) on z-scored VIX, yield curve, S&P 20d return and 20d vol → market regimes; today's analogue = nearest neighbours in feature space, with the S&P 500's actual forward 30/90-day returns
AS OFdaily
ENGINEingestion/signal_history.py → market-states.json · src/lib/market-states.ts
⚠ LIMITAnalogues are statistical neighbours, not forecasts — small samples, and the future need not rhyme. Credit spreads are excluded from the model (FRED truncates the free series); the SET is not in the feature set (it tracks global states via US data).
Granger causality — what statistically precedes SET?/patterns
SOURCEFRED (VIX, yields, Fed rate) + yfinance (S&P, Oil, DXY, BTC, Gold, Copper, JPY, THB, Nikkei, HSI)
METHODGranger F-test at lags 1–10 for each series vs SET returns; optimal lag by AIC; significant at p<0.05. Structural context, not signals — Granger causality ≠ tradable edge.
AS OFdaily
ENGINEingestion/granger.py → granger_latest.json → src/lib/data/cache/granger.json
⚠ LIMITGranger causality is a statistical property of the historical sample. Relationships break as markets adapt. Does NOT imply a live trading edge.
Forecast calibration — does the 80% band cover 80%?/signals · ForecastCalibration
SOURCE^SET.BK historical prices (yfinance)
METHODWalk-forward ARIMA(1,1,1) pseudo-backtest: 120 windows × 1yr training → 5-day forecast → actual. Coverage80 = fraction of actuals inside the 80% interval.
AS OFon-run
ENGINEingestion/calibrate_forecast.py → src/lib/data/cache/calibration.json
⚠ LIMITRetrospective backtest, not live out-of-sample tracking. Model re-fits on each window. Coverage can change as market volatility regimes shift.
Signal Edge — does the signal work?/patterns
SOURCEFRED T10Y2Y + yfinance ^GSPC/^VIX (2004–now, daily)
METHODConditional forward-return analysis — the S&P 500's actual 30/90-day forward-return distribution by market state and VIX / yield-curve bucket, measured against the unconditional baseline; edge = conditional mean − baseline mean (pp)
AS OFdaily
ENGINEingestion/signal_edge.py → signal-edge.json · src/lib/signal-edge.ts
⚠ LIMITHistory, not a forecast. Where a bucket ≈ the baseline it carries no usable edge — and that is shown, not hidden. Small buckets (n<30) are noisy; read the dispersion (p25–p75), not just the mean.
ILLUSTRATIVEAn honest model or baseline. A shape to reason with, never a promise.
Forward View — 90-day cones/signals, /money hover
SOURCEReal 1y proxy prices
METHODDrift + volatility cone (median + 10/90 band); upgrades to TimesFM on the M3
AS OFOn run
ENGINEingestion/forward_view.py
⚠ LIMITA statistical range from past drift/vol — not a learned forecast yet.
Dalio Big-Debt-Cycle stages/signals web, /plan
SOURCERay Dalio, Big Debt Crises (2018)
METHODPattern match across ~16 historical cycles
AS OFStatic framework
ENGINECycleIntelligencePanel · plan-data
⚠ LIMITStructure recognition, no fixed duration; not a market call.
SET 5-day forecastDESK · forecast
SOURCESET history + macro covariates
METHODdarts LightGBM (ARIMA fallback), 80/95% bands
AS OFDaily run
ENGINEingestion/forecast.py
⚠ LIMITBacktested accuracy varies by regime; bands are wide for a reason.
Kronos foundation model forecast (SET)/signals · KronosForecast
SOURCEKronos-mini (NeoQuasar/Kronos-mini, 4.1M params, pretrained on 45+ global exchanges)
METHODZero-shot ARIMA-comparable forecast on SET50 tickers. 400-day context, 20-day prediction horizon. 3 sample paths averaged. Bands are vol-cone (95% CI), not model uncertainty.
AS OFdaily
ENGINEingestion/kronos_forecast.py → src/lib/data/cache/kronos-signals.json
⚠ LIMITZero-shot transfer — not fine-tuned on SET-specific dynamics. Not yet validated against SET forward returns. Treat as one additional perspective alongside the vol-cone baseline, not a prediction.
REFERENCEA historical fact or static reference figure.
2024 world index returns/plan
SOURCEPublished full-year 2024 figures
METHODStatic reference table
AS OFFY2024
ENGINEplan/page WORLD_2024
⚠ LIMITHistorical context only; past returns ≠ future.
Dream · Ideal portfolio/money · Mine vs Dream
SOURCEHindsight long-term allocation
METHODEducational scenario with real fund codes
AS OFStatic
ENGINEportfolio-data.ts HOLDINGS
⚠ LIMITHindsight allocation — what one *could* have held, not a record.
PENDINGPipeline built and ready — awaiting credentials or the first data pull.
Earth Signal — satellite alt-data/signals
SOURCEAlphaEarth Foundations (DeepMind) via Google Earth Engine
METHOD64-dim embedding year-over-year shift over Thai economic sites → SET tickers
AS OFAwaiting GEE auth
ENGINEingestion/alphaearth.py
⚠ LIMITNo numbers shown until real embeddings are pulled — never fabricated.
Usage analyticsapp-wide
SOURCEFirebase / Firestore
METHODPage-view + trade events
AS OFAwaiting env keys
ENGINElib/firebase · AnalyticsObserver
⚠ LIMITRuns in harmless mock-key mode until NEXT_PUBLIC_FIREBASE_* is set.
MOCKSynthetic placeholder so the app renders with zero API keys. Never trade on it.
Research committee preview/research
SOURCELocal agent contract registry + deterministic brief engine
METHODMacro/value/tape/event/portfolio/risk roles compose a research workflow simulation from mock data
AS OFPer render
ENGINEsrc/lib/research-agents.ts · /api/research/brief
⚠ LIMITWorkflow preview only: it uses mock data and does not call a live model or live market feed.
Scanner fundamentals/scan
SOURCEMOCK_STOCKS
METHODSynthetic Graham/Buffett metrics
AS OF
ENGINE/api/scanner (no Supabase)
⚠ LIMITPlaceholder until the Supabase fundamentals feed is connected.
Pulse breadth / indicesDESK · Pulse fallback
SOURCEMOCK_INDICES / MOCK_SET
METHODSynthetic breadth + index levels
AS OF
ENGINE/api/pulse
⚠ LIMITFallback when the live feed is unavailable.
Graham Diagnosis — portfolio autopsy/money · Mine vs Dream
SOURCEHardcoded Dream-vs-Real comparison
METHODFive Graham checks (entry mood, P/E<15, diversification, Fear&Greed, defensive hedge) → 5/5 vs 0/5
AS OF
ENGINEDreamPortfolio.tsx GAP_ANALYSIS
⚠ LIMITHand-set figures to teach Graham's margin-of-safety lesson — not measured from the live books.
Maintained by hand in src/lib/provenance.ts — keeping it honest is a deliberate act, not an automated one. Research preview · not financial advice.