Appearance
Predictions
Every price forecast the system has ever made, sorted with the most recent first.
How a Prediction Is Made
The system doesn't just ask the AI for a number. It follows a multi-step process:
1. Thesis First
Before any price prediction, the LLM produces a qualitative thesis — a reasoning document that answers:
- Direction: Is the stock likely to go up or down?
- Conviction: How strong is the evidence? (0–100 scale)
- Regime: Is the stock trending, mean-reverting, volatile, or range-bound?
- Scenarios: What are the bull case and bear case, with probabilities?
- Falsifiable hypotheses: Specific, testable predictions like "If RSI crosses below 30, the thesis is wrong"
The thesis is the foundation. Everything else builds on it.
2. Tiered Pricing
Once the thesis is set, the system picks the best available method to produce a numeric price:
| Tier | What's Used | When Available |
|---|---|---|
| Tier 1 | Your personal quantile ML model (5 models predicting q10/q25/q50/q75/q90 of returns) | After ~100+ resolved snapshots |
| Tier 2 | Pooled model trained across all users (single q50 median model) | After enough data accumulates |
| Tier 3 | Sector-transfer model (from a similar company, single q50 median model) | When another ticker in the same sector is trained |
| Tier 4 | Thesis heuristic (direction + rough magnitude from the thesis) | Always available — no training needed |
Tier 3 details: Sector-transfer has a three-level internal fallback:
- Models from other tickers in the same GICS sector (model type
sector_quantile_q50) - A pooled model (
pooled_quantile_q50) trained for this specific ticker - Any pooled model across all tickers
Because only a single q50 model is available at Tier 3, the remaining quantile bands (q10/q25/q75/q90) are estimated from volatility. Tier 3 predictions also receive a 30% confidence penalty compared to Tier 1–2.
Each tier is automatically performance-gated: it's downgraded one level if its recent band coverage drops below 40%, or if its price-normalized Winkler score (the interval score as a % of price) regresses beyond that ticker/horizon bucket's own historical baseline (≥1.5×, or above a 50% default for new buckets). You never see a bad model's output.
How Predictions Improve Over Time
When you first add a ticker, predictions start at Tier 4 — the system has no historical data to learn from, so it relies on the thesis heuristic (direction + rough magnitude from the LLM). These predictions are immediately available, but their accuracy improves as the system accumulates experience.
The first retrain cycle triggers a backfill — historical snapshots are reconstructed from existing stock price data and resolved with their known outcomes. This can generate hundreds of resolved snapshots in a single run, moving the system to Tier 1 (your personal quantile ML model) on the same cycle. From there, every new prediction the system makes and every accuracy check it runs adds another resolved snapshot to the training pool. Models are retrained automatically, incorporating the latest patterns.
The result: predictions are useful from day one, tighten over the first few weeks, and continue improving as more data accumulates.
Prediction Sources
Each prediction is tagged with a prediction source — a label that tells you exactly which method produced the price. This helps you understand the quality and origin of any given forecast:
| Source | Tier | What It Means | Quality |
|---|---|---|---|
| quantile_gbm | 1–3 | A trained ML model produced the price. This is the best-case scenario — the system has enough historical data to make data-driven forecasts. | Best |
| heuristic_override | 4 | No trained model was available, so the system derived a price from the thesis. It looked at the LLM's conviction, probability skew, and direction to estimate a numeric target. This only happens when the thesis is confident enough to produce a material move (above ±0.1%). | Good (with trained thesis) |
| llm_numeric | 4 fallback | The thesis heuristic decided the expected move was too small to be meaningful (below the ±0.1% materiality guard), so it stepped aside and the LLM's original numeric estimate was kept as-is. Think of it as "the system didn't have a strong enough signal to override the baseline." | Baseline (backward compat) |
| sentiment_fallback | 4 | Intermediate predictions only. No thesis existed, or the thesis heuristic fell below the ±0.1% materiality guard for at least one offset, so the price came from short-term sentiment drift instead. The source tag reflects the actual mechanism that produced the price. | Baseline (intermediate) |
| statistical_baseline | 4 | Neither a trained model nor a usable thesis was available (for example, an AI outage), so the regime-aware statistical forecast — computed from price history alone — became the point estimate. This is a statistically grounded fallback, more trustworthy than a sentiment placeholder. | Grounded fallback |
In practice: Tier 1–3 predictions always use quantile_gbm. Tier 4 predictions use either heuristic_override (confident thesis, including neutral theses with moderate+ conviction which produce a small symmetric signal), llm_numeric (immaterial move), or statistical_baseline (no usable thesis at all). Intermediate updates use heuristic_override (confident thesis), sentiment_fallback (no thesis / immaterial move), or statistical_baseline (when the statistical forecaster is enabled and takes over as the honest fallback). As more tickers accumulate training data, you'll see fewer Tier 4 sources and more quantile_gbm over time.
Reconciling the AI and the Model
When a trained model is available, the final forecast isn't produced by one method blindly overruling the other. The system blends the model's forecast with the AI's baseline, weighted by how confident each one is. The practical effects you'll see:
- They agree on direction → confidence gets a small boost.
- The expected move is large → the confidence band is widened and confidence is reduced in proportion to how big the forecast move is. The larger the expected swing (beyond a small threshold), the wider the range and the lower the confidence (with a floor, so it never collapses to zero) — because uncertainty scales with move size, a big projected move gets a proportionally honest band.
- Uncertain evidence → the combined forecast is pulled toward a flat, neutral estimate rather than a confident bet.
The result is summarised for you in the Model Reconciliation panel on the Reasoning page: it shows which method produced the price (a blended pool, a GBM override, an error-correction nudge, a heuristic price, a statistical-baseline fallback, or an AI-only estimate when no model exists), the expected return, and the final price. A larger expected move means wider bands and lower confidence by design.
At a glance: how the AI, the ML model, and the market-based checks combine into your final forecast:
The panel also shows a third, independent view: a statistical layer computed from the stock's own price history (no news, no ML). Most of the time it appears as a quiet "shadow" record used to improve FIN over time; occasionally — when the model and thesis are both unavailable — it becomes the actual fallback price (tagged statistical_baseline). When it disagrees sharply with the published forecast, treat that as a useful counter-signal rather than noise.
The Options-Market Band Floor (IV Floor)
There's one more check on the band, and it comes from the options market rather than the model or the statistics.
Every prediction already pulls the stock's 30-day at-the-money implied volatility — the options market's own forward-looking bet on how much the stock will move. FIN turns that volatility into an expected-move range over the forecast horizon (an 80% range, matched to the model band's coverage) and compares it to the band it actually produced:
- If FIN's band is already as wide as (or wider than) the market expects → nothing happens.
- If FIN's band is much tighter than the options market is pricing in → the band is widened to acknowledge that traders are paying for a bigger move, and the confidence score is trimmed a little.
This is a one-sided floor: it can only ever make the band wider (never narrower), and it never moves the point price — implied volatility is a measure of scale, not direction. It is independent of the statistical plausibility anchor (which looks at the stock's own price history), so the two don't double-count.
You'll see this in action as an "IV floor" flag in the Reasoning report whenever the check fires — watch when the band is only mildly inside the market's move (a small confidence trim), and violation when it is far inside (a larger trim and a wider band). A wide band carrying an IV floor note is FIN being honest that the options market expects more turbulence than the model alone assumed.
3. Self-Critique
A second LLM pass reviews the thesis for:
- Direction consistency — Does the direction match the technical regime?
- Scenario plausibility — Do the bull/bear probabilities add up?
- Falsifiability — Are the hypotheses actually testable?
- Horizon alignment — Does the narrative fit the prediction timeframe?
If the critique finds issues, the thesis is revised before the prediction is saved.
4. Feature Snapshots
Every prediction run saves a complete feature snapshot — all the raw data that went into it:
- Technical indicators (RSI, ATR, trend, volatility)
- Sentiment scores
- Psychology bias scores
- Fundamental data (P/E, earnings growth, etc.)
- Market context (beta, correlation vs SPY)
- Options data (put/call ratios, implied volatility)
- The thesis features (conviction, regime probabilities, etc.)
When the target date passes, the accuracy tracker resolves the snapshot with the actual outcome. Resolved snapshots become training data for the ML models — which means the system gets smarter over time.
What's in the Table
| Column | What It Means |
|---|---|
| Date | When the prediction was made |
| Target Date | The future date the prediction is for |
| Current Price | The stock price at the time of prediction |
| Predicted | What the system thinks the price will be on the target date |
| Diff | Difference between predicted and current price. Up arrow (↑) = predicted to rise, down (↓) = predicted to fall |
| Band | The confidence range [low, high] — the system expects the price to land somewhere in this range. The band is centered on the predicted price (the midpoint of the range equals the point estimate) so the headline return and the band agree. It can be widened by several independent checks — a large expected move (uncertainty scales with move size), the options-market floor (see above), and the statistical anchor — not just by one factor |
| Confidence | How sure the system is (0 to 1). Higher numbers = more confident. It is also capped by data quality — if the input data was stale or incomplete, the score is lowered even when the model itself is certain — and it can be trimmed further by the options-market floor or the statistical anchor when those checks fire |
| Horizon | Short (1–2 days), medium, or long (~10 days) |
| Type | Final = complete prediction / Intermediate = rough update during the day |
| Reasoning | Click "View" to see the AI's explanation for this prediction |
| After | Which step of the pipeline produced this prediction (Thesis, Critque, etc.) |
How to Read a Prediction
A good prediction has:
- A clear direction — the Diff should show a meaningful gap (up or down), not tiny noise
- A narrow band — a tight price range shows confidence
- A high confidence score — above 0.7 is strong
- A detailed reason — the reasoning text should make sense given the current news
The Accuracy Context Block
The reasoning text includes a self-calibration block — rolling MAE, MAPE, and confidence-band hit rate for the relevant horizon — plus a "resolved predictions" count. A few things to keep in mind when reading it:
- Reports sharing a prediction date are not directly comparable. Predictions for the same day can be produced in different pipeline runs, and the accuracy context is a snapshot of that run's database view. When the accuracy tracker resolves new outcomes (usually once a day), the "resolved predictions" count goes up — so an earlier report for the same date can legitimately show fewer resolved predictions than a later one.
- The count matches the displayed MAE. The MAE/MAPE shown are rolling statistics over the accuracy tracker's most recent ~20 validations per horizon. The "resolved predictions" number is capped to the same rolling population, so a new batch of high-error validations can raise the MAE sharply while the count changes only slightly.
- The snapshot decays. Context only covers the last
accuracy window(default 60 days), so older validations fall out of the count over time.
Filtering Options
- Horizon tabs (short / medium / long): Focus on predictions for a specific timeframe
- Time range picker: Show predictions from the last 1 day up to the last year
Prediction Gating
FIN uses a MAPE-based gating system to automatically withhold predictions when recent accuracy is poor, preventing false outputs from reaching the dashboard.
How It Works
Each prediction horizon (short / medium / long) is gated independently:
- MAPE is computed — a rolling mean of the absolute percentage error over the most recent 20 accuracy-validation records, within a configurable time window (default 60 days).
- If MAPE exceeds the threshold (default 8.0%), that horizon enters gated mode — predictions are skipped and recorded as NULL-valued rows with the reason
MAPE exceeds confidence threshold. - A cooldown mechanism prevents permanent lockout: after a configurable number of consecutive skips (default 5), the system forces a retry. This gives accuracy a chance to recover.
- When MAPE drops back below the threshold (because new low-error predictions age out the old high-error ones), gating lifts automatically.
What You'll See
- Gating banner at the top of the Predictions page — green when inactive, yellow when gating is disabled, red when any horizon is actively gated. The red banner shows each gated horizon, current MAPE vs. threshold, and a cooldown progress bar.
- Skipped predictions in the table display a label like "MAPE 12.3% > 8%".
Configuration
Gating can be tuned per ticker in the Prompt Config page:
| Setting | Default | Range | Description |
|---|---|---|---|
| Master toggle | On | On/Off | Enables or disables gating entirely |
| MAPE threshold | 8.0% | 1–50% | MAPE above this triggers gating per horizon |
| Skip cooldown | 5 | 1–30 | Consecutive skips before a forced retry |
| Accuracy window | 60 days | 7–365 | Rolling window for MAPE computation |
Stale-Data Gating
In addition to MAPE gating, if no OHLCV price data has been received in 3+ days (accounting for weekends/holidays), predictions are withheld with a stale_data reason.

