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 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 |
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.
| 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).