Appearance
How to Tune FIN
FIN is designed to work with default configuration, but every stock is different. This page walks you through the settings you can adjust from the dashboard to get the best results for your specific situation.
Quick Overview — The 6 Tuning Areas
Understanding the Flow
Before diving into settings, here's how FIN's pipeline works and which tuning areas affect each stage:
| Stage | What Happens | Tuning Areas That Affect It |
|---|---|---|
| Collect | RSS feeds are checked, stock prices fetched, calendar events gathered | Feed frequency, cache settings, competitors |
| Analyze | News is scored for sentiment, surprises, and psychology | Surprise thresholds, decay rates |
| Predict | AI combines all signals into a thesis and price prediction | Prompt content, temperature, gating, ML tier |
| Validate | After market close, predictions are compared to actual results | MAPE thresholds, accuracy decay |
| Learn | Resolved snapshots train new GBM models | Training thresholds, drift detection |
1. RSS Feed Frequency
RSS feeds if one of the channels that FIN uses to stays informed about your stock. More frequent checking means FIN reacts to news sooner, which leads to more accurate predictions.
How to Adjust
Go to Scheduler → Feed Schedules in the dashboard. Each feed has its own schedule and settings.
Recommended Patterns
| Feed Type | Recommended Frequency | Why |
|---|---|---|
| Ticker-specific news (Google News, Yahoo Finance, etc) | Every 1–2 hours | Your stock's direct news matters most |
| Central bank / policy feeds (ECB, Fed) | Every 6 hours | These publish infrequently — checking more often wastes resources |
| Macro / market-wide news | Every 6 hours | Broad economic context, not time-critical |
| Reddit discussions (with buzz) | Every 6 hours | Social sentiment changes slowly; buzz scraping is heavier |
Feed Settings
| Setting | What It Does | Recommendation |
|---|---|---|
| Schedule | Cron expression for how often to check | Every 2–3h for ticker feeds, 6h for macro |
| Buzz | Also collect comments and engagement data | Enable for Reddit-style feeds |
| Buzz Comments | Number of top comments to scrape per post | 3 is a good default |
| Max Days | Ignore articles older than this (in days) | Default 3 — lower for faster processing |
| Extract Text | Full article text extraction | Enable if you want deeper analysis |
| Active | Toggle feed on/off | Disable feeds that consistently error |
💡
Tip: The biggest accuracy gains come from checking your ticker-specific feeds more often. If you only change one thing, increase the frequency of those feeds.
What to Tune Based on Your Stock
| Stock Type | Strategy |
|---|---|
| Active stock with lots of news | Check ticker feeds every 1–2 hours |
| Quiet stock with infrequent news | Every 4–6 hours is fine |
| Want faster processing | Lower max_days (e.g., 2 instead of 3) |
| Want more context | Add more feeds, increase buzz_comments |
| Resource-constrained | Reduce parallelism, increase cache TTLs |
2. Prediction Gating
When FIN's predictions have been consistently off, the system automatically skips predictions until accuracy improves. This protects you from bad forecasts.
How It Works
- FIN tracks prediction accuracy using MAPE (Mean Absolute Percentage Error)
- When MAPE exceeds your threshold, predictions are "gated" (skipped)
- After a cooldown period, FIN forces a real prediction to check if accuracy has recovered
- If still inaccurate, gating continues
Settings (Config → Prediction Config)
| Setting | Default | What It Does |
|---|---|---|
| Prediction Gating Enabled | On | Master switch — turn off to bypass all MAPE gating |
| MAPE Threshold (per horizon) | 8.0% | Predictions are skipped when error exceeds this |
| Skip Cooldown (per horizon) | 5 days | After gating, force a real prediction after this many skips |
| Accuracy Decay Days | 60 days | How far back to look when calculating MAPE |
How to Tune
MAPE Threshold controls how strict gating is:
| Setting | Label | When to Use |
|---|---|---|
| ≤ 5% | Strict | Conservative — skip early, only show high-confidence predictions |
| ≤ 10% | Moderate | Default — good balance for most stocks |
| ≤ 15% | Relaxed | Tolerate more error — useful for volatile stocks |
| > 15% | Lenient | Rarely gate — useful during earnings season |
Skip Cooldown controls how quickly FIN tries again after gating:
- Lower (1–3): Resume predictions sooner — good if you want to see updates even with lower accuracy
- Higher (7–14): Stay in safety mode longer — good if you only want high-confidence predictions
Accuracy Decay Days controls how fast old errors age out:
- Lower (30 days): Recover from bad spells quicker — old high-error predictions stop affecting gating sooner
- Higher (120+ days): Keep a longer memory — more stable but slower to recover from a bad period
💡
Tip: Start with defaults (8% / 5 / 60). If predictions seem too conservative, raise the MAPE threshold. If the system stays in gating too long, lower the accuracy decay days.
3. Signal Decay — Sentiment & Psychology
News and psychology signals lose relevance over time. Decay rates control how fast older signals lose their influence on predictions.
Why It Matters
A news article from yesterday is more relevant than one from two weeks ago. But for long-term predictions (60+ days out), even older articles carry some useful information. Decay rates let you control this balance.
Settings (Config → Decay Config)
Each horizon has two independent decay sliders:
| Setting | Short (1–10 day) | Medium (100 day) | Long (300–600 day) |
|---|---|---|---|
| Sentiment Decay | 0.3 | 0.1 | 0.05 |
| Psychology Decay | 0.15 | 0.08 | 0.04 |
What the Numbers Mean
Sentiment Decay controls how fast news articles lose weight:
- Higher (0.3–0.5): Older news fades fast — recent headlines dominate
- Lower (0.01–0.1): News retains influence longer — more memory of past events
Psychology Decay controls how fast bias scores age:
- Higher (0.15–0.3): Recent bias readings dominate (FOMO, anchoring, herding)
- Lower (0.01–0.08): Historical bias patterns stay relevant longer
When to Adjust
| Situation | Adjustment |
|---|---|
| Predictions overreact to old news | Increase sentiment decay |
| Predictions miss recent shifts | Decrease sentiment decay |
| Volatile, fast-moving market | Higher decay (focus on fresh signals) |
| Stable, trending market | Lower decay (longer memory helps) |
| Short-term predictions too noisy | Increase psychology decay for short horizon |
| Long-term predictions missing bias patterns | Decrease psychology decay for long horizon |
4. ML Training — Snapshots & Tiers
This is the heart of how FIN learns. Every prediction creates a feature snapshot — a complete record of everything that went into it. When the target date passes, the snapshot is resolved with the actual outcome, turning it into a training example.
What Are Feature Snapshots?
Each snapshot captures 86+ features:
| Category | Examples |
|---|---|
| Technical | RSI, ATR, trend direction, volatility, SMA crossover |
| Sentiment | Ticker sentiment, economy sentiment, momentum, buzz |
| Surprise | Count, magnitude, direction of recent surprises |
| Psychology | 12 cognitive bias scores (FOMO, anchoring, herding, etc.) |
| Fundamentals | P/E ratio, revenue growth, EPS growth, debt/equity |
| Calendar | Days to next earnings, days to next dividend |
| Market Context | Beta, correlation with SPY, relative strength |
| Options | Put/call ratio, implied volatility |
| Thesis | 18 features: conviction, regime, bull/bear probabilities, etc. |
After the target date, the snapshot is resolved with actual_return_pct — the real return from prediction date to target date. This becomes the training label.
Training Thresholds (Config → ML Training Config)
| Setting | Default | What It Does |
|---|---|---|
| Min Training Samples | 100 | Minimum resolved snapshots before any model trains |
| Min New Samples for Retrain | 20 | New snapshots needed to trigger automatic retraining |
| Horizon Min Samples — Short | 50 | Minimum for short-horizon Tier 1 activation |
| Horizon Min Samples — Medium | 40 | Minimum for medium-horizon Tier 1 activation |
| Horizon Min Samples — Long | 30 | Minimum for long-horizon Tier 1 activation |
| Drift MAE Threshold | 30% | MAE degradation that triggers a drift alert |
| Deactivate Underperform Days | 30 days | How long a bad model survives before auto-deactivation |
How Many Snapshots for Tier 1?
The system needs enough resolved snapshots to train a reliable model. Here's what to expect:
| Horizon | Snapshots per Day | Days to 50 Snapshots | With Backfill |
|---|---|---|---|
| Short (1, 2, 10 day) | 3 | ~17 days | Same day |
| Medium (100 day) | 1 | ~50 days | Same day |
| Long (300, 600 day) | 2 | ~25 days | Same day |
💡
Tip: With backfill (which runs automatically on first retrain), the system typically generates hundreds of resolved snapshots from your existing stock price history. This means Tier 1 training usually succeeds on the very first retrain — no waiting weeks for data.
Cold Start — What Happens with a New Ticker
When you add a new ticker, here's the journey:
Day 0: Tier 4
→
First Retrain: Backfill
→
Same Day: Tier 1
Day 0 — Tier 4 (Thesis Heuristic): No training data yet, so FIN uses the AI's qualitative thesis to make rough predictions. These are directionally useful but lack the precision of trained models.
First Retrain — Backfill: The system automatically reconstructs historical feature snapshots from your existing stock price data:
- Technical features — reconstructed from stored OHLCV price history using rolling calculations
- Fundamental features — computed on-the-fly from financial statements (P/E, revenue growth, etc.)
- Calendar features — derived from stored earnings and dividend dates
- Sentiment, psychology, surprise, thesis, options — set to NULL (the GBM handles missing values natively)
- Outcomes resolved immediately — the close price at each target date is looked up from stored data, so every backfilled snapshot becomes a resolved training example
Result: Typically hundreds of resolved snapshots in one run, enabling Tier 1 training immediately.
Drift Detection
Over time, market conditions change and old models may become stale. FIN monitors this automatically:
- Drift MAE Threshold (30%): When recent prediction error exceeds this percentage above the baseline, a drift alert fires
- Deactivate Underperform Days (30): A model that consistently underperforms for this many days is automatically deactivated
- Set to 0 to disable auto-deactivation
5. Surprise Detection
FIN scans articles for unexpected events — earnings beats/misses, economic surprises, guidance changes, and more. You can control how sensitive this detection is.
Settings (Config → Surprise Signals)
| Setting | Default | Range | What It Does |
|---|---|---|---|
| Min Ticker Relevance | 15 | 0–100 | Articles below this relevance score are skipped |
| Min Magnitude Threshold | 20 | 0–100 | Surprises below this magnitude are not stored |
How to Tune
| Setting | Lower (Permissive) | Higher (Strict) |
|---|---|---|
| Min Ticker Relevance | More articles analyzed — catches borderline cases | Only highly relevant articles — less noise |
| Min Magnitude Threshold | Minor deviations captured — more data points | Only big surprises — cleaner signal |
💡
Tip: For most stocks, the defaults (15 relevance, 20 magnitude) work well. Lower the thresholds if you want more data points for ML training. Raise them if you're seeing too many false positives.
6. Prompt Content — What the AI Sees
You can toggle on/off every data section in the AI's briefing. All on = most informed prediction. Turn off sections to experiment or troubleshoot.
Prediction Prompt (Config → Prediction Prompt)
These control what data the AI sees when making its initial prediction:
| Category | Sections | What They Provide |
|---|---|---|
| Sentiment | Ticker Sentiment, Economy Sentiment, Country Economy Sentiment | Positive/negative feeling from news |
| Reliability | Ticker Uncertainty, Economy Uncertainty, Country Uncertainty | How trustworthy each sentiment signal is |
| Momentum | Avg Buzz Score, Re-acceleration, Momentum Score, User Interest | How much attention and momentum the stock has |
| Fundamentals | Estimates Context, Financials Context | Analyst forecasts, revenue, margins, balance sheet |
| Events | Surprise Context, Surprise Outcomes Context | Recent unexpected events and past reactions |
| Psychology | Bias Context | 12 cognitive bias scores weighted by horizon |
| Calendar | Calendar Context | Upcoming earnings, dividends, events |
| Market | Market Context, Competitor Context | Benchmark comparison, peer performance |
| Technical | OHLCV Context | Price action, RSI, ATR, trend, volume |
| Options | Options Context | Put/call ratios, implied volatility |
| Self-awareness | Accuracy Context, ML Knowledgebase | Past prediction accuracy, model data |
Self-Critique Prompt (Config → Self-Critique Prompt)
After making its initial prediction, the AI reviews its own work. These control what it sees during that review:
| Section | Purpose |
|---|---|
| Ticker Sentiment | Check if prediction aligns with stock-specific news |
| Economy Sentiment | Check if prediction aligns with economic conditions |
| Momentum Score | Check if prediction aligns with recent trends |
| Re-acceleration | Check if prediction accounts for accelerating/decelerating signals |
| Surprise Summary | Check if prediction accounts for recent surprises |
LLM Temperature (Config → LLM Temperature)
Controls how deterministic the AI's outputs are:
| Range | Label | Effect |
|---|---|---|
| 0.0–0.2 | Deterministic | Consistent, repeatable outputs — best for predictions |
| 0.2–0.4 | Precise | Slight variation — default (0.2) sits here |
| 0.4–0.7 | Balanced | More varied — useful for thesis generation |
| 0.7–1.0 | Creative | High variation — rarely needed |
| 1.0–2.0 | Experimental | Very random — not recommended for predictions |
💡
Tip: Keep temperature at 0.2 for predictions. Only increase it if you want more diverse thesis reasoning. Lower it to 0.0 for maximum consistency.
How to Experiment
- Start with everything on — the most informed predictions
- If predictions seem erratic, try disabling the uncertainty sections
- If you want to test a theory, compare accuracy with and without a specific section
- Changes take effect on the next prediction run — no restart needed
- Disabling sections reduces token usage if you're monitoring costs
The Tiered Model Architecture
FIN uses a tiered system to produce the best predictions available. Each tier is a different method, and the system automatically picks the best one.
TIER 1Your Personal Model
5 quantile GBM models (q10/q25/q50/q75/q90) trained specifically on your ticker. Full prediction distribution with confidence bands. Best accuracy.
TIER 2Pooled Model
Trained across all users on the same instance. Produces median (q50) predictions only. Activates when your personal data is too sparse.
TIER 3Sector Transfer
Uses a model trained on a similar company in the same sector. q50 only, with 30% confidence penalty. Fallback when no same-ticker model exists.
TIER 4Thesis Heuristic
Always available — no training needed. Uses the AI's qualitative thesis (direction + conviction) to produce rough price estimates.
How Tiers Are Promoted
After each retrain, the system evaluates which tiers are available:
- Tier 1: Your personal GBM models are trained for the horizon — activates when enough resolved snapshots exist
- Tier 2: A pooled model exists — activates when user-specific training produces fewer than 3 models
- Tier 3: A same-sector model exists — activates automatically if another stock in your sector has a trained model
- Tier 4: Always available — the fallback when no trained model exists
Performance Gating
Even when a tier is trained, it must prove it's still accurate. The system checks the last 20 validation results:
| Condition | Action |
|---|---|
| Coverage < 40% (actual price falls outside bands too often) | Tier downgraded one level |
| Normalized Winkler > 1.5× the bucket's own baseline (≥20%, or >50% for new buckets without enough history) — intervals too wide or inaccurate vs that instrument's norm | Tier downgraded one level |
For example, if your Tier 1 model's coverage drops below 40%, the system automatically falls back to Tier 2. This prevents stale or inaccurate models from producing bad predictions.
These four thresholds — the coverage threshold, the Winkler degradation factor, the Winkler default threshold, and the Winkler floor — are per-ticker and adjustable from the dashboard under Config → ML Accuracy Gate. The values you set there are exactly what the gate reads for that (user, ticker) bucket; if you leave them unset, the system defaults (coverage 0.40, degradation 1.5×, default 50%, floor 20%) apply.
What This Means for You
- You don't need to manage tiers — the system handles promotion and demotion automatically
- Tier 1 is the goal — it gives the best predictions with full confidence bands
- Backfill accelerates Tier 1 — typically activates on the first retrain, not weeks later
- Performance gating protects you — bad models are automatically demoted
Other Settings Worth Knowing
Market Context (Config → Prediction Prompt)
When enabled, FIN compares your stock to market benchmarks (SPY, QQQ) and your sector ETF. It computes:
- Beta — how much your stock moves relative to the market
- Correlation — how closely your stock tracks the market
- Relative Strength — whether your stock is outperforming or underperforming
Toggle off via Config → Prediction Prompt → Market Context if you want faster processing for niche stocks that don't correlate with benchmarks.
Competitors (Competitors Page)
Add peer tickers (e.g., ORCL for SAP) for relative performance analysis:
- System auto-generates RSS feeds for competitors
- Competitor news goes through the same sentiment/surprise pipeline
- Enables the AI to distinguish sector-wide moves from company-specific signals
- Adds competitor-aware ML features (cross-impact, relative strength)
Tips for Getting Started
🚀
Start with defaults. They work well for most stocks. The system is designed to learn and improve on its own.
📊
Check the Jobs page to monitor what stage the pipeline is in. You can see feeds being processed, predictions running, and models training.
📈
Watch accuracy improve over time on the Predictions page. The system needs 1–2 weeks to build enough data for Tier 1 models.
📡
Tune RSS frequency based on your stock's news volume. Active stocks benefit from every 1–2 hour checks. Quiet stocks are fine at 4–6 hours.
🔬
Use Config → Prediction Prompt to experiment. Toggle sections on/off and compare accuracy over the next few days to see what data helps most for your stock.
⏱️
After 1–2 weeks, the system should have enough data for Tier 1 training. Check the Accuracy tab on the Predictions page to see how it's progressing.
Technical Details
Click to expand — deep-dive into algorithms, formulas, and internals
Feature Snapshot Lifecycle
Creation: During each prediction snapshot save is done, once per offset per horizon group. Features are assembled from multiple sources — technical and financial from the stocks information, psychology from the calculated psycology scores, calendar from the calendar events, market context from benchmark metrics, options from the options chain.
Resolution: After the target date passes, the accuracy tracker resolves the snapshot with actual values and calculates error percentage - llm_error_pct = ((actual − predicted) / actual) × 100`.
Training: Resolved snapshots are queried by with a minimum sample threshold. Features are extracted into a numeric matrix, targets into a vector, and fed to GBM training.
Backfill Algorithm
Backfill feature snapshots algorithm reconstructs feature vectors for every past trading day present that was previously stored:
- Technical features (
rsi,atr,sma_crossover,price_change_5d/20d,volatility_20d): derived from stored OHLCV close series using rolling arithmetic — no re-fetching is required - Fundamental features (
pe ratio,debt to equity,revenue growth yoy,eps growth yoy,earnings_quality,free cashflow) are computed on-the-fly - Calendar features (
days to earnings,days to dividend) are derived from the stored calendar events - Non-reconstructable features (sentiment, psychology, surprise, thesis, options, market context): set to NULL — GBM handles missing values natively via its built-in missing-value split logic
- Outcome resolution: Close price at
target dateis looked up from the stored data with ±5 day fallback for holidays;actual value,actual return pct, andresolved atare set immediately
The backfill triggers when len(train rows) < HORIZON_MIN_SAMPLES[h] // 2:
- Short: < 25 rows (50 // 2)
- Medium: < 20 rows (40 // 2)
- Long: < 15 rows (30 // 2)
Tier Gating Formula
If mean_coverage < 0.4 OR mean_winkler > 10 (requires ≥5 rows), the tier is downgraded:
- Tier 1 → Tier 2
- Tier 2 → Tier 3
- Tier 3 → Tier 4
Winkler Score
The Winkler (or interval score) measures both coverage and sharpness:
W=⎩⎨⎧widthwidth+α2(Plow−Pactual)width+α2(Pactual−Phigh)if Plow≤Pactual≤Phighif Pactual<Plowif Pactual>Phigh
Where width = P_high − P_low and α = 0.20 (for 80% coverage target). Lower is better — a perfect prediction scores its interval width; miss predictions are penalized proportionally to how far outside the band the actual falls.
Quantile GBM Training
5 GBM models are trained per ticker/horizon with the following settings:
- Target: What the model tries to predict -
actual_return_pct(the realized return from prediction date to target date) - Quantiles: Which percentiles are predicted - q10, q25, q50, q75, q90
- Objective: How the model learns - Quantile regression (pinball loss) is used
- Hyperparameters: The parameters that control the model behaviour -
num_leaves=31,learning_rate=0.05,feature_fraction=0.8 - Validation: How we test if the model is good - Time-series cross-validation (5 folds, early stopping at 50 rounds)
The q50 gives the central prediction; the q10–q90 gap forms the confidence band.
Conformal Prediction Calibration
At inference the q10/q90 interval width is calibrated on the last 50 validation predictions to achieve ~80% coverage:
shortfalli=max(0,Q10,i−yi)+max(0,yi−Q90,i)
α=Quantile(shortfall, 1−coveragetarget+coverageactual)
Q10adj=Q10−α,Q90adj=Q90+α
When empirical coverage already meets or exceeds 80%, no adjustment is applied (returns 0.0).
Sentiment Decay Formula
wd=e−λ⋅age_days
Where λ is the decay rate per horizon:
- Short: λ = 0.3 (half-life ≈ 2.3 days)
- Medium: λ = 0.1 (half-life ≈ 6.9 days)
- Long: λ = 0.05 (half-life ≈ 13.9 days)
The effective weight combines decay with freshness penalty, buzz multiplier, and dimension importance:
weff=w⋅(1−100j)⋅wf⋅a⋅wb
Surprise Detection Pipeline
Stage 1 — Regex Pre-filter: 25 compiled regex patterns scan article text for surprise signals (earnings beats/misses, economic surprises, guidance changes, etc.). Only articles matching at least one pattern proceed.
Stage 2 — LLM Evaluation: Matched articles are evaluated on:
is genuine— True if real surprise, not speculationmagnitude— 0–100 (trivial to extreme)direction— 0–100 (very negative to very positive)ticker relevance— 0–100 (unrelated to directly impactful)market relevance— 0–100 (narrow to broad market significance)confidence— 0–100 (LLM certainty in its assessment)
Post-LLM filtering applies min magnitude threshold (default 20) and min ticker relevance (default 15).
Bias Weighting by Horizon
Each of the 12 psychological biases has a horizon-specific weight that controls its influence:
| Bias | Short | Medium | Long | Rationale |
|---|---|---|---|---|
| FOMO | 1.0 | 0.3 | 0.2 | Short-term noise |
| Herding | 1.0 | 0.3 | 0.2 | Momentum-driven short term |
| Recency | 1.0 | 0.3 | 0.2 | Recent events dominate near-term |
| Availability | 1.0 | 0.3 | 0.3 | Easily recalled events skew short term |
| Loss Aversion | 0.3 | 0.5 | 0.5 | Stable across horizons |
| Confirmation | 0.3 | 1.0 | 0.3 | Peaks at medium term |
| Overconfidence | 0.3 | 1.0 | 0.3 | Most dangerous at medium horizon |
| Disposition | 0.2 | 1.0 | 0.3 | Medium-term holding bias |
| Anchoring | 0.2 | 0.5 | 1.0 | Reference prices dominate long term |
| Narrative | 0.2 | 0.5 | 1.0 | Stories compound over time |
| Ambiguity Aversion | 0.2 | 0.3 | 1.0 | Long-term uncertainty magnifies aversion |
| Regret Minimization | 0.2 | 0.3 | 1.0 | Long-horizon regret-avoidance grows |
Tier 3 Sector-Transfer Fallback
Tier 3 has a three-level internal fallback:
- Models from other tickers in the same GICS sector
- A pooled model trained for this specific ticker
- Any pooled model across all tickers
Only a single q50 model is available at Tier 3. Remaining quantile bands (q10/q25/q75/q90) are estimated from volatility. Tier 3 predictions receive a 30% confidence penalty compared to Tier 1–2.
Operational Confidence Penalties
| Condition | Penalty |
|---|---|
| Stale OHLCV data | −0.2 |
| No calendar events | −0.1 |
| No buzz/engagement data | −0.05 |
| No news signals (no ticker-relevant articles) | −0.2 |
| No psychology signals | −0.05 |
| MAPE > 5% (≥10 samples) | −0.1 |
| Coverage < 50% (≥10 samples) | −0.1 |
| Direction agreement (GBM = thesis) | ×1.05 (boost) |
| Direction disagreement (GBM ≠ thesis) | ×0.85 |
| Tier 4 (heuristic-only) | ×0.5 |
Uncertainty modulation: conf *= (1 − avg uncertainty / 100). Final confidence is clipped to [0, 1].

