Compare ETFs and mutual funds over time, then simulate a custom-weighted portfolio. Historical data from Stooq.
Each save includes fund order (drag-and-drop order), weights, time range, starting amount, and monthly contribution. Data stays in this browser only.
The portfolio line shows what your starting dollar amount would be worth if invested across the funds at the weights you specify, rebalanced daily. If you enter a monthly contribution, that amount is added on the first trading day of each calendar month and immediately included in the blend before that day’s market return.
If a fund's historical data doesn't go back far enough to cover the selected range, its weight is redistributed proportionally across the other funds that do have data on that date. Once the fund's data becomes available, it rejoins the portfolio at its target weight.
Each individual fund line shows what the starting amount would be worth invested 100% in that fund alone, beginning from the earliest date the fund has data within the range. If you set a monthly contribution, the same schedule (first trading day of each month) is applied to the portfolio blend and to each fund line for a like-for-like comparison.
Prices come from stooq.com daily close data (free, requires a one-time API key — see "First-time setup" below). If Stooq doesn't have a ticker or is unavailable, the proxy falls back to Yahoo Finance via the scheb/yahoo-finance-api PHP library (daily bars returned as CSV).
The browser calls a tiny local PHP script (fund_proxy.php) which fetches from Stooq and Yahoo server-side and relays CSV. This avoids browser CORS restrictions. The proxy only accepts requests from localhost (any port), hostname calculators (e.g. https://calculators:8890), or playground.nocointeractive.com; optional PROXY_TOKEN in fund_proxy_config.local.php adds another layer for production.
Stooq uses lowercase tickers with a .us suffix internally — you just type the ticker (e.g. SPY). If a ticker fails on both Stooq and Yahoo CSV, try variations (some mutual funds use slightly different symbols).
Returns are based on close prices and do not include dividend reinvestment, so they understate total return for funds that pay distributions.