ClearView Analytics Methodology & Model Assumptions
We built ClearView because we were tired of financial tools that show you numbers without explaining where they come from. This page documents the math behind every major calculation in ClearView — what we compute, what assumptions we make, and where you should apply your own judgment.
1. Money-Weighted Return (MWR)
ClearView calculates portfolio performance using the money-weighted return (MWR), also called the internal rate of return (IRR). MWR measures your actual dollar return — it weights each period by how much money you had invested during that period, so large deposits before a strong market move count more than small deposits after one.
How it works
MWR is the rate r that solves:
0 = -V₀ + C₁/(1+r)^t₁ + C₂/(1+r)^t₂ + ... + Vₙ/(1+r)^T
Where V₀ is the starting portfolio value, C₁...Cₙ are cash flows (positive = deposit, negative = withdrawal) at times t₁...tₙ expressed as fractions of the total period, and Vₙ is the ending portfolio value. We solve this numerically using Newton-Raphson iteration in the Python calculation engine.
MWR vs. Time-Weighted Return (TWR)
TWR is what mutual funds use to report performance — it strips out the effect of cash flows entirely. MWR is what actually happened to your money. If you deposited $500K right before a market crash, your MWR will be worse than the fund's TWR for the same period. Both are valid; they answer different questions. ClearView currently reports MWR. TWR support (requiring daily price history) is on the roadmap.
Data inputs
- Starting value: sum of account balances at the analysis start date
- Ending value: sum of current account balances at run time
- Cash flows: investment transactions from Plaid (buys, sells, dividends, transfers) or CSV upload
- Dividends are treated as positive cash flows (income received, not reinvestment)
2. Asset Allocation Analysis
ClearView classifies every holding by asset class and sector. For individual stocks, classification comes from the security metadata returned by Plaid and supplemented by our reference data. For ETFs and mutual funds, we use an ETF look-through model (see section 7).
Asset class taxonomy
| Asset Class | Examples |
|---|---|
| US Equity | VTI, SCHB, individual US stocks |
| International Equity | VXUS, EFA, VEA, individual ADRs |
| US Fixed Income | BND, AGG, SCHZ, TIPS, T-bills |
| International Fixed Income | BNDX, EMB |
| Real Estate | VNQ, SCHH, individual REITs |
| Commodities | GLD, SLV, DJP |
| Cash & Equivalents | Money market, VMFXX, short T-bills |
| Alternative | Crypto, private equity, hedge funds |
| Other / Unknown | Unclassified securities |
Allocation percentages are computed as each holding's current market value divided by total portfolio value. Unclassified holdings are shown separately and flagged — they do not skew the classified percentages.
3. Monte Carlo Retirement Simulation
ClearView's retirement simulator runs 1,000 Monte Carlo trials to project the probability that your portfolio lasts through your planning horizon. Each trial draws random annual returns from a normal distribution parameterized by your asset allocation.
Return assumptions by allocation
| Allocation | Real Return (mu) | Std Dev (sigma) |
|---|---|---|
| 100% Equity | 6.5% | 15.0% |
| 80/20 Equity/Bond | 5.5% | 12.0% |
| 60/40 Equity/Bond | 4.5% | 9.5% |
| 40/60 Equity/Bond | 3.5% | 7.5% |
| 20/80 Equity/Bond | 2.5% | 5.5% |
| 100% Fixed Income | 1.5% | 4.0% |
Real returns (inflation-adjusted). Based on long-run historical averages; not a guarantee of future performance.
Simulation mechanics
- At each year, draw a random return from N(mu, sigma) using numpy.random.normal
- Apply the return to the current portfolio balance
- Subtract annual spending (inflation-adjusted by your assumed inflation rate, default 2.5%)
- Add any projected income (Social Security, pension, part-time work) as a positive cash flow
- If balance reaches zero, the trial is marked as "failed" at that age
- After 1,000 trials, success rate = trials where balance > 0 at end age
Spending model options
- Fixed real spending: Annual withdrawal grows with inflation each year
- Blanchett smile: Spending follows a U-shaped curve — higher in go-go years (65-75), lower in slow-go years (75-85), higher again in no-go years (85+) for healthcare. Based on David Blanchett's 2013 research in the Journal of Financial Planning.
Fan chart interpretation
The fan chart shows the 10th, 25th, 50th, 75th, and 90th percentile portfolio balances at each age. The 50th percentile (median) is the "base case." The 10th percentile is a stress scenario — only 10% of simulations ended up worse than this line.
What "90% success rate" means
A 90% success rate means 900 of 1,000 simulated retirements ended with money remaining. Most financial planners target 85-95%. Below 80% suggests meaningful adjustments are needed — reduce spending, delay retirement, or increase savings rate.
4. Roth Conversion Optimizer
The Roth optimizer builds a year-by-year conversion schedule designed to minimize lifetime federal income taxes. It uses a greedy bracket-filling algorithm constrained by IRMAA Medicare surcharge thresholds.
A detailed writeup of the algorithm, including IRMAA cliff analysis, Social Security stacking, and a worked example, is in our companion article:
The Math Behind Roth Conversion Optimization (And Why Most Calculators Get It Wrong) →Algorithm summary
- Project IRA balance forward at assumed growth rate each year
- Compute ordinary income for each year: Social Security (after provisional income test), pension, RMDs (starting at 73 or 75 per SECURE 2.0), other taxable income
- Find conversion headroom: top of target bracket minus ordinary income minus standard deduction
- Apply IRMAA constraint: if converting to headroom would cross an IRMAA cliff, cap at the cliff (or evaluate whether pushing through saves more over the horizon)
- Convert the headroom amount from Traditional IRA to Roth IRA for that year
- Compute tax on conversion at effective marginal rate
- Project Roth and IRA balances forward to next year
- Repeat for each year in the pre-RMD window
Key inputs
- Current ages (you and spouse for MFJ)
- Current Traditional IRA / 401(k) balance
- Current Roth IRA balance
- Expected Social Security benefit(s) and start age(s)
- Other income sources (pension, rental income, part-time work)
- Target bracket ceiling for conversions (default: top of 22% bracket MFJ)
- IRMAA avoidance toggle (on by default)
- IRA growth rate assumption (default: 6.5%)
- Federal filing status
State taxes: The optimizer is currently federal-only. State income tax treatment of Roth conversions varies significantly (some states exempt all retirement income; others tax it fully). State tax modeling is on the roadmap.
5. Accumulation / Growth Planner
The growth planner projects portfolio value at a future target date using compound growth with periodic contributions. It is deterministic (no Monte Carlo) — it shows a single projected path based on your inputs.
Formula
FV = PV * (1+r)^n + C * [((1+r)^n - 1) / r]
Where PV is the current portfolio value, r is the annual return rate, n is the number of years, and C is the annual contribution. Contributions are assumed to be made at the end of each year.
Contribution escalation
If you specify an annual contribution increase rate, contributions compound each year: Cₙ = C₀ * (1 + escalation_rate)^n. This models salary growth driving higher savings rates.
6. Cash Flow Analysis
Cash flow analysis processes your bank and credit card transaction history from Plaid to produce monthly income and expense summaries, category breakdowns, and trend analysis.
Income detection
Transactions are classified as income if they are positive amounts (credits) matching known income patterns: payroll, direct deposit, ACH credits above $500, Social Security, pension payments. Investment dividends and transfers are excluded from income.
Category classification
Categories come from Plaid's personal finance categories, supplemented by ClearView's own mapping layer that groups Plaid's detailed categories into the 12 summary categories displayed in the app (Housing, Food & Dining, Transportation, Healthcare, etc.).
Savings rate calculation
Savings Rate = (Total Income - Total Expenses) / Total Income
Investment transfers (brokerage deposits, 401k contributions) are treated as expenses for savings rate purposes only when they cannot be identified as investment transfers — Plaid's categorization of investment transfers is inconsistent across institutions.
7. ETF Look-Through
A portfolio consisting of "60% VTI, 30% BND, 10% GLD" is not actually classified as 60/30/10 at the top level — VTI itself holds thousands of individual stocks with their own sector breakdown. ETF look-through "unpacks" each fund to its underlying exposures.
ClearView maintains a reference database of approximately 80 widely-held ETFs and mutual funds with their constituent asset class and sector weights. When a recognized ETF appears in your portfolio, we substitute its weight in the allocation analysis with the ETF's underlying breakdown.
Coverage limitation
Our ETF reference database covers the ~80 most commonly held funds. Specialized, thematic, or newer ETFs may not be recognized and will appear as "Unknown" in the allocation analysis. We are working on a dynamic data feed (EODHD Fundamentals) to expand coverage.
8. Data Sources & Refresh Cadence
| Data | Source | Refresh |
|---|---|---|
| Account balances | Plaid | On sync (user-initiated or webhook) |
| Holdings / positions | Plaid investmentsHoldingsGet | On sync; Plaid caches from institution |
| Investment transactions | Plaid investmentsTransactionsGet | On sync; up to 24 months history |
| Bank transactions | Plaid transactionsSync | Cursor-based incremental; real-time webhook |
| Market prices (strip) | Yahoo Finance / Finnhub fallback | Live during market hours, cached 5 min |
| EOD security prices | Yahoo Finance via CRON | Daily M-F at 7 PM ET |
| ETF constituents | ClearView reference database | Manual; ~quarterly updates |
Important note on Plaid data freshness
Plaid's investments API serves cached data from its last successful pull from your institution — it does not fetch live data on demand. When you sync in ClearView, we receive whatever Plaid has cached. Plaid updates its cache asynchronously on a background schedule, or when you use Plaid Link update mode to re-authenticate. For institutions requiring OAuth (like Schwab), Plaid's cache age depends on how recently your OAuth token was refreshed.
9. Known Limitations
- 1.Federal taxes only. The Roth optimizer and retirement simulator do not model state income taxes. State treatment varies significantly and is on the roadmap.
- 2.Normal return distribution. Monte Carlo uses a normal distribution for returns. Real return distributions have fat tails — catastrophic drawdowns happen more often than normal distributions predict. We do not model sequence-of-returns risk separately.
- 3.MWR only (no TWR). Time-weighted return, which enables apples-to-apples benchmark comparison, requires daily price history. We're building this capability (target: mid-2026).
- 4.Plaid coverage gaps. Not all institutions support Plaid's investments API. Some brokerages (particularly self-directed IRAs, annuities, and smaller custodians) require CSV upload instead.
- 5.Tax bracket assumptions. The Roth optimizer uses current-law IRS brackets. The 2017 TCJA provisions affecting individual rates are scheduled to sunset after 2025 unless extended by Congress. We model current-law brackets by default; a sunset scenario toggle is on the roadmap.
- 6.Social Security estimates. If you enter your expected SS benefit, we use that number. We do not access SSA records or calculate your benefit from your earnings history. For accurate benefit estimates, use ssa.gov/myaccount.
- 7.Not financial advice. ClearView is an analysis and planning tool. All calculations are illustrative and based on assumptions you provide. They do not constitute financial, tax, or investment advice. Consult a qualified financial professional before making decisions.
Have a question about our methodology, or noticed something that looks wrong? Email us at hello@fiducialabs.ai. We're a small team that takes data quality seriously.