Skip to content
karim.semaan(open to work)
WorkExperienceAboutSkillsContactResume ↓
← All work
BullBear preview
Data & ToolsLive2025

BullBear

Stock decision dashboard · AI signals

Eight weighted indicators roll up into one explainable Buy/Sell/Hold call with a 0-100% confidence score; a documented optimization pass cut market-data loads from 20+s to ~9s and took AI-recommendation coverage from 0% to 100%.

BullBear · Signal0/0 · 0%

Pick the next move: Bull (up) or Bear (down).

Opens the live Hugging Face Space.

Open live app ↗︎

BullBear, a graduate financial-analytics course project, ingests historical OHLCV plus real-time Yahoo Finance quotes and produces explainable trading recommendations: a StockSignalAnalyzer computes eight independent signals (RSI, MACD, moving averages, Bollinger Bands, volume, momentum, support/resistance, news sentiment), each with an explicit weight, and combines them into a Buy/Sell/Hold call with a 0-100% confidence score and human-readable reasoning for every signal. A Gradio UI sits over a layered core/analysis/visualization architecture that uses the Strategy pattern to swap technical, fundamental and risk views, computing returns, volatility, Sharpe, max drawdown, VaR and correlation heatmaps over a bundled 20-asset portfolio (2013-2017, 24,520 daily rows). A documented optimization pass (batch quote fetching instead of sequential calls, adaptive minimum-data requirements, fallback fetches) cut market-load time from 20+s to ~9s and took AI-recommendation coverage on market movers from 0% to 100%. The recommendation engine is deterministic weighted-indicator logic, not a trained model, and the card says so.

  • Python
  • Gradio
  • Pandas
  • NumPy
  • Plotly
  • yahooquery
  • SciPy
  • Hugging Face Spaces
Signal engine
8 weighted indicators
Load time
60% faster (20s → 9s)
Bundled OHLCV
24,520 rows · 20 assets
Code
11,362 LOC · 17 modules

What I'd improve

The eight signal weights are hand-set, not learned, and nothing in the project verifies the calls would have made money. The honest next step is a backtest of the signal engine against buy-and-hold over the bundled 2013-2017 portfolio, and only then deciding whether learned weights or an actual model earn their complexity. After that, the project's own open items: result caching and parallel recommendation processing to push market loads under 5 seconds.

Open live↗︎Project report (PDF)↗︎
Want something like this? Get in touch →

Measured:30/30 chatbot evals·20-case Bastion eval·Serving·Calibration Lab

© 2026 Karim SemaanBuilt with Next.js, Tailwind & Supabase.LinkedIn ↗︎GitHub ↗︎