A personal research tool for long-term passive ETF investors. Descriptive analysis + factual context only — never recommendations, scores, or "sentiment."
This tool provides historical analysis and educational content only. It is not investment advice. Consult a licensed financial advisor before making investment decisions. Past performance does not predict future results.
| Feature | Status |
|---|---|
| Watchlist of curated broad-market ETFs (US + UCITS) | ✅ Phase 0 |
| Historical analysis (returns, vol, Sharpe, drawdown, correlations) | 🚧 |
| Risk dashboard (rolling vol, beta, recovery time) | 🚧 |
| DCA backtest simulator | 🚧 |
| Monte Carlo projection (with full assumption disclosure) | 🚧 |
| Headline summariser + sandboxed LLM tagger → portfolio exposure mapping | 🚧 |
| Historical-event viewer (Fed decisions etc.) | 🚧 |
| Glossary | 🚧 |
- No "what should I buy" feature.
- No "sentiment score" or "market outlook."
- No ranking funds as "safer," "better," "lower risk."
- LLM never speculates on price direction or recommends action — it only summarises and tags from a fixed taxonomy. Funds-affected mapping is done in deterministic code reading actual sector breakdowns. See docs/llm-guardrails.md for details.
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
copy .env.example .env # fill in API keys (optional for Phase 0/1)
streamlit run app/main.pyApp opens at http://localhost:8501.
Python 3.11 · Streamlit · yfinance · pandas / numpy / scipy · plotly · SQLAlchemy + SQLite · Anthropic SDK (LLM) · pytest
pytest -qAll financial formulas are tested against known values. The LLM-output validator has tests covering rejection of out-of-taxonomy tags and malformed JSON.
- Annualised return / volatility (252-day convention)
- Sharpe ratio (configurable risk-free rate)
- Max drawdown + recovery duration
- Rolling volatility / beta vs benchmark
- DCA backtest using actual historical prices
- Monte Carlo via geometric Brownian motion with explicit normality-assumption disclosure
MIT.