Methodology & Technical Notes
How the simulator gets from raw financial data to comparable portfolio values — including the assumptions made at each step. Written for readers who want to understand the math and modeling choices, not just the controls.
Overview ▾
Your brokerage account shows a dollar value that changes every month. But if you wanted to reconstruct that value from scratch — starting only with publicly available fund data — you'd quickly run into a series of non-obvious problems. The price you see on Yahoo Finance for a mutual fund or ETF is not the same as what you'd have in your account if you'd invested in that fund. Distributions, expense ratios, advisor fees, rebalancing, and taxes all wedge between "the fund's reported price" and "what an investor actually experienced."
This page explains exactly what the simulator does to bridge that gap for each of its four scenarios — and where it makes simplifying assumptions. The goal is transparency: if you want to evaluate whether the simulator's outputs are meaningful, or whether its assumptions match your situation, everything you need to know is here.
The sections below follow the data's journey from raw source through each modeling step. Each section opens with a plain-English summary of what's happening and why it matters, followed by the specific mechanics for readers who want the details.
The Full Pipeline ▾
The diagram below shows how the simulator moves from raw data to final output — and where your parameter settings shape that process. Each section of this page covers one stage in detail; this is the map.
Reading the diagram: rectangular boxes are process steps; diamonds are decision points. Lines labeled [param: …] inside a box identify the simulator setting that controls that step. The monthly loop repeats for every month in your selected date range.
%%{init: {'theme': 'base', 'flowchart': {'useMaxWidth': false, 'htmlLabels': false}, 'themeVariables': {
'background': '#001e2a',
'mainBkg': '#002d3d',
'primaryColor': '#002d3d',
'primaryTextColor': '#e4f6fb',
'primaryBorderColor': '#7dd4e8',
'lineColor': '#5a9aaa',
'secondaryColor': '#001e2a',
'tertiaryColor': '#001420',
'clusterBkg': '#001420',
'clusterBorder': '#2a5a70',
'titleColor': '#c8f0f8',
'edgeLabelBackground': '#001e2a',
'fontSize': '12px'
}}}%%
flowchart TD
classDef src fill:#002d3d,stroke:#7dd4e8,color:#c8f0f8
classDef proc fill:#001e30,stroke:#4db8a0,color:#e4f6fb
classDef dec fill:#2a1800,stroke:#e07040,color:#f8d8c0
classDef param fill:#180d28,stroke:#a080d0,color:#d8c8f8
classDef out fill:#1a2800,stroke:#e8c020,color:#f8f0c0
classDef hdr fill:#001e2a,stroke:#5a9aaa,color:#5a9aaa,stroke-dasharray:3 2
HDR1[["— Data Sources —"]]:::hdr
YF[/"Yahoo Finance\n(prices + distributions)"/]:::src
FRED[/"FRED — CPI, T10Y2Y"/]:::src
HDR2[["— Data Preparation —"]]:::hdr
TR["Build Total Return Index"]:::proc
ME["Resample to month-end"]:::proc
AL["Align to common period\n[param: start / end dates]"]:::proc
INIT["Initialize portfolio by weights\n[param: stock/bond split, initial $]"]:::proc
HDR3[["— Monthly Simulation Loop —"]]:::hdr
RET["Apply monthly returns\n[param: monthly contribution $]"]:::proc
FEE{"advisor fee > 0?\n[param: advisor fee %]"}:::dec
FDED["Deduct monthly fee"]:::proc
CON["Add monthly contribution"]:::proc
RBM{"rebalance this month?\n[param: rebalancing frequency]"}:::dec
MOM{"momentum enabled?\n[param: momentum on/off]"}:::dec
RANK["Rank funds by 12-mo return\n[param: aggressiveness level]"]:::proc
YCI{"yield curve inverted?\n[data: T10Y2Y from FRED]"}:::dec
SHIFT["Shift equity allocation\nto bonds"]:::proc
RBAL["Rebalance to target weights"]:::proc
TXRB{"taxable account + advisor?\n[param: account type]"}:::dec
RTAX["Apply rebalance tax (20%)"]:::proc
LOOP{"more months?"}:::dec
HDR4[["— Post-Processing —"]]:::hdr
INFL{"show real dollars?\n[param: inflation toggle]"}:::dec
CPID["Apply CPI deflator"]:::proc
ATOG{"show after-tax?\n[param: after-tax toggle]"}:::dec
ATXV["Mark-to-market after-tax value"]:::proc
OUT[["Chart · Stat Cards"]]:::out
HDR1 --> YF & FRED
YF --> HDR2
FRED --> HDR2
HDR2 --> TR --> ME --> AL --> INIT --> HDR3
HDR3 --> RET --> FEE
FEE -- yes --> FDED --> CON
FEE -- no --> CON
CON --> RBM
RBM -- no --> LOOP
RBM -- yes --> MOM
MOM -- no --> RBAL
MOM -- yes --> RANK --> YCI
YCI -- yes --> SHIFT --> RBAL
YCI -- no --> RBAL
RBAL --> TXRB
TXRB -- yes --> RTAX --> LOOP
TXRB -- no --> LOOP
LOOP -- yes --> RET
LOOP -- no --> HDR4
HDR4 --> INFL
INFL -- yes --> CPID --> ATOG
INFL -- no --> ATOG
ATOG -- yes --> ATXV --> OUT
ATOG -- no --> OUT
Data Sources ▾
The simulator uses two external data sources: Yahoo Finance for fund price and distribution history, and the Federal Reserve (FRED) for inflation and yield curve data.
| Source | What we use | Frequency |
|---|---|---|
| Yahoo Finance | Daily closing prices and distributions (dividends + capital gains) for each fund ticker | Daily, resampled to month-end |
| FRED — CPIAUCSL | Consumer Price Index for All Urban Consumers, used for inflation adjustment | Monthly |
| FRED — T10Y2Y | 10-Year minus 2-Year Treasury spread, used to identify yield curve inversions | Daily, averaged to monthly |
Why Yahoo Finance, and what exactly do we fetch?
Yahoo Finance provides free access to the full history of fund NAV (net asset value) prices and distribution records. Critically, we fetch these as two separate data streams: raw unadjusted closing prices, and a separate record of every distribution (dividend or capital gains payout) on its ex-dividend date. We do not use Yahoo's pre-adjusted price series — see the next section for why.
Coverage dates
Different funds have different inception dates, which limits how far back any comparison can go. The simulator's default (Modern / ETF) portfolio uses VTI, VXUS, and BND; the earliest common date for all three is around September 2011, driven by VXUS's inception. The Pre-ETF portfolio (VFINX, VWIGX, VBMFX) extends coverage back to January 1987. When you choose a start date, the simulator automatically clips to the earliest date for which all selected funds have data.
When the Pre-ETF era is selected, the simulation uses VFINX, VWIGX, and VBMFX for the entire date range — including years after 2011 when the modern ETFs (VTI, VXUS, BND) became available. This is intentional. The goal is a single consistent baseline throughout the simulation period. Switching fund families mid-simulation would introduce a return discontinuity that is difficult to interpret. More practically, an investor who started in 1987 with these Vanguard index mutual funds would likely have held them indefinitely rather than converting — transaction costs, tax events, and inertia all favor staying put. The Pre-ETF era is best understood as: what would a patient, low-cost index investor have experienced starting in the late 1980s, using the tools available at the time?
Building a Total Return Index ▾
If you look up a fund's price chart on Yahoo Finance, you're seeing its NAV — the per-share value of the fund's holdings. But when a fund pays out a dividend or capital gains distribution, that payment leaves the fund: the NAV drops by the distribution amount on the ex-dividend date, even though investors who reinvest receive new shares that offset the drop. A price chart that doesn't account for reinvested distributions will therefore show the fund significantly underperforming its actual investor experience over time.
The simulator builds a total return index manually for every fund. This means we assume all distributions are immediately reinvested — which is the standard assumption for comparing investment strategies and matches what happens in most tax-deferred accounts and many taxable accounts.
The construction formula
For each trading day, we compute a one-day total return that includes any distribution paid that day:
We then compound these daily returns into a cumulative total return index, anchored to the fund's first available closing price:
Monthly returns are then derived by taking the percentage change between consecutive month-end values of this index.
Why not use Yahoo's pre-adjusted prices?
Yahoo Finance offers a "adjusted close" price series that attempts to account for distributions by adjusting all historical prices backward. For ETFs and many stocks this works reasonably well. For actively managed mutual funds, it does not — because these funds distribute large capital gains annually, and Yahoo's backward adjustment double-counts these distributions, making the fund's historical record appear significantly better than it actually was. In tests, using adjusted close prices for active mutual funds inflated their apparent returns by 20–80% over multi-decade periods. The manual construction above avoids this entirely.
Reinvestment timing assumption
Yahoo records distributions on the ex-dividend date, which is when the distribution amount is reflected in NAV. In practice, investors receive the cash on the payable date, typically two to four weeks later. The simulator assumes reinvestment at the ex-dividend date's closing price rather than the payable date's. For monthly-resolution results this introduces a negligible timing imprecision.
Aligning the Data ▾
To compare multiple funds on equal footing, their return series must cover exactly the same dates. Two steps are needed: normalizing each fund's data to a common calendar, and clipping all series to the period where every fund has data.
Month-end normalization
Daily total return indices are resampled to month-end: we take the last available value in each calendar month. All series are then normalized to standard month-end timestamps (the last calendar day of each month), which ensures that February 28 in one series aligns with February 28 in every other, regardless of whether the fund had a trading day on that exact date.
Common-period alignment (inner join)
Monthly returns are computed for each fund individually. The four base scenarios then use an inner join: only months where every selected fund has a return value are included. This means the simulation period is determined by the fund with the latest inception date in the comparison set. For the default ETF portfolio, that's VXUS (September 2011). Any month where any fund is missing data is excluded entirely, which prevents the simulator from implicitly assuming a fund existed before it did.
Portfolio Construction ▾
Each scenario is built around a three-fund portfolio: a US equity fund, an international equity fund, and a bond fund. Your stock/bond split slider determines the overall equity and bond allocations; within the equity portion, the split is fixed at 80% US / 20% international.
Intl equity weight = 0.20 × stock_pct → 16% of portfolio
Bond weight = 1 − stock_pct → 20% of portfolio
Per-fund holding tracking
Rather than tracking a single aggregate portfolio value, the simulator tracks a separate dollar balance for each fund at every time step. This matters for rebalancing: when the portfolio drifts away from target weights, the simulator can correctly identify which positions to grow and which to trim, and can apply taxes only to the positions being reduced.
How monthly returns are applied
At each monthly time step, each fund's balance is multiplied by (1 + that fund's
monthly return). Returns come from the total return index constructed in the
previous section and therefore include reinvested distributions. The sequence within each
month is: apply returns → deduct advisor fee (if any) → add monthly contribution →
rebalance (if scheduled).
The Four Scenarios ▾
The simulator runs four parallel portfolios simultaneously, using the same start date, contribution schedule, and stock/bond split for all four. The scenarios differ in which funds they hold and what fees are applied on top of those funds' underlying returns.
Index funds (e.g. VTI / VXUS / BND). No advisor. No fees beyond the funds' own expense ratios, which are already embedded in their historical NAV prices. This is the baseline.
Same index funds as Scenario 1, but with an annual advisor AUM fee deducted monthly. Represents using index funds but paying for a financial advisor.
Active mutual funds (e.g. AGTHX / DODFX / PTTAX). No advisor. The funds' expense ratios are already embedded in their historical NAV prices — no separate fee deduction is needed.
Same active funds as Scenario 3, plus an annual advisor AUM fee deducted monthly. The fund ERs are still embedded in returns; only the advisor fee is added on top.
How expense ratios are handled
Fund expense ratios are not explicitly deducted by the simulator. Instead, they are already "baked in" to the funds' historical return data: every day's NAV already reflects the fund's management expenses being deducted from the portfolio. This is how fund expenses actually work — they are accrued daily against the fund's assets, not billed separately to investors. The weighted expense ratio displayed in the sidebar is informational only; it shows how much of your return is being silently absorbed by fund costs, but the simulation doesn't double-count it.
This also means that when comparing index funds to active funds, the comparison is genuinely apples-to-apples: both sets of returns already reflect their respective cost structures. The index funds' low expense ratios (around 0.03–0.05%/year) contribute only trivially to their NAV drag; the active funds' higher ratios (often 0.4–1.0%/year) are already reducing their displayed historical performance.
The advisor AUM fee as a separate variable
Because advisor fees vary widely (typically 0.5–1.5%/year) and are not embedded in any fund's returns, they are applied as an explicit monthly deduction. This allows you to dial in your actual or hypothetical advisor cost and see its compounding impact over time. See the Advisor Fees section below for the exact mechanics.
Rebalancing ▾
Over time, funds grow at different rates and the portfolio drifts away from its target weights. Rebalancing restores those weights by selling the overweight positions and buying the underweight ones. The simulator supports three rebalancing frequencies: annually, quarterly, and never.
What happens at a rebalance
At each rebalance event, the simulator computes the new target dollar amount for each fund based on current portfolio value plus the month's contribution:
Each fund's balance is then set to its target. In a taxable account, positions being reduced trigger realized capital gains (see Tax Modeling). Positions being increased do not.
Between rebalances: proportional contribution
In months without a scheduled rebalance, the monthly contribution is added to each fund proportionally to its current weight in the portfolio. This means contributions naturally provide some drift-offsetting without triggering a formal rebalance. It also means the "never rebalance" option still allocates new money proportionally rather than sending it all to a fixed allocation — the portfolio drifts, and contributions follow the drift.
First month
In the first month, the initial investment is distributed to all three funds according to the target weights. No contribution is added in month one — the first monthly contribution begins in month two.
Advisor Fees ▾
Advisor fees are expressed as an annual percentage of assets under management (AUM). In reality, most advisors charge quarterly (billing on the prior quarter's ending balance), but for modeling purposes a monthly accrual against the current balance is equivalent and simpler to implement consistently.
Monthly fee conversion
The annual rate is converted to a monthly equivalent using geometric (not simple) division, which correctly accounts for compounding:
For example, a 1.0% annual fee becomes approximately 0.0830% per month.
Application sequence
The fee is deducted before the monthly contribution is added. It is applied to the current portfolio value by scaling all fund holdings down proportionally:
holdingsfund ×= (portfolio_value − fee) / portfolio_value
This preserves the relative weights across funds while reducing total portfolio value by exactly the fee amount. The cumulative fees paid are tracked and displayed in the stat cards.
Tax Modeling ▾
Real after-tax wealth — what you'd actually net if you liquidated your portfolio — depends on both the account type and the investment strategy's trading behavior. The simulator models this with three distinct tax modes, applied differently across the four scenarios.
Taxable accounts: two behaviors
In taxable mode, the simulator distinguishes between strategies that trigger capital gains continuously (via active rebalancing) versus those that defer realization until sale:
| Scenario | When gains are taxed |
|---|---|
| Low-Cost Index & Active (no advisor) | At liquidation only. Gains accumulate unrealized throughout the simulation period and are taxed in full when you "sell" at the end. |
| Fee-Adjusted Index & Active (with advisor) | At each rebalancing event (on positions being reduced) and at final liquidation for any remaining unrealized gains. Advisors typically trigger annual rebalancing, which realizes gains. |
The capital gains tax rate
A flat 20% long-term capital gains rate is applied throughout. In reality, the rate depends on your income (0%, 15%, or 20% federally, plus potential state taxes and the 3.8% Net Investment Income Tax for high earners). The 20% rate represents the upper federal bracket and is intended as a conservative estimate for illustrative purposes.
Cost basis tracking and rebalance taxation
The simulator tracks a single aggregate cost basis for the entire portfolio — the cumulative sum of all contributions made so far. At each rebalancing event, it estimates what fraction of the current portfolio value represents unrealized gains:
Tax is then applied only to the dollar value of positions being reduced (sold), multiplied by the gain rate:
After paying rebalance taxes, the cost basis is stepped up by the after-tax value of the gains that were just recognized, so those gains aren't taxed again at liquidation.
After-tax wealth display
The "Show after-tax wealth" toggle causes chart lines to reflect mark-to-market after-tax wealth: the value you would net at any given point if you liquidated the entire portfolio on that date and paid taxes on all remaining unrealized gains. This is a useful way to see the real cost of deferred taxes building up over time.
Simplifications
The tax model uses a single aggregate cost basis rather than per-lot tracking (which would support specific identification or FIFO methods). It also uses a uniform 20% rate. Both simplifications mean the numbers are illustrative, not tax advice — actual tax outcomes will differ based on your specific situation.
Inflation Adjustment ▾
Portfolio values in nominal dollars can be misleading over long periods because a dollar in 1987 bought significantly more than a dollar today. The inflation adjustment converts all values to today's purchasing power — "real dollars" — so that growth curves reflect genuine increases in wealth rather than partly just the shrinking value of money.
CPI deflator construction
The simulator uses the Consumer Price Index for All Urban Consumers (CPIAUCSL) from FRED. A deflator series is computed by dividing the CPI value at the simulation's base date (the end of the simulation period) by the CPI value at each earlier date:
Multiplying a nominal portfolio value by this deflator converts it to the equivalent purchasing power in today's dollars. Values after the base date have a deflator of 1.0 (by definition, today's dollars are today's dollars). Values in earlier periods have deflators greater than 1.0, inflating them to reflect their higher purchasing power.
Inflation adjustment is applied as a final step, after all fee and tax calculations, so that the real-dollar values accurately represent real-dollar wealth after costs.
Momentum Rotation ▾
The optional momentum scenarios simulate an advisor strategy that annually reallocates toward recent winners within a larger universe of funds. Both momentum scenarios include the advisor AUM fee and are run in taxable rebalance mode (gains realized annually), since active rotation is fundamentally an advisor-driven strategy.
Fund universe
Rather than the fixed three-fund portfolio used in the base scenarios, momentum uses an expanded universe: up to 12 equity funds and 3 bond funds in ETF mode (fewer in Pre-ETF mode, constrained by data availability). Only funds with a full 12 months of return history at the time of each rebalance are eligible — this prevents look-ahead bias from using funds that didn't yet exist.
Rank-based weighting
At each annual rebalance, equity funds are ranked by their trailing 12-month cumulative return. The best-performing fund receives N points, the next receives N−1, and so on down to 1 point for the worst. Portfolio weights are then proportional to point totals. This gives the top performers a larger allocation while maintaining exposure to all eligible funds — a smoother approach than pure "winner takes all" rotation.
The bond allocation always goes entirely to the single best-performing bond fund.
Aggressiveness levels
Three aggressiveness settings modify the equity concentration:
| Level | Modification |
|---|---|
| Conservative | A floor of 5% of the equity allocation is applied to every eligible fund before normalizing weights. This reduces concentration in top performers and ensures all funds retain meaningful exposure. |
| Moderate | Standard N-point weighting with no floor or amplification. |
| Aggressive | The top three ranked funds have their point totals doubled before normalization, significantly concentrating the portfolio in the recent winners. |
Yield curve tactical overlay
If the yield curve (the 10-Year minus 2-Year Treasury spread, T10Y2Y from FRED) was negative at any point during the prior 12 months, the strategy shifts a portion of the equity allocation to bonds at the next rebalance. The shift amount depends on aggressiveness: 10% of the equity allocation for Conservative, 20% for Moderate, 35% for Aggressive. The red-shaded regions on the chart mark historical inversion periods.
This overlay is defensive in nature — yield curve inversions have historically preceded recessions, so the strategy reduces equity exposure after a signal has appeared. Note that this is backward-looking (uses prior 12 months) and does not use any forward-looking information.
Known Limitations ▾
The simulator is designed to be as rigorous as a free public-data tool can be, but several significant simplifications and caveats apply.
Survivorship bias
The active funds in the simulator are well-known, large, long-surviving funds. They were selected precisely because they have long histories — and they have long histories partly because they performed well enough to survive. The full universe of actively managed funds from 1987 or 2011 included many others that quietly closed or merged after poor performance. Any comparison between the curated set here and the index therefore overstates how well a randomly chosen active fund would have done. This is a structural limitation of any comparison using publicly available data, not a flaw specific to this tool.
Note: Yahoo Finance generally does not delete historical price data for closed or merged funds — a closed fund's ticker typically retains its full history up to the closure date. The survivorship bias here is in which funds were chosen for comparison, not in data deletion.
Ex-dividend vs. payable date timing
As described in the Total Return section, distributions are assumed reinvested on the ex-dividend date at that day's closing price. Actual cash is received on the payable date (typically 2–4 weeks later). This introduces a minor timing imprecision that has negligible impact at monthly resolution.
Month-end pricing
All simulations use the last available trading day's price in each calendar month. Returns are therefore computed month-over-month on end-of-month NAVs. Intra-month price movements — including any that occurred on the actual calendar month-end when no trading occurred — are not captured.
No transaction costs on rebalancing
The simulator does not deduct trading commissions, bid-ask spreads, or fund redemption fees when rebalancing. For modern ETFs and no-load mutual funds at major brokerages, transaction costs are now effectively zero, making this a reasonable assumption for the default fund set. For older fund families or advisor-managed accounts, some cost drag may be missing.
CAGR calculation
The CAGR displayed in the stat cards is computed as:
This uses total contributions as the denominator rather than a true money-weighted internal rate of return (IRR). For portfolios with significant monthly contributions relative to the initial investment, this overstates the return compared to a true IRR, because early contributions had more time to compound than later ones. The CAGR shown is best interpreted as a rough annualized growth indicator, not a precise per-dollar return measure.
Single capital gains rate
The tax model uses a flat 20% federal long-term capital gains rate. Actual rates range from 0% to 20% depending on income, and state taxes vary widely. The after-tax values shown are illustrative; consult a tax professional for planning purposes.
This is not financial advice
The simulator uses real historical data for educational purposes only. Past performance does not guarantee future results. Nothing here should be construed as a recommendation to buy, sell, or hold any security or to use or avoid any particular investment strategy.