Manual
How to read this dashboard — maintained in the brain repo's MANUAL.md.
About this manual
Plain-language reference for everything the system computes. Written for the
dashboard's Manual page; the deeper technical record is
quant_strategy_catalog.md (the "why") and dashboard_data_contract.md
(the exact data shapes).
Data & freshness
Thai: one local DuckDB for ~900 common stocks. SETSmart is the preferred EOD source; Yahoo Finance fills missing closed sessions in the same table when SETSmart is unavailable, with source and reference-date provenance. Quarterly fundamentals remain SETSmart-sourced and may be older than the latest price bar. The cron refreshes hourly 18:00–21:00 and retries overnight. The freshness gate is FRESH (current), LATE (1 day behind), STALE (>2 trading days — the system then refuses to publish stock picks rather than show stale ones). US: Tiingo adjusted prices + fundamentals for the S&P 500 + Nasdaq 100 + DJIA (~517 names), collected nightly since July 2026, back-filled to 2019. US books (20D/60D) and a six-horizon forecast ledger run in PAPER mode on price factors only (fundamentals lack pre-2023 history); the backfill uses today's index members, so US backtests carry survivorship bias — the forward journals, clean by construction, are the real US record. US cost model: $0.10/share → each pick shows its own round-trip cost in bp. Foreign flow (market level): daily investor-type totals (2013→now) from a public community sheet. Tested: NOT predictive at the index level — displayed as context only. Per-stock NVDR: live since July 2026 (2021→now from SETSmart exports, refreshed monthly by manual export). Two validated factors came from it: foreign_flow_5d (follow fresh foreign buying) and foreign_conviction (foreign buying into names near their 52w high — the strongest flow signal).
Universe
The tradeable universe is the top 200 Thai stocks by 20-day average value traded (with a 20M THB/day floor), recomputed point-in-time every day — so backtests never peek at today's list. The daily Telegram restricts its display to the official SET100. The Mid/Small Screen covers a second universe: ranks 201–500 with a 4M THB/day floor (~56 names) where different factors work.
Factors (the 70 mini-models)
A factor is one testable belief, e.g. "cheap stocks beat expensive ones." Each day every stock gets a score per factor; the factor's quality is whether that ranking predicts the NEXT period's returns — measured by the IC (rank correlation between today's scores and forward returns; +0.05 daily is respectable, +0.10 strong). Verdicts:
- CORE — significant, consistent in-sample AND out-of-sample, and not redundant with a stronger factor. The production shortlist.
- WORKS — real but >0.7 correlated with a CORE factor (same bet).
- MARGINAL — weak/borderline. BACKFIRES — significantly wrong-way (e.g. chasing "accumulation" loses money here). NONE — no edge. The honesty bar: sign must agree in-sample (2021–23) and out-of-sample (2024+), and the t-statistic is computed on non-overlapping windows (naive daily t-stats are ~3.5× inflated; we report the corrected one).
Rotation monitor ("what works NOW")
Factor verdicts are long-run averages. The weekly rotation monitor compares each factor's IC since the regime turn-date (2026-03-01) against its full out-of-sample record and flags risers, fallers, and sign flips. Short windows are noisy — a factor only changes verdict via the monthly re-grade; the monitor is the early-warning system.
Books (the portfolios)
A book = the top-N stocks from a blended score, rebalanced every N trading
days. Construction: factors are admitted and signed on in-sample evidence
only, grouped by theme (value, quality, defensive, …), sector-neutralized,
then combined. Weightings: equal, trailing-IC (each group's weight
follows its own rolling 12-month predictive power — decayed groups fade
out), or fast trailing-IC (6-month window, adapts to regime turns in
weeks; noisier). A hold-band keeps existing holdings until they fall
below rank N×3 — cutting turnover ~4× is the single biggest net-return
lever. Each horizon's exact recipe (weighting, book size, band) is chosen
by a tune/holdout split and stored in book_tuning.json; current full-OOS
net returns at 20bp round-trip cost: 5D +5.7%, 10D +10.8%, 20D +8.5%,
60D +14.5% per year (universe fell ~13%/yr over the same window).
1D/3D are forecasts, not books: the short-horizon edge (~0.15%/day) is
smaller than trading costs; they're tracked for calibration and used as
entry-timing hints.
Forecast ledger & journals (the exam)
Every published pick is written down BEFORE the outcome is known, then scored when its horizon elapses: the nightly forecast ledger (all six horizons), the weekly book journal, and the sleeve journal. The dashboard's Journal page shows live IC, hit rates, and buy-minus-avoid spreads as they mature. Rule of thumb: judge nothing on fewer than ~20 resolved periods. Backtest numbers are the hypothesis; the journal is the evidence.
Regime & market structure
Stretch is TREND-CONDITIONAL (learned the hard way, July 2026): the market's distance from its 100-day average means opposite things depending on whether that average is rising or falling. 13 years of data: when the trend is DOWN, buy compressed / fade stretched (contrarian). When the trend is UP, "stretched" has been the STRONGEST forward state (+0.61%/20 sessions) and a drop below the rising average the WEAKEST (−0.76%) — in an uptrend you respect stretch, stagger entries, and treat a break below the average as the real caution sign. The dashboard's regime card shows the conditional read; the old standalone "overbought" label is retired because unconditioned it averaged two opposite regimes (it read overbought for 108 sessions of a +22% rally). The earliest warning that a rising trend is ending is a BREADTH COLLAPSE: since 2021, breadth dropping under 40% (share of names above their 20d MA) while the 100d trend was still up preceded every trend break by 2-27 sessions, and the false alarms cost roughly nothing — the dashboard raises an alert when this fires (warning only, it does not change sizing).
Which index is which signal reading? The trend/stretch gate (gate2) and the composite exposure gate both read the SET Index (the headline index — 13 years of history, and the series the backtests validated). Breadth is computed over the liquid universe — every name above the 20M THB/day turnover floor, capped at the top-200 (the same universe the models trade — NOT SET50 or SET100). Is that basis trustworthy? Tested 2026-07-05 against the professional alternatives: whole-market breadth, official SET100 members, and top-100 all correlate ~0.95 with it — they measure the same thing — and the liquid-universe basis gave the WIDEST forward-return separation at the 40% warning cut, while official-SET100 breadth was the weakest separator (barely a signal). Whole-SET and SET100 breadth are still shown side-by-side on the market card for reference. Also know: 40% is basis-specific — whole-market breadth runs structurally lower (stale illiquid names), so 40% there is not comparable. The SET50 and SET100 numbers on the indices card are display levels only; no signal is computed from them. Note the two bases can disagree on timing: the SET Index's 100d MA turned up in Aug 2025, while the equal-weight top-200 index turned around Mar 2026 — big-caps led this recovery by months. The Overview's market section shows SET/SET50 states, breadth across three universes (narrow vs broad participation), trade quality (turnover concentration in the top-10 names, its historical percentile), new 52-week highs/lows, and foreign flow (context only). Highs watch lists names at 3-month highs with tier chips as they graduate to 6-month and 52-week highs — the 52-week high is the validated factor (longer anchors beat shorter: 252d > 126d > 63d, tested); the lower tiers are the attention funnel.
Sectors
Sector stances (overweight/underweight) come from momentum + breadth within sector. IMPORTANT: sector momentum FAILS over the full sample (sectors mean-revert like stocks) but has been the biggest riser since the March 2026 turn — stances are an informational lean, not a validated signal. Expand any sector row to see its top members by liquidity.
Mid/Small Screen (the "second universe")
The second universe rewards different behaviour: profitability, earnings surprises, and near-52w-high trend — factors that are weak in big caps — because thin coverage prices fundamentals slowly. The weekly sleeve screen picks a top-10 there (long-short Sharpe ~2 in backtest, but long-only was negative absolute through the bear). Positions are capped at 5% of a name's daily turnover — sleeve names are thin; respect the cap column.
Factor picks ("run this factor")
Every night the system scores all 69 factors and stores each one's top-10 and bottom-10. Click any factor anywhere in the dashboard to see its current lists. Direction is the factor's validated working direction (some are inverted — e.g. overnight_persistence is an AVOID signal). Sector-level factors give a whole sector's members the same score, so their "top 10" is really "the leading sector."
Costs & assumptions
All net numbers use 20bp round-trip (your ~8bp/side broker + slippage headroom) unless labeled otherwise. Returns are decimal fractions in the data, percentages in the UI. "Excess" = versus the equal-weight universe, the honest benchmark for a stock-picker. Long-short results assume shorting that is largely impractical in Thailand — read them as signal quality, not a tradeable strategy.
Glossary
IC rank correlation between scores and forward returns · t / NW-t significance corrected for overlapping windows · CAGR compound annual return · maxDD worst peak-to-trough loss · Sharpe return per unit of volatility (>1 good for long-short; long-only in a bear looks worse) · ADV average daily value traded · hold-band keep-until-rank-falls turnover control · OOS out-of-sample (data the model selection never saw) · NVDR the foreign-investor share class, proxy for foreign flow per stock · breadth % of stocks above their moving average · turnover concentration share of trading in the biggest names · mom20 / mom5 20-day / 5-day price momentum (percent change) · paper mode every position is simulated for the forward record — the system never places orders; real money waits for ~20+ journaled weeks · no new entry the hold-band kept last week's names — the normal, intended outcome most weeks, not a malfunction · book a model's top-N portfolio for one horizon (5/10/20/60 sessions).
Is it a buy or a sell signal? Every card belongs to one of three layers, and only one layer is for acting:
- ACTION (books / decision digest): the only buy-side trade layer. BUY list = paper-mode longs; the AVOID / UNDERWEIGHT list means "do not buy / rotate out if held" — it is NEVER a short-sell signal.
- ATTENTION (highs watch, momentum-volume radar, mid/small screen, research queue): all BUY-SIDE research prompts — "look at this name before the books do." None of them ever means sell. The highs watch is the attention funnel for the validated 52-week-high factor: 3m high = entering the funnel, 6m = strengthening, new 52w high = the tier that actually predicts continued outperformance.
- CONTEXT (regime, gate, breadth, flow, sectors): market state that sets sizing and patience; it never picks names in either direction.
How to actually use it (the decision flow)
The menu, in the order that matters. Two tabs are the job; everything else is optional depth:
- Decision (daily, ~2 minutes). Headline tells you the regime, the gate, and the single most notable change. Alerts tell you if anything needs attention (stale data, gate warnings, breadth collapse). If the headline says "no notable changes" — you are done for the day.
- Books (only when something changed). The digest says "N book(s) rotated names" → open Books, see the adds/drops, decide, journal it. A "no new entry" week means the hold-band kept last week's names — that is the system working, not a reason to look harder.
- Research queue (weekly, after the Saturday run). The triaged homework: research_now names first. Everything here is buy-side research, never a sell signal.
- Everything else is pull, not push: Market/regime when an alert points there or the tape feels different; Highs watch and the Momentum radar when you want ideas early; Sectors, Factor picks, Mid/small screen when researching a specific name; Journal monthly to watch the track record mature; Pipeline only when an alert fires.
Three layers, three different reactions: ACTION — the Books. The top-10 lists per horizon are the system's trades (paper mode). Using it live means mirroring a book's entries/exits at its cadence, sized within the max-position column. Everything else on the dashboard exists to inform, not to trade. ATTENTION — Screens, Highs watch, Momentum radar, Factor picks. These are watchlists: names worth a look, with the reason attached. No list here is a validated buy signal by itself. CONTEXT — Regime, Rotation, Sectors, Foreign flow. These explain the environment. A "sign flip" in the rotation monitor means a factor's edge reversed since the regime turn-date; "needs review" means exactly that — no automatic action is taken, because reacting to short-window evidence automatically is how systems overfit themselves. The books' trailing-IC weights already adapt mechanically at a measured pace; structural changes (adding/removing factors, redesigning books) happen deliberately, after discussion, when evidence accumulates. "Research only / paper mode" everywhere means: the system never places orders. It writes its picks into journals, grades itself, and earns trust — the human decides if and when real money follows.