Quantis compares five forecasting approaches, LSTM, ARIMA, Random Forest, Logistic Regression, and a multi-horizon ensemble, across 100 US stocks and ETFs. Type a ticker on the left to load it; the sidebar shows price, technical indicators, and risk metrics computed from real OHLCV bars. The top panel derives buy/sell zones from Bollinger bands and ATR. The tabbed chart lets you compare each model's forecast against the actual price history and a 12-month backtest. Data is refreshed offline in Python and committed to the repo as JSON, no live API, no rate limits, no broken fetches. See the Methodology page for the math behind each model and why the architecture is what it is. Full source code, the Colab pipeline, and the list of covered tickers are on GitHub →

Loading…
Loading consensus…
Price History
LSTM
ARIMA
Random Forest
Multi-Horizon
Backtest
Loading data…

Watchlist

Stocks you're tracking. Live quotes update every time you load this tab. Your list is saved in your browser, so it persists across sessions, switch devices and you'll start fresh.

Ticker
Company
Price
Change
Volume
Actions
How Quantis works

Methodology

Quantis is the web port of a graduate research project (INFO 656 final, Pratt Institute) that compares classical ML, deep learning, and time-series approaches to stock forecasting. Below: the data pipeline, each model's design choices, how predictions are reconciled, and the honest limitations of the work.

View the source on GitHub → All code, Colab pipeline, ticker list, and generated JSONs are at github.com/amma-ctrl/quantis

1 Data pipeline

The dashboard runs entirely client-side on GitHub Pages, no backend, no API keys, no rate limits. OHLCV bars and ML forecasts are pre-generated in a single Colab notebook (Quantis_Pipeline.ipynb) and committed to the repo as JSON files under data/bars/ and data/forecasts/. The browser reads those local files directly. The badge in the top corner of this page shows when the data was last refreshed, currently checking….

This is the third architecture I tried. The first prototype hit Yahoo Finance's chart endpoint directly from the browser, that's how every static stock dashboard worked for years, but Yahoo tightened CORS constraints in 2025 and started blocking browser fetches. The second attempt used Finnhub's /stock/candle endpoint, which has the right CORS headers, but Finnhub moved historical bars behind a paywall in 2024-25. Alpha Vantage caps free use at 25 calls/day; Twelve Data and Stooq via free CORS proxies break unpredictably from github.io origins. For a portfolio site that must just work, every "live" option is broken.

The honest answer is to pre-generate. Yahoo data is still freely available, just not from a browser. The Colab notebook pulls 5 years of daily OHLCV via yfinance, trains all five models (LSTM benefits from a free Colab GPU), and commits everything to GitHub in one batched API call. The dashboard then has zero external dependencies. Re-running the notebook refreshes the live site in ~2 minutes (bars only) or ~45 minutes (bars + full model retrain on GPU).

01
Open Colab
Run Quantis_Pipeline.ipynb · GPU runtime for ~10× faster LSTM
02
Fetch
yfinance pulls 5y of OHLCV for 100 tickers from Yahoo
03
Train
LSTM, ARIMA, RF, LR, multi-horizon models per ticker
04
Push
One Git commit via GitHub API; Pages redeploys in ~30s
05
Render (JS)
Canvas charts, indicators, risk metrics from local JSON

2 The five models

Each model approaches forecasting differently. Running them side-by-side surfaces where they agree (higher-confidence signals) and where they diverge (uncertainty). The point isn't to pick the "best" model, it's to make the disagreement legible.

LSTM
Deep Learning · Regression
Three stacked LSTM layers (50 units each, 20% dropout), trained on 5 years of daily closes scaled to [0,1]. Looks at a 60-day lookback window to predict the next day's price, then recursively forecasts 30 days forward. Early stopping on validation loss.
Lookback60 days
Architecture3× LSTM(50)
OptimizerAdam
LossMSE
Forecast horizon30 days
ARIMA
Classical Time Series · Regression
ARIMA(5,1,0), five autoregressive lags, first-difference (d=1) to handle the trending nature of price series. Stationarity verified via the Augmented Dickey-Fuller test (raw prices fail; differenced prices pass at p<0.05). Walk-forward predictions on the test set; 30-day forecast on the full history.
Order(5, 1, 0)
Window500 trading days
StationarityADF, p<0.05
ValidationWalk-forward
Random Forest
Tree Ensemble · Binary Classification
An ensemble of 100 decision trees (max depth 10) predicting whether tomorrow's close will be higher than today's. Trained on 19 engineered features: momentum (RSI, MACD, stochastics), volatility (Bollinger width, ATR), volume ratios, lagged returns, and trend strength. Compared against Logistic Regression and Decision Tree baselines.
Trees100
Max depth10
Features19 engineered
TargetUp / Down (1 day)
Multi-Horizon Ensemble
Phase IV · Multi-Output
Instead of one model predicting one day ahead, this fits a separate Random Forest for each horizon, 1, 3, 5, 10, and 20 trading days. The output is a probability surface over time: where does the model see the strongest directional edge? Useful for sizing hold windows rather than entry timing.
Horizons1, 3, 5, 10, 20
Per-horizon modelRF (80 trees, depth 8)
OutputP(UP) per horizon
Consensus & Backtest
Phase V · Synthesis
Each model's signal is translated into a directional trade, run against the last 252 trading days with $10,000 starting capital. Compared against passive buy-and-hold. The consensus bar on the main dashboard combines indicator signals (RSI, MACD, SMA) with the RF probability into a single confidence reading.
Period252 days (rolling)
Capital$10,000
BenchmarkBuy & Hold
FrictionNone (educational)

3 Feature engineering

The classifiers don't see raw price, they see 19 features derived from OHLCV. This is where domain knowledge enters the model. Features fall into five buckets:

Momentum

RSI(14), MACD line / signal / histogram, Stochastic %K / %D. These capture short-term overbought / oversold conditions and trend acceleration.

Volatility

Bollinger band width, Bollinger position (where current price sits inside the bands), ATR percent, daily high-low range. These describe how "wild" the recent price action is.

Volume

Volume ratio (current vs. 20-day average). Volume confirms or denies price moves.

Returns & trend

Multi-period returns (1d, 5d, 10d, 20d), 20-day realized volatility, price/SMA ratios, trend strength. These give the model context: is the price stretched, mean-reverting, or trending?

Random Forest's feature importance ranking (visible on the RF tab) usually puts SMA-based features near the top, which makes intuitive sense, short-term trend dominates next-day direction. The full feature list is in the Colab notebook's FEATURE_COLS.

4 How signals combine

The "consensus" indicator on the dashboard isn't a weighted vote of the regression models (LSTM, ARIMA), those predict continuous prices, not directions. Instead it combines four directional signals:

Random Forest next-day P(UP)From the precomputed JSON
MACD line vs. signal lineCrossover direction
RSI(14)<30 oversold, >70 overbought
Price vs. SMA-20Above = bullish

A simple majority vote across these four produces BUY / SELL / HOLD. The LSTM and ARIMA forecasts inform the buy-zone target price but don't enter the directional vote, their job is magnitude, not direction.

5 Backtesting

Each model is evaluated on the last 252 trading days with $10,000 starting capital. The classifiers' equity curves assume a long-only strategy: enter on P(UP)>0.5, exit on P(UP)<0.5. The regressors (LSTM, ARIMA) translate their MAPE into an "edge" parameter, which then drives the equity curve.

This is a simplified backtest, no slippage, no spread, no commissions, no position sizing rules. Real trading reduces returns substantially. The point is comparison across models on a level playing field, not a forecast of live PnL.

6 Limitations & caveats

  • Historical performance is not predictive. Stock markets are mostly efficient, even professional traders rarely sustain a 55% win rate.
  • Frictionless backtests overstate real-world returns. Slippage, spreads, and commissions can erase a 2–3% edge entirely.
  • Models are trained on a fixed historical window. A regime shift (rate cycle change, recession, vol regime change) will degrade them until retrained.
  • Confidence intervals widen quickly with horizon. The 30-day forecast band is illustrative; daily models lose precision rapidly past 5–10 trading days.
  • The 19 engineered features are technical-only. No fundamental data, no news sentiment, no earnings, no macro. A complete model would pull all of these.
  • Quantis is a portfolio piece, not financial advice. Treat it as an educational exploration of where modeling techniques agree and disagree.

7 Stack & reproducibility

Frontend: Vanilla ES modules, canvas-rendered charts, no framework, no build step. Data: pre-generated JSON in data/bars/ (OHLCV) and data/forecasts/ (model outputs), committed to the repo. Pipeline: single Colab notebook (Quantis_Pipeline.ipynb) handles fetch → feature engineering → train → commit, using yfinance, TensorFlow, statsmodels, scikit-learn, and ta. Deployment: GitHub Pages, no CI needed. Source: reproducible end-to-end, open the notebook in Colab, add a GITHUB_TOKEN secret, set repo coords, Runtime → Run all. ~2 minutes for a bars-only refresh, ~45 minutes on a free GPU runtime for the full model retrain.

Quantis is an educational research project. Not financial advice. Past performance is not a guarantee of future results.