How Zyvo Calculates Your Numbers
Most trackers show you a return percentage without saying how it was produced. This page is the opposite: the exact method behind every headline number in Zyvo, so you can verify it, trust it, or check it against your own math.
If you're looking for a general explanation of what these metrics mean, see TWR vs IRR and Average Cost vs FIFO. This page covers what Zyvo specifically does, not the general concepts.
Time-Weighted Return (TWR)
TWR answers "how did the investments themselves perform," independent of when you added or withdrew cash. Zyvo computes it by breaking your history into sub-periods at every buy or sell, and geometrically linking the return of each sub-period.
One specific choice worth stating: when a transaction happens, Zyvo marks the position to that transaction's own price first, before applying the cash flow. This captures any price movement that happened since the previous transaction. Marking the position afterward instead — the more common shortcut — silently drops that movement from the calculation, which is a real source of the wildly wrong TWR numbers (a well-known failure mode across many portfolio tools) that show up when a symbol has been bought several times at different prices.
Internal Rate of Return (IRR / XIRR)
IRR answers "how well did my money actually do," weighted by the size and timing of your real cash flows. Zyvo computes it with a standard XIRR approach (Newton-Raphson) over your actual buy/sell dates and amounts, plus your current portfolio value as a final cash flow valued today.
A minimum-history guard applies: XIRR is not shown for accounts with too little elapsed time, since the calculation becomes numerically unstable (and practically meaningless) over very short periods.
Cost Basis: Average Cost vs FIFO
Zyvo supports two cost-basis methods for realized gain/loss and tax reporting, selectable per report:
- Average Cost (ACB) — blends all purchases of a symbol into a single average cost. This matches the method used for Canada's Adjusted Cost Base on Schedule 3.
- FIFO (First In, First Out) — assumes the oldest shares are sold first, which can change which sales qualify for long-term treatment. This matches the default method for US Form 8949 / Schedule D.
Other jurisdictions (for example, UK share-matching rules) may require adjustments Zyvo doesn't yet make automatically — always confirm the right method with a local accountant before filing.
Wash Sale Detection
A wash sale disallows a loss when you sell a security and buy the same or a substantially identical one within 30 days before or after that sale (61 days total), under IRC §1091 — full explanation here. Zyvo checks purchases against sales across every broker on your account, not just the one where the sale happened, which is the specific blind spot a single broker's own 1099-B can't cover. Flagged sales are reported in Form 8949 columns (f)/(g), with the disallowed amount shown unadjusted in the on-screen figures so the two never silently disagree without explanation.
Cross-Broker Transfer Detection
Moving shares between brokers sometimes gets imported as two separate taxable-looking events — a sell on the old broker's statement, a buy on the new one — even though nothing was actually disposed of. Left alone, this reports a capital gain or loss that isn't real. Zyvo checks for a same-symbol, matching-quantity sell and buy across two different brokers within a short date window, and flags the pair so you can remove both and keep the original cost basis intact, rather than silently accepting a phantom gain.
Tax Estimate: Federal & State
The US federal estimate stacks short-term gains at ordinary rates and long-term gains at 0/15/20%, includes the 3.8% Net Investment Income Tax above the relevant income threshold, and carries forward prior-year losses from your own Zyvo history. State tax is modeled for California, New York, Illinois, and Pennsylvania (each seeded from official state tax authority figures, cited by source in-app), Washington's capital-gains excise tax (7%/9.9%, long-term gains only), and the eight states with no state income tax at all. Any state not on that list is deliberately left unmodeled rather than guessed at.
UK estimates follow HMRC helpsheet HS284 (same-day, then 30-day, then Section 104 pooling), with the Annual Exempt Amount applied. Germany follows Abgeltungssteuer with FIFO cost basis applied per Depot (individual brokerage account) rather than pooled across accounts, matching how German banks report Kapitalertragsteuer.
Currency Conversion
Every transaction in a currency other than your display currency is converted using the exchange rate as of that transaction's own date — not today's rate. That historical rate is captured once, at the time you save or import the transaction, and stored with it, so your past returns don't shift every time exchange rates move.
All calculations — position values, TWR, XIRR, tax reports, and charts — run on this same currency-normalized transaction data, not on raw multi-currency figures. This is a deliberate architectural rule, not an incidental detail: bypassing it was the root cause of a real multi-currency bug found and fixed during development.