The forecaster predicts how a whole industry (one of the Fama-French 48 sectors — Drugs, Banks, Oil, Chips, …) will move over the next four weeks: the median call plus a P10–P90 confidence band. Simple mode instead fits plain regression trend lines to a single company's price.
Forecast modes
Complex · industry (default) — the trained Event-Aware model. It reads a year of the industry's equal-weighted price index, its member companies' SEC 8-K filings, and global world events from the knowledge graph, and predicts one number: the index's next 4-week average vs its trailing 4-week average.
Simple · company — a linear regression (straight trend line) plus a polynomial regression (curved trend line) fitted on the fly to exactly the history interval you selected for one company. Price history only — no events, no trained model needed.
Run a forecast
Industry — pick one of the 46 forecastable sectors (member counts shown). In Simple mode this becomes a company search box instead.
8-K event scenario — the event-driven core: ask “what does the model expect if this 8-K item is filed today?”. Pick an item type (e.g. Director or Officer Change) and how many member companies file it; the chart adds a teal line with the conditional forecast and the Δ vs baseline. One filing rarely moves a whole industry — sector-wide waves show clearer effects.
History (days) — how much past context to display (40–1000). In Simple mode this is also the regression fit interval, and the forecast extends ~25% of it ahead (3–21 trading days).
Trend lines — optional check-boxes (industry mode): overlay a linear and/or polynomial regression fitted to the displayed index history and extrapolated across the forecast window. Off by default; tick either or both — the chart updates instantly. They are descriptive fits for eyeballing momentum, not model output.
Metric tooltips — hover (or tap) any statistic above the chart — direction accuracy, P10…P90, index value, Δ pp, … — for a plain-English explanation with a worked stock-price example.
Δ vs market · significance — each industry forecast also reports whether the sector's recent 4-week move genuinely diverged from the market or is within noise: four statistical tests (paired drift, Wilcoxon, β-adjusted event study, placebo baskets) run against the market with the industry's own members excluded. ✓ marks p < 0.05 on the β-adjusted test; the footer lists all four p-values. See “How do we Forecast” for the full methodology.
Click Forecast (or press Enter).
Reading the industry chart
Blue — the industry's equal-weighted return index, rebased to 100 at the left edge of the chart.
Grey dashed — the trailing 4-week average of the index (what the model measures "up or down" against).
Purple dashed — the model's median prediction of the next 4-week average, drawn flat across the coming 20 trading days. Purple above grey = the industry is predicted to rise.
Shaded band — P10–P90 range of that prediction (model uncertainty).
Amber bars (right axis) — daily 8-K filings by the industry's member companies. These counts, total and per item type, are fed to the model's encoder — hover a bar to see the item-type breakdown driving that day.
Teal dashed (scenario runs only) — the forecast conditional on the chosen 8-K filings happening at the anchor day; the gap to the purple line is the event's estimated impact in percentage points.
The stats row shows the predicted move in %, its P10–P90 range, and this industry's real accuracy on held-out 2024→2026 data.
Reading the company chart (Simple)
Blue — historical closes · Purple dashed — linear trend · Amber dotted — polynomial trend · Grey dashed — broad-market baseline rebased to the stock's start.
No confidence band: a least-squares band on autocorrelated prices would be misleadingly narrow.
Export
Use Export PDF to save the current forecast — summary stats and chart — as a PDF via your browser's print dialog (choose “Save as PDF”).
Ƒ
How do we Forecast
The model in one paragraph
Forecasts come from an Event-Aware Temporal Fusion Transformer (TFT) that models whole industries, not single stocks. Every company in the knowledge graph is classified into one of the Fama-French 48 industries (via its SEC SIC code — 96% coverage after an EDGAR backfill), and each industry gets an equal-weighted return index: the average daily log-return of its member companies, compounded. The network reads the last 252 trading days of that index (returns, volatility, member count, the members' 8-K filing intensity by event type, and global world events) and predicts one number: the index's next 4-week average vs its trailing 4-week average, as three quantiles — P10, P50 (median), P90 — the purple line and shaded band on the chart.
How the pieces fit together
Data flow: industry-aggregated graph features → 252-day encoder → single-step decoder → three quantiles of the next 4-week-average move.
How the training data is built (v2 restructuring)
Industry classification — every company's SEC SIC code (fetched from EDGAR for 96% of the 20,363 companies) maps it into one of the Fama-French 48 industries. Bucket 48 “Other” and unclassifiable companies are excluded, leaving 46 usable industries built from 19,287 companies.
Index construction — an industry's daily value is the average log-return of every member with a price that day, compounded into an index. Averaging returns (not prices) keeps the index immune to IPOs, delistings, splits, and penny-stock noise; days with fewer than 5 members are dropped; a company's first trading day contributes no return.
Smoothed target — daily industry moves are noisy, so the model predicts the average of the next 20 trading days minus the average of the last 20 of the index log-level: “is this industry's coming month better than its past month, and by how much?”
No-leakage rules — 8-K filings made on weekends/holidays roll forward to the next trading day (never backward); the encoder sees only days up to the anchor; train/validation/test splits are separated by a 20-day embargo equal to the forecast horizon.
Event scenarios — the "what if" mode injects hypothetical 8-K filings (a chosen item type × count) into the anchor day's event channels, exactly the way real filings enter the encoder, and re-runs the model. The difference between the conditional and baseline forecasts is the model's estimated near-term impact of that event type on the industry.
Training & validation loss
Quantile (pinball) loss per epoch for the production FF48 model. With 46 heavily-overlapping series the network starts memorizing after the first pass — validation is best at epoch 0 and early stopping deploys exactly that checkpoint; training loss falling while validation rises is textbook overfitting, caught and discarded.
Trained on 117,741 windows over 46 industry indices built from 19,287 classified companies (2010 → Jul 2021); validated on 26,818 windows (Aug 2021 → Jan 2024); tested on 26,754 windows (Feb 2024 → Jun 2026). Splits are strictly time-ordered with a 20-trading-day embargo, so the model is always scored on a future it has never seen.
Performance on the held-out test set (26,754 forecasts, Feb 2024 → Jun 2026)
Every forecast is compared against two honest baselines: always-flat (predict “no move”; its direction score is the majority-direction rate) and momentum (predict that the last 4-week trend simply repeats).
Metric
Model
Always-flat
Momentum
What it means
Direction accuracy
66.4%
57.9%
57.4%
How often the up/down call on the next 4-week average is right — +8.5 points over the best naive strategy (validation period: 73.8% vs 65.7%). Significance-tested below — decisive vs momentum, not yet at 5% vs the best fixed call.
Mean absolute error
0.0396
0.0452
0.0549
Average miss on the predicted 4-week move, in log-return units (0.0396 ≈ 4.0 percentage points of index move) — 12% tighter than always-flat, 28% tighter than momentum.
RMSE
0.0531
0.0610
0.0736
Same comparison with big misses weighted harder — the model's edge survives outlier weighting.
How these numbers were obtained
Held-out evaluation — the deployed weights are the epoch-0 checkpoint (best validation loss), reloaded from the saved bundle and scored once on the test region; no test data ever influenced training, feature scaling, or model selection.
One forecast per industry per trading day — 26,754 test forecasts = every (industry, anchor day) pair from Feb 2024 to Jun 2026 across the 46 industries; the reported numbers pool them all, with no cherry-picking of dates or sectors.
Skill varies by industry — direction accuracy ranges from ~75% (Guns, Fun, BldMt) down to ~55% (Food, Insur). The stats row and footer of every chart show the selected industry's own held-out accuracy, from the same evaluation.
Why it clears the coin-flip bar that single stocks couldn't — the previous per-company model scored 51.6% direction accuracy (barely above chance, as efficient-market theory predicts for liquid single names). Industry aggregates average away idiosyncratic noise and move more slowly, so real, learnable structure remains — the restructuring, not a bigger network, is what bought the extra ~15 points.
Statistical significance testing — is the model's edge real?
Beating a baseline on average is not enough: with 26,754 test forecasts the difference could still be luck, because those forecasts are massively dependent — consecutive anchor days share 19 of 20 future days and 251 of 252 encoder days, and all 46 industries live on the same trading calendar. A naive t-test that pretends the 26,754 errors are independent would overstate the evidence absurdly. We therefore test the edge the way the forecasting literature prescribes:
Collapse to one number per trading day — model-vs-baseline loss differentials are averaged across the 46 industries per anchor date (583 test dates), removing the cross-sectional dependence.
Diebold–Mariano test with Newey–West (HAC) variance — the per-date differential series is still autocorrelated (overlapping 20-day smoothing windows), so its long-run variance is estimated with a Bartlett kernel at lag 40 = 2× the smoothing window, and the t-statistic uses that corrected variance.
Per-industry tests + FDR — the same DM/HAC test runs inside each of the 46 industries, and because scanning 46 hypotheses at once guarantees a few lucky p-values, the per-industry p's are Benjamini–Hochberg corrected into false-discovery-rate q-values.
Read honestly: the model's error reduction is statistically unambiguous (p-values around 10⁻⁶ survive even the harsh HAC correction; on validation the same test gives p ≈ 4×10⁻¹³ with 41/46 industries significant), and its direction calls beat momentum decisively. But the +8.5-point direction gap over the best fixed call — a baseline chosen in-sample, so a deliberately hard bar — does not clear 5% significance, because directional hits cluster in market regimes and the effective sample is hundreds of dates, not tens of thousands of windows. Per-industry accuracy badges should be read with their q-values (shown in the chart footer), not their raw percentages. This report (ff48_significance_report.json) is regenerated automatically at the end of every training run, so no future model ships without its significance audit.
Statistical significance testing — is an industry's move real?
Every industry forecast also answers a second question, live: has this industry actually been moving differently from the market over the trailing 4 weeks, or is the gap noise? The market benchmark is the equal-weighted mean return of all classified companies excluding the industry's own members (leaving them in would attenuate the very effect being measured — an industry with weight w only shows (1−w) of its true divergence). Four tests run on the last 20 trading days, in increasing order of rigor:
Naive slope comparison (shown for reference, never trusted) — the textbook move: fit ln P = a + b·t to both log-price series, t-test bindustry − bmarket with Welch–Satterthwaite dof. It is statistically broken twice over: it treats the two series as independent when they are strongly correlated (misstating Var(bS − bM), which needs the −2·Cov term), and it regresses near-random-walk levels on time — the classic spurious-trend regression whose autocorrelated residuals make the t-statistic reject far too often. On live data it reports p < 0.0001 for practically every industry, every day — a working demonstration of manufactured significance. We compute it only to show what the valid tests correct.
Paired drift test (the valid version of the same idea) — because both regressions share one time index, bS − bM equals the slope of the difference series Dt = ln St − ln Mt, which handles the correlation automatically; and differencing Dt (the cure for the spurious regression) leaves dt = rS,t − rM,t, so the whole construction collapses to a one-sample t-test of E[dt] = 0 (t = d̄ / (sd/√n), n−1 dof). A Wilcoxon signed-rank test on the same dt rides along as a fat-tail-robust check — with n = 20 days, one crazy day can dominate a mean.
Market-model event study (the headline p-value in the stats bar) — a raw return gap conflates leverage with divergence: a β = 1.3 industry "diverges" mechanically whenever the market moves. So we first estimate rS = α + β·rM + ε on the 120 trading days before the window, then compute abnormal returns ARt = rS,t − α̂ − β̂·rM,t in the window, cumulate to CAR, and test CAR against its forecast-error-corrected variance Σσ̂²(1 + 1/T + (rM,t − r̄M)²/Σ(rM,τ − r̄M)²). This answers what people usually mean: did the industry move beyond its normal sensitivity to the market.
Placebo (permutation) test — the assumption-free cross-check: draw 2,000 random company baskets of the same size from the classified universe, compute the identical statistic for each (its own members excluded from its own benchmark, symmetrically), and report the fraction of draws at least as extreme (add-one smoothed, two-sided). It respects cross-stock correlation by construction. One honest subtlety: random baskets do not preserve an industry's internal co-movement, so for tightly coherent sectors the placebo p tends to run more liberal than the paired t — when the two disagree, the paired t-test is the conservative reading.
Power, stated plainly: with n = 20 days, significance at 5% needs |d̄| ≥ 2.09·sd/√20 ≈ 0.47·sd per day. For a typical industry with ~1% daily tracking volatility that means roughly 9–10% of cumulative divergence in four weeks just to reach the boundary (the exact threshold for the selected industry is computed per request) — so absence of significance is weak evidence of absence, and a non-significant gap is never evidence that nothing happened. Conversely, when you scan 46 industries at once, expect ~2 spuriously "significant" ones at p < 0.05 — treat a lone ✓ as a lead, not a verdict.
Where we go next
v2's industry restructuring was our “mindful data processing first” step — cohorts with a denoised target — and it moved the needle. The same philosophy drives what's next:
Band calibration — audit P10–P90 coverage on validation windows and conformally widen/narrow the band per industry so “80% band” means 80% empirically.
Company-relative forecasts — predict a stock's move relative to its industry index (the part events actually explain), reintroducing single-name forecasts on top of the industry signal rather than instead of it.
Richer event features — filing-text embeddings and severity scores for 8-K items, rather than daily counts by type alone.
Fresh anchoring — scheduled refresh of the price cache so industry forecasts always anchor at the latest close rather than the latest snapshot.
Overfitting headroom — validation bottoms at epoch 0; larger sample strides, stronger dropout, or fewer parameters may unlock further gains from the same data.
▲
MarketLattice · Industry Forecast
▾
Advanced options
Pick an industry and click Forecast to see its equal-weighted index history and the model's prediction of the next 4-week average, with a confidence band. Advanced options holds event scenarios, trend lines, and the per-company Simple mode.
Industry index (equal-weighted)Predicted next 4-week averageTrailing 4-week averagePolynomial trendConfidence band (P10–P90)8-K filings by member companies (model input)Scenario forecastLinear trend (fit + extrapolation)Polynomial trendMarket · equal-weight IQR index (rebased)