Methodology — how we calculate your returns
How GetHossa calculates total return, TWR, currency effects, the S&P 500 benchmark, dividend forecasts and FIFO — formulas, data sources, limits and checks.
Last updated: 20 Oct 2026
At a glance
| Metric | What it tells you | How we calculate it |
|---|---|---|
| Total return | how many dollars you've made | portfolio value + dividends − net invested |
| Time-weighted return (TWR) | how well your investments did, regardless of when you added money | daily returns chained together |
| Difference vs S&P 500 | how much more or less the index would have made | S&P 500 "bought" with the same dollars on the same days |
| Currency effect | how much of your result came from exchange rates (foreign holdings only) | position cost at today's rate − the dollars you paid |
| Monthly profit | your result for a given month | change in value − that month's net invested |
Below we explain each of these numbers: the formula, the data source and the known limitations.
Inputs
Your transactions
GetHossa never connects to your brokerage. It works only with files you download and upload yourself, plus anything you enter by hand.
| Source | File | What we read |
|---|---|---|
| Interactive Brokers | Activity Statement (CSV) | stock and ETF trades, dividends and withholding tax |
| Revolut | CSV statement | buys, sells, dividends and the statement's exchange rate |
| XTB | account history export (.xlsx or .csv) | cash operations: buys, sells, dividends and withholding tax |
| Manual entry | — | a buy or sell: date, number of shares, price and an optional fee; a dividend: date, stock and the amount received |
Schwab, Fidelity, Robinhood, Vanguard and other brokerages don't have a file import yet, so their trades are added by hand.
- Duplicates: importing the same file again skips transactions that are already in GetHossa.
- IBKR and XTB dividends: the gross dividend row and the withholding tax row are combined into one net payment per stock per day.
- Manual entries: for a buy or sell we check whether your price falls between the stock's low and high for that day. It's only a hint — you can save the trade despite the warning. You can't, however, sell more shares than you held on that date.
- Stock splits: we take split dates and ratios from Yahoo Finance and restate earlier purchases and sales in today's share count. One share bought at $1,200 before a 10-for-1 split becomes 10 shares at $120 in GetHossa; the amount you paid stays the same. This works the same way for every brokerage and for manual entries, because statements list trades in the original share count (the separate "stock split" row in a Revolut statement is ignored). Reverse splits are handled the same way.
Market data
- Prices and company data: Yahoo Finance. We refresh current prices every 5 minutes. Exchanges typically publish data with a delay of about 15 minutes, so the "current" price may be a quarter of an hour behind the market.
- Price history: daily closing prices from Yahoo Finance, with today's point taken from the current quote. When Yahoo returns an empty day for a session that did trade (it happens with some Xetra ETFs, for example), we rebuild the close from hourly data.
- Exchange rates: Yahoo Finance — see "Currencies" below.
- Financial statements: annual 10-K reports from SEC EDGAR (US companies).
We cover stocks and ETFs listed in the US (NYSE, Nasdaq), on Xetra and other European exchanges, on the Warsaw Stock Exchange and in London.
Portfolio value and net invested
GetHossa converts every amount into your portfolio currency, which you choose: US dollars (USD) by default, or euros (EUR) or Polish zloty (PLN). The formulas and examples on this page assume a USD portfolio; in EUR or PLN, the chosen currency takes the place of the dollar (see "Currencies").
Portfolio value = Σ shares × current price × current exchange rate
Net invested = Σ purchase costs in USD − Σ sale proceeds in USD
- Purchase cost is what you actually paid (including the fee, if the statement shows one or you entered it). A US stock's cost is simply its dollar amount; a stock quoted in another currency is converted at the rate from the day of the purchase.
- Sale proceeds are what you received after fees, converted the same way at the rate from the day of the sale.
- The exchange rate for US-listed stocks is 1, so for an all-US portfolio, portfolio value is just shares × price.
- GetHossa treats every purchase as money going into the portfolio and every sale as money taken out. Cash sitting in your brokerage account is not part of the portfolio — only invested money counts.
- Holdings are valued at the latest regular-session price. Pre-market, after-hours and overnight prices are shown separately.
Total return
Total return = portfolio value + dividends received − net invested
Total return % = (portfolio value + dividends received) ÷ net invested − 1
Total return covers unrealized gains (open positions), realized gains (sales) and dividends. It answers the question "how many dollars have I actually made?"
A percentage calculated this way, however, depends on when you added money. That's why we also show the time-weighted return.
Time-weighted return (TWR)
TWR answers a different question: how did your investments perform if you take out the effect of how much you added and when? It's the standard measure in asset management, used among others in the GIPS® standards, and it's how mutual funds and ETFs report their returns. GetHossa calculates it day by day, starting from your first purchase:
r_d = V_d ÷ (V_(d−1) + F_d) − 1
TWR = (1 + r_1) × (1 + r_2) × … × (1 + r_n) − 1 = Π (1 + r_d) − 1
where:
- V_d — portfolio value at the end of day d, including dividends received up to that day,
- F_d — net invested on day d (purchases minus sales, in USD).
Each day's purchases and sales are counted at the start of that day. A purchase happens during the session at its actual price and is valued at the close the same evening, so its result rightly belongs to that day.
The return for any period (a month, or a single day) comes from the cumulative values:
Period TWR = (1 + TWR at end of period) ÷ (1 + TWR at start of period) − 1
Example: TWR vs simple return
You start with $10,000 and the portfolio loses 10%. Then you add $90,000 and the portfolio gains 10%.
| Period | Value at start | Added | Base | Value at end | Period return |
|---|---|---|---|---|---|
| 1 | $0 | $10,000 | $10,000 | $9,000 | −10.0% |
| 2 | $9,000 | $90,000 | $99,000 | $108,900 | +10.0% |
- Simple return: 108,900 ÷ 100,000 − 1 = +8.9% (a profit of $8,900).
- TWR: (1 − 0.10) × (1 + 0.10) − 1 = 0.90 × 1.10 − 1 = −1.0%.
Both numbers are true; they just answer different questions. You made money because most of it went in right before the good period. The investments themselves — one dollar invested from the first day to the last — lost 1%.
That's why we show the S&P 500 comparison in two ways: in TWR, to judge your picks, and in dollars, to show how much more or less money you actually have.
The S&P 500 comparison
The benchmark
We track the S&P 500 through the SPY fund (SPDR S&P 500 ETF Trust) and its adjusted close from Yahoo Finance. The adjusted close accounts for dividends reinvested in the fund, so it measures total return, not just the price change.
Index unit price (day d) = SPY adjusted close (d) × USD rate into your portfolio currency (d)
In a USD portfolio the rate is 1, so the index unit price is simply SPY's adjusted close.
Same dollars, same days
- You buy shares for $K on day d → GetHossa "buys" K ÷ unit price (d) units of the index at that day's close.
- You sell shares and receive $S → GetHossa "sells" index units worth $S at the price on the day of the sale.
- S&P 500 portfolio value = number of units × today's unit price.
So the app shows you directly what your money would be worth today if you had bought the S&P 500 instead of your stocks.
Difference in USD = (portfolio value + dividends) − S&P 500 portfolio value
Difference in percentage points = difference in USD ÷ net invested × 100
We compare each position the same way: the stock's result (including its dividends) against the S&P 500 bought on the same days for the same amounts. When you sell part of a position, its index counterpart is reduced in proportion.
Benchmark TWR
The S&P 500 portfolio's TWR is calculated with the same method — by chaining daily returns. Because the index is "bought" at the close, new money starts working for it at the end of the day:
r_d (S&P 500) = (B_d − F_d) ÷ B_(d−1) − 1
where B_d is the S&P 500 portfolio's value at the end of day d. This way neither your portfolio nor the index gets an artificial boost from the timing of your money.
Monthly profit
Monthly profit = value at end of month − value at end of previous month − net invested during the month
Value includes dividends received, so monthly profit covers unrealized changes, realized gains and dividends. The month's percentage is the TWR for that month. For the S&P 500 we calculate the same thing with identical money flows. The current month is marked as still in progress.
Today and yesterday
Today
"Today" follows the calendar day in Poland (Central European Time), where GetHossa is run — so in the US the new day starts in the evening, around 6 p.m. Eastern. A stock joins today's result only once it has traded that day — US stocks from the New York open. Until then, only the currency move counts for them (which is zero for US stocks in a USD portfolio).
Today's change = Σ [stocks traded today] shares × (price − previous close) × previous exchange rate
+ Σ [all positions] shares × price × (current rate − previous rate)
The first part is the move in share prices; the second is the move in currencies (counted once the currency pair has traded today). Together they add up exactly to the change in value, and we also show the currency part on its own. As a percentage: change ÷ (current value − change).
Yesterday
"Yesterday" is the result of the last full day before today — on a Monday, that's Friday:
Day result = V (that day) − V (the day before) − net invested on that day
The percentage shown is that day's TWR.
Pre-market, after-hours and overnight
For US stocks we show trading outside the regular session, from Yahoo Finance: pre-market (4:00–9:30 a.m.), after-hours (4:00–8:00 p.m.) and overnight (8:00 p.m.–4:00 a.m., on Blue Ocean ATS) — all Eastern Time. Treat it as an indication: volumes are thinner and prices can differ noticeably from the next open. These moves are not included in portfolio value or in today's result.
Currencies
Converting trades into your portfolio currency
| Trade | Rate used |
|---|---|
| In your portfolio currency (a US stock in a USD portfolio) | none — the dollar amount is used as is |
| In another currency (say, a Xetra ETF in euros) | the market rate on the trade date (EUR/USD) |
The market rate is that day's closing rate from Yahoo Finance; on weekends and holidays, the most recent earlier one. The cost in your portfolio currency is fixed once, on the trade date, and doesn't move with today's exchange rate.
You can switch the portfolio currency to EUR or PLN in the account menu. In a PLN portfolio, Revolut and XTB trades use the rate from the broker's statement instead (Revolut's FX Rate, or the effective rate XTB charged a PLN account, including its conversion fee); every other case uses the market rate.
FX history and the one-day shift
Yahoo Finance's daily currency data has a catch: the bar labelled day D carries the rate from the start of day D — in practice, the previous day's close. We verified this against hourly data. So we shift the data by one day: the rate at the end of day D is taken from the open of the next bar. Today's rate comes from the live quote.
Without this correction every day would be valued at the previous day's rate, and currency moves would show up in your results a day late.
Currency effect
This is the part of your profit that comes from exchange rate changes. In a USD portfolio it only concerns holdings quoted in other currencies, such as euros or pounds:
Currency effect = Σ [open positions] (cost in foreign currency × today's rate − cost in USD)
+ Σ [sales] (cost of shares sold in foreign currency × rate on the sale date − their cost in USD)
The rest of the profit — the change in the share price, valued at today's rate — is the stock's own performance.
Example: you buy a Xetra-listed ETF for €1,000 when a euro costs $1.10, paying $1,100. Today the ETF is still worth €1,000, but the euro costs $1.05. The position is worth $1,050: the currency effect is −$50 and the ETF's own result is $0.
Dividends
Received
We show amounts as your broker booked them, converted into your portfolio currency at the statement's rate or at the market rate on the payment date. In a US taxable account, dividends from US companies usually arrive in full, while dividends from foreign companies often arrive after the foreign country has withheld tax at source. A dividend you add by hand is recorded at the amount you entered as received. Dividends received are part of your portfolio's result and of the S&P 500 comparison. We treat them as cash — they're not reinvested.
12-month forecast
We build the forecast for every stock in your portfolio that paid a dividend in the last 12 months:
Gross payment = latest dividend per share × current shares × current exchange rate
Annual forecast = gross payment × number of payments in the last 12 months
- Dates: if the company has announced its next ex-dividend date, we start from it (marked "announced"). Otherwise we estimate the next dates from the past payment frequency. The payment date comes from the announcement or is assumed to be 21 days after the ex-dividend date.
- Tax: the forecast is gross — before any tax — by design, and the app says so next to it. What you'll actually keep depends on your situation: whether a dividend is qualified or ordinary, your tax bracket and state, whether the shares sit in an IRA or 401(k), and any tax a foreign country withholds. GetHossa doesn't guess. See qualified vs ordinary dividends for how US dividends are taxed.
- Accumulating ETFs don't pay dividends — they reinvest them in the unit price — so they don't appear in the forecast.
The forecast assumes companies keep their latest dividend amount and frequency, and that you keep your current number of shares. It's an estimate, not a promise.
Closed positions (FIFO)
We match every sale with the earliest unsold purchases of the same stock — first in, first out (FIFO), the method the IRS applies when you don't identify specific shares.
Sale result = sale proceeds in USD − cost of matched purchases in USD
Return = sale result ÷ cost of matched purchases in USD
- For stocks quoted in other currencies, proceeds and costs are converted at the rates from each transaction's date (see "Currencies"), so the result includes the currency effect.
- The holding period is the average number of days between the purchases and the sale, weighted by the number of shares.
- If a sale is larger than the purchases recorded in GetHossa (for example, an older statement is missing), we mark it as incomplete and calculate the result only for the matched part.
Each sale against the S&P 500
For every sale we show what the same money would have made in the S&P 500. The cost of each matched purchase "buys" index units on that purchase's date, and all of them are "sold" on the sale date — the same method as the whole-portfolio comparison.
S&P 500 value = Σ [matched purchases] purchase cost ÷ index unit price (purchase date) × index unit price (sale date)
S&P 500 result = S&P 500 value − cost of matched purchases
Lead = sale result − S&P 500 result (in percentage points: sale return − S&P 500 return)
The index unit price is SPY's adjusted close (dividends included), converted into your portfolio currency at that day's rate.
This view is for information only. The gains on your tax return come from your broker's Form 1099-B. If you chose specific lots when selling, or a wash sale disallowed a loss, your reported gain will differ from GetHossa's — GetHossa doesn't apply wash-sale adjustments.
Company pages
- Financials: for US companies — typically 15 or more years of annual results from 10-K filings on SEC EDGAR, with per-share values adjusted for later stock splits, merged with Yahoo Finance data. Companies outside the US don't file 10-Ks, so for them we rely on Yahoo Finance only.
- P/E and P/B history: each month's price divided by earnings per share (EPS) and book value per share from the latest fiscal year already published at that time. We assume annual results become public about 60 days after the fiscal year ends, so the history never uses numbers the market didn't know yet. When earnings or equity are negative, the ratio isn't shown.
- Analysts and quarterly results: price targets, recommendations, earnings dates and EPS surprises (actual vs estimate) come from Yahoo Finance.
Price reaction to results
The price chart marks each quarterly results release. For US companies, dates and times come from 8-K filings (Item 2.02, "Results of Operations") on SEC EDGAR — usually several years back — and the quarter they cover from the 10-Q or 10-K filed after them. Yahoo Finance's last four releases add EPS and the analyst estimate; for companies outside the US, they are the only source.
Reaction = close of the first session after the release ÷ previous session's close − 1
The first session after the release is the same day if the results came out before the exchange closed (in the exchange's local time), or the next trading day if they came out after the close — as most US companies do, after 4 p.m. Eastern.
Watchlist signals
| Signal | When it appears |
|---|---|
| Big move | today's price change is at least 3% up or down |
| Earnings soon | results are due within the next 14 days |
| Off the high | the price is at least 15% below its 52-week high |
| Near the low | the price is no more than 5% above its 52-week low |
| Below the 200-day average | the price is below the average of the last 200 sessions |
Signals are mechanical, data-based flags — not buy or sell recommendations.
Known limitations
- Delays: prices are typically delayed by about 15 minutes and refreshed in GetHossa every 5 minutes. In fast markets your portfolio value may briefly differ from what your broker shows.
- Gaps and errors in Yahoo Finance data: empty days, missing dividends or wrong values do happen. We repair some gaps automatically (for example by rebuilding a close from hourly data), but not all of them.
- Statement formats: brokers can change their file layouts without notice; an import may then miss something or stop working until we adapt it.
- Buys, sells, dividends and splits: splits are applied from Yahoo Finance's split dates (see "Inputs") — if Yahoo is missing a split or has it wrong, your share count in GetHossa will differ from your broker's. Other events — such as spin-offs, mergers or shares transferred in from another broker — aren't modelled yet. After such an event, the number of shares or the cost in GetHossa may differ from your broker's records.
- Cash: uninvested cash in your brokerage account isn't part of the portfolio, and a sale is treated as money taken out.
- Market rate instead of the broker's rate: for foreign-currency trades we use the closing rate on the trade date, which may differ from the rate your broker actually applied.
- The benchmark is a fund: SPY has small running costs, and its adjusted close reinvests dividends before tax — in a taxable account you would owe tax on them. Dividends in your own portfolio, on the other hand, are counted as cash and not reinvested.
- London Stock Exchange: stocks quoted in pence (GBp) can't be added manually yet.
How to verify the numbers yourself
- Number of shares: compare each stock's share count with your broker's app. A difference usually means a missing statement or a corporate event such as a spin-off or merger. After a split the counts should match, because GetHossa restates earlier trades.
- Position value: multiply the number of shares by the current price (and, for a foreign stock, the exchange rate) from Yahoo Finance or your broker. The result should match, give or take the quote delay.
- Benchmark: for a single purchase, divide the dollar amount by SPY's adjusted close on the purchase date, then multiply by SPY's latest adjusted close. You'll find SPY's adjusted closes (Adj Close) in its historical data on Yahoo Finance.
- TWR: put daily portfolio values and net invested amounts into a spreadsheet, calculate r_d with the formula above and multiply (1 + r_d) across all days.
- Realized gains: compare a closed position with the matching lines on your broker's Form 1099-B. A different cost basis method (specific lots) or a wash-sale adjustment explains most differences.
If your result differs from ours, let us know — every such case helps us improve GetHossa.
Contact: hello@gethossa.com