Help · Methodology

The home-purchase what-if and its optimizer

From RangefinderInvest's built-in help · applies to version 0.49.3

A home purchase inside the plan swaps your rent line for ownership costs at the buy year: property tax, insurance, maintenance, plus a mortgage whose payment is fixed in nominal dollars, so it declines in real terms while rent would have kept pace with inflation.

What the engine does at the buy year

  • The down payment goes out as a one-time draw, following the draw order you set in One-time expenses.
  • Spending switches from rent to ownership + mortgage; an optional early payoff year retires the remaining balance as another one-time draw.
  • Everything stays in today's dollars, which is exactly why a fixed mortgage gets cheaper over time in the chart.
  • That applies to the payoff too, and it is the reason a payoff years out costs less on screen than the balance your lender would quote. A mortgage balance is a nominal number; the same years of inflation that shrink the monthly payment shrink the lump sum that retires it, so the figure shown is what that check is worth in today's money. A payoff in the buy year itself has no years to shrink, so there it equals the balance exactly. The down payment plus the buy-year payoff is the full purchase price.

The optimizer

The home goal-seeker is a sandbox: it re-runs your full live plan (spending, income, taxes, ACA, portfolio) across a grid of purchase years and financing choices on identical seeded paths, and reports the frontier. Apply writes a chosen result back into your plan; exploring never touches it.

Its ownership-cost inputs are percentages of price: property tax, insurance and maintenance. HOA is a flat dollar figure. That split is deliberate, and it differs from the Housing panel's flat dollars for a reason: this sandbox varies the price, so a cost entered once in dollars would follow a cheap house and an expensive one alike, charging a starter home a mansion's insurance. HOA is the exception because it genuinely doesn't scale. The defaults are the usual rules of thumb, about 0.35%/yr insurance and 1%/yr maintenance.

Counter-intuitive results can be genuine. Under some plans, buying sooner, all cash beats financing. The mortgage's real-dollar advantage loses to sequence risk on the invested lump sum. When the frontier says something odd, check the year-by-year detail before assuming it's a bug.

How future buy years are modeled

Waiting is simulated, not assumed. Every price × buy year × down % candidate is scored by re-running your whole plan from today's balances: the portfolio compounds along each path, your contributions keep landing, and the housing you pay now (rent, or today's mortgage plus its costs) keeps being paid right up to the buy year. A purchase five years out is funded from whatever each path actually reached by then, not from an assumed growth rate.

Three consequences worth knowing:

  • The horizon never moves. Your end age is fixed, so a loan taken out late only counts the payments that land inside the plan; the ones past the end age are never simulated. Part of what makes a later buy look cheaper is simply that fewer of its payments fit.
  • The house is never an asset. No equity is credited, and neither the home's value nor any remaining loan balance is added back at the end. Ending value is portfolio only; the home appears purely as costs.
  • The mortgage's real decline starts at the purchase. The payment is fixed in nominal dollars from the buy year, so in today's dollars it begins at full size whenever you buy and shrinks from there. A later purchase doesn't inherit a pre-shrunk payment.

What each answer leans on

  • Portfolio at buy year: the simulated 10th–90th percentile band around the median at the start of the buy year, before the down payment goes out. It is the growth the recommendation depends on: a thin low edge means the answer needs the waiting years to go well. A row that buys now has no waiting years to simulate, so it simply shows today's balance.
  • Success by model: that same recommended home scored under all three return models side by side: Forward · Baseline, Forward · Fat tails, and Historical replay, the same trio as the model cards at the top of the page. The lens you are currently on is never re-run; its number is this row's own success, reused, so the two can't drift apart. A blank entry means that model can't run your plan: Historical needs per-asset weights, so it is blank under a Blended allocation, and the two Forward models are blank when a glide path's correlations are invalid. The footnote under the table states what each model actually ran with: your means and volatilities plus the glide, the fat-tail df setting, and the historical preset and windows. When the three disagree, you can see which assumptions produced the disagreement.

If you wait: the same house, after a market you've already seen

The table above funds each buy year from every path at once: the answer is the price that holds your success target across the whole fan. The wait grid asks a narrower, more human question: suppose I actually live through the waiting years and the market lands somewhere specific. Then what?

  • Rows are the first three future buy years in your Buy-between range. Buying now needs no grid. That answer is the table's own row.
  • Columns (Weak / Soft / Expected / Firm / Strong): the 10th, 25th, 50th, 75th and 90th percentile of the active model's cumulative growth over exactly the waiting years, annualized. This is the same five-band ladder the probability fan draws. Soft to Firm is the ordinary course: half of all outcomes land between those columns. Weak and Strong are the 1-in-10 envelope either way. They are plausible, not extreme (a 60/40 portfolio's 2022 was worse than a typical Weak column). All five come out of the model you are already using (your means, volatilities, correlations, the glide, fat tails if on), never a typed-in guess, and they are pure market outcomes: no contributions, no withdrawals, no taxes.
  • Each cell re-solves the price from that conditioned state, holding the winning row's financing fixed: the same down %, rate and term, with the payoff year carried along so it keeps the same offset from the purchase. The cell shows that price, the portfolio you would be sitting on at the buy year, and the annual rate that got you there.
  • Every cell is solved at ONE success target: the first in your list. This is the table's first feasible row, and the grid's heading names it. The other targets aren't in the grid; to run the wait analysis at a stricter bar, put that target first (e.g. 95, 85) and Run again.

What the grid pins, and what it doesn't

  • The waiting years are pinned to one outcome on every path. Inside the window all three account buckets, taxable, tax-deferred and Roth, move together at the cell's rate. The taxable sleeve's own spread and the glide's shifting mix are suspended for those years and resume the moment the window ends.
  • Only the landing point is modeled, not the order of ups and downs. A window that crashes and recovers and one that climbs smoothly arrive in the same cell; contributions and withdrawals during the window meet the smooth version. Sequence risk inside the wait is the one thing the grid gives up.
  • After the wait, your plan resumes on the same seeded paths. Every year is still drawn exactly as it would have been. The window only overrides what those years pay, so the years after the purchase are the same market you saw in the main table.
  • Everything except the market runs at full fidelity in every cell. Taxes, RMDs, the ACA cliff and IRMAA all simulate normally: the down payment's income spike can cost that year's ACA subsidy if the buy lands inside your subsidy window, and it raises Medicare premiums exactly two years later through IRMAA's lookback, so shifting the buy year genuinely moves which calendar years absorb those hits. (Like the rest of the optimizer sandbox, the grid leaves your Roth-conversion plan out, so this is the unmanaged-MAGI picture.)
  • Even the Expected column can afford slightly more than the table says for that year, and that is not a bug. Knowing how the waiting years turned out removes their dispersion; a plan with one less unknown supports a bigger number. The grid is a conditional answer, not a better one.
  • Grid prices read at or below the table's price for the same year. The table is free to search for a better payoff year; the grid holds your winning structure fixed so the columns compare only the market.
  • The implied portfolio is normally a single number. It widens into a band only when inflation uncertainty is on: nominal growth is pinned, but the deflator that converts it to today's dollars still varies path to path.
  • "Expected" is the median, and it sits below the return you typed in. That gap is volatility drag, not an error. Wealth compounds a little slower than the average one-year return.

Why it's off under Historical replay

Under Historical replay the answer already is a realized market sequence. The actual order of the good and bad years is the whole point of that lens. Pinning its first years to a single growth rate would erase precisely the signal it exists to show, so the grid is hidden there.

The honest version of this feature for Historical would replay a chosen window's first years rather than flattening them: "what if the next three years are 1973–75 again?". That is a real refinement, not what runs today; until it exists, use the Forward models for the wait question and Historical for the sequence question.

The success target is the conservatism dial. Solving at 95% asks for a house that still works when the waiting years disappoint. To test a different set of assumptions, switch the return model to Forward, fat-tailed, or Historical, or keep saved scenarios side by side. There is deliberately no separate "assume less growth" toggle on the headline answer: two dials for the same fear quietly multiply, and you end up shopping for a house you can't explain. The wait grid doesn't break that rule. It invents no new pessimism, drawing its weak and strong years out of the plan's own assumptions, and it sits in a read-only side table that never moves the recommended row.