# 🔷 Prism A local financial analysis dashboard. Enter any stock ticker to get a formatted view of financial statements, valuation metrics, a DCF model, and a news feed — all in your browser. --- ## Features - **Market Bar** — Live S&P 500, NASDAQ, DOW, and VIX at the top of every page - **Overview** — Price chart (1M / 3M / 6M / 1Y / 5Y), key stats (market cap, P/E, 52W range, beta) - **Financials** — Annual and quarterly Income Statement, Balance Sheet, and Cash Flow Statement with year-over-year % change columns - **Valuation** — Key ratios grid (P/E, EV/EBITDA, margins, ROE, etc.), DCF model with adjustable WACC/growth/years, EV/EBITDA implied price, comparable companies table, analyst price targets, and earnings history (EPS actual vs. estimate) - **News** — Recent articles with heuristic Bullish / Bearish / Neutral tags and a 7-day sentiment summary --- ## Setup ### 1. Clone / navigate to the project ```bash cd ~/Work/prism ``` ### 2. Activate the virtual environment ```bash source .venv/bin/activate ``` ### 3. Add API keys ```bash cp .env.example .env ``` Open `.env` and fill in your keys: ``` FMP_API_KEY=your_key_here FINNHUB_API_KEY=your_key_here ``` Both are **free**: - **FMP** (Financial Modeling Prep) — [financialmodelingprep.com](https://financialmodelingprep.com/developer/docs) — 250 requests/day - **Finnhub** — [finnhub.io](https://finnhub.io) — 60 requests/minute > **No keys?** The app still works. Price data, financials, and market indices are sourced from `yfinance` (no key required). Ratios, comps, and news won't load until keys are added. ### 4. Run the app ```bash streamlit run app.py ``` Opens at `http://localhost:8501` --- ## Daily Usage ```bash cd ~/Work/prism source .venv/bin/activate streamlit run app.py ``` --- ## Project Structure ``` prism/ ├── app.py # Entry point ├── requirements.txt ├── .env # Your API keys (not committed) ├── .env.example # Key template ├── .streamlit/ │ └── config.toml # Dark theme + layout settings ├── services/ │ ├── data_service.py # yfinance — price, financials, indices │ ├── fmp_service.py # FMP API — ratios, peers │ ├── news_service.py # Finnhub — news + sentiment │ └── valuation_service.py # DCF engine (Gordon Growth Model) ├── components/ │ ├── market_bar.py # Index metrics row │ ├── overview.py # Company header + price chart │ ├── financials.py # Statement tables │ ├── valuation.py # Ratios, DCF, comps │ └── news.py # News feed └── utils/ └── formatters.py # Number formatting helpers ``` --- ## DCF Model Notes The DCF model uses historical **Free Cash Flow** from yfinance, computes a capped median growth rate from valid positive-FCF periods, and then projects forward using your chosen assumptions: | Input | Default | Range | |---|---|---| | WACC | 10% | 5–20% | | Terminal Growth Rate | 2.5% | 0.5–5% | | Projection Years | 5 | 3–10 | | FCF Growth Rate | Historical median | -20–30% | The model uses the **Gordon Growth Model** for terminal value. It first estimates **enterprise value**, then bridges to **equity value** using debt and cash before calculating value per share. Terminal growth must remain below WACC. The FCF growth slider defaults to the historical median but can be freely overridden. The **EV/EBITDA** tab derives an implied price by applying a target multiple to trailing EBITDA, subtracting net debt, and dividing by shares outstanding. The slider defaults to the company's current market multiple. --- ## API Rate Limits | Source | Limit | Used For | |---|---|---| | yfinance | None | Price, financials, indices | | FMP (free) | 250 req/day | Ratios, comps, news | | Finnhub (free) | 60 req/min | News, sentiment | Data is cached in-memory per session to minimize API calls (financials: 1h, news: 10min, indices: 5min).