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.
cd ~/Work/prism
source .venv/bin/activate
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 — 250 requests/day - Finnhub — 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.
streamlit run app.py
Opens at http://localhost:8501
cd ~/Work/prism
source .venv/bin/activate
streamlit run app.py
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
The DCF model uses 5 years of historical Free Cash Flow from yfinance to compute an average growth rate, 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 |
The model uses the Gordon Growth Model for terminal value. Intrinsic value per share is compared against the current market price to show upside/downside.
| 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).