๐ธ
"What if I'd invested my money into that portfolio instead?"
Replay the exact money you actually invested โ the real dates, the real amounts โ into a different basket of ETFs/stocks, and see the dividends and returns you would have earned.
The live demo runs on synthetic data. For your real numbers, run it locally โ your financial data never leaves your machine.
Every backtester on the internet (Portfolio Visualizer and friends) simulates a make-believe "$X every month." Nobody's contributions look like that โ real life is lumpy dates and amounts. Divvy replays your genuine contribution calendar (from a broker export, a plain date,amount CSV, or a 1099 dividend import) into whatever portfolio you're curious about, with dividend reinvestment (DRIP).
๐ก "If I'd put the exact money I actually invested into this basket instead, how much more โ in dividends specifically, and in total โ would I have made?"
Add portfolios, tweak the knobs, and compare dividends & returns live.
Your actual contribution calendar, not a synthetic assumption.
Lifetime and trailing-12-month run-rate โ the number income investors care about.
Money-weighted XIRR, an SPY benchmark row, max drawdown & volatility.
A local web app to add/remove tickers, tweak weights, and compare live.
Optional after-tax dividends, rebalancing, and expense-ratio drag.
All financial data stays on your machine. Nothing uploaded, nothing committed.
No data required โ kick the tires with synthetic mode:
pip install 'divvy-backtest[ui]'
# zero-data quickstart
divvy compare --synthetic-monthly 500 --synthetic-start 2019-01-01 \
--bucket examples/buckets/dividend_etf_core.yaml \
--bucket examples/buckets/high_yield_tilt.yaml
# or launch the interactive Experiment Lab
divvy ui
Contributions and each holding's ex-dividend dates are merged into one chronological event stream. Contributions buy shares at that day's close; dividends are reinvested (DRIP) into the same holding. Returns use money-weighted XIRR so lumpy cash flows are handled honestly, and risk metrics come from a contribution-free NAV so drawdown/volatility reflect the basket itself.