Simply Stocks
Explore the signal. Inspect the uncertainty.
An exploratory dashboard pairing market history with next-day directional estimates and model context.
- Platform
- Web App
- Scope
- Full-stack
- Team
- Solo
- Status
- Complete
- Started
- Mar 7, 2025
Project context
Stock prediction is usually framed as a price-forecasting problem, but exact price prediction is noisy, unstable, and difficult to validate.
Simply Stocks approaches the problem more narrowly: given historical market behavior and sentiment signals, can a model identify whether a stock is more likely to close higher or lower than the previous day?
The challenge
- Exact price forecasts are noisy
- Model output needs context and limits
The approach
- Explore direction instead of exact price
- Pair estimates with history and evaluation
From intent to interaction
Find a ticker
Search a local symbol list and request market data.
Inspect the history
Review price charts, recent trends, and sentiment context.
Examine the estimate
Compare a directional forecast with its probability and limitations.
What it makes possible
Explore market history
Search tickers and inspect price history in interactive charts.
Examine directional estimates
Compare forecasts with trends, sentiment, and probability.
Keep limits visible
Keep model limits visible alongside exploratory forecasts.
How the pieces fit
Interactive dashboard
Explore tickers, market summaries, and charts.
Dash and PlotlyData and features
Build features from market history and sentiment.
Python servicesModel evaluation
Train models and inspect directional estimates.
XGBoost and Random ForestConstrain the question
Estimate next-day direction instead of claiming an exact future price.
Expose the limits
Show model context and frame forecasts as exploratory estimates.
Engineering notebook
Explore the design, data flow, and implementation in more detail.
Interactive dashboard
Explore tickers, market summaries, and charts.
Dash and PlotlyData and features
Build features from market history and sentiment.
Python servicesModel evaluation
Train models and inspect directional estimates.
XGBoost and Random ForestSimply Stocks was built as an exploratory machine learning project rather than a production trading tool.
The goal was to test whether basic market signals could support directional predictions with more useful accuracy than random guessing. To make that exploration understandable, the project pairs prediction output with historical charts, market context, and model limitations so users can inspect the data behind the result rather than treating the prediction as a black box.
Implementation
Simply Stocks is built as a Python Dash single-page dashboard where the interface, data retrieval, feature engineering, chart rendering, and model inference run inside the same Flask-backed process.
The system is organized into separate view, controller, service, utility, and model layers. Dash callbacks coordinate ticker search, market data retrieval, chart updates, sentiment processing, and per-request model training without a separate REST API or persistent database.
Find a ticker
Find a ticker and request its market history.
Inspect the history
Inspect charts alongside trend and sentiment data.
Examine the estimate
Review forecasts with probability and model limits.
Users search for a stock ticker and review historical price behavior through interactive charts and market summaries.
From there, they can inspect directional prediction output, compare it against recent trends, and review supporting context such as sentiment signals and model probability. The interface is designed to keep the experience simple while making it clear that the prediction is exploratory, not financial advice.
Implementation
A ticker request begins with local symbol search, then triggers live requests for daily adjusted market data, company details, news, benchmark data, and optional macro or options inputs.
Historical price data is normalized into OHLCV records, filtered by date range, aggregated for chart display, and transformed into model features. The prediction target is whether the next daily return is positive, allowing the app to generate a directional RISE or FALL forecast rather than an exact price estimate.
Keep one application process
Run callbacks and inference in one Dash process.
Evaluate across time
Use time-aware validation and calibrated probabilities.
Train for the requested ticker
Train ticker-specific classifiers when requested.
Simply Stocks is built around a constrained question: directionality instead of exact price.
That constraint keeps the project focused on signal exploration rather than pretending to forecast the market with certainty. The machine learning layer is intentionally limited, while the broader interface emphasizes historical data presentation, visual inspection, and transparent model boundaries.
Implementation
The dashboard uses Dash stores to hold browser-side state while Python callbacks orchestrate data fetching, visualization, and model execution. Plotly renders line, candlestick, and sentiment-overlay charts from server-produced figures.
The modeling layer supports XGBoost and Random Forest classifiers trained per ticker request. XGBoost uses feature selection, randomized parameter search, time-series validation, walk-forward evaluation, and probability calibration, while Random Forest provides an alternate model path with a fixed holdout evaluation.
Ticker search
Search a local symbol list by ticker, prefix, or company name before fetching data.
Historical market visualization
Normalize adjusted market history and render price and sentiment charts with Plotly.
Feature engineering pipeline
Derive model features from price, volume, technical indicators, news, and sentiment.
Directional model training
Train XGBoost or Random Forest per ticker to estimate the next return direction.
Forecast disclaimer gate
Reveal forecasts after users acknowledge their limits as directional estimates.
Ticker-based exploration
Allows users to search for a stock and quickly review historical price behavior in a focused dashboard.
Interactive market charts
Presents stock history through visual tools that make price movement, trend behavior, and market context easier to inspect.
Directional prediction output
Tests whether historical and sentiment-derived signals can support a next-day up-or-down prediction.
Model transparency
Surfaces prediction limitations and confidence context so the output is treated as an experiment rather than investment certainty.
Exploratory MVP scope
Demonstrates how a focused analytics experiment can be scoped around one constrained question instead of expanding into a full trading platform.
Implementation
Ticker search
Uses a local ticker CSV loaded into process memory to search by exact symbol, ticker prefix, or company-name substring before loading dashboard data.
Historical market visualization
Fetches daily adjusted aggregate data from Massive.com, normalizes it into OHLCV records, and renders interactive line, candlestick, and sentiment-overlay charts through Plotly.
Feature engineering pipeline
Builds model inputs from returns, lagged returns, RSI, relative volume, price and volume z-scores, volatility, OBV, VWAP divergence, benchmark-relative strength, sentiment, and news volume.
Directional model training
Trains ticker-specific XGBoost or Random Forest classifiers on request to estimate whether the next daily return is positive.
Forecast disclaimer gate
Keeps forecast output blurred until the user acknowledges that predictions are directional estimates and not financial advice.
Have a related challenge?
Let’s talk about it.
Bring an idea, a workflow to improve, or a technical question. We can work through what comes next.