Blog / Crypto

Valuing crypto without lying to yourself

The hard part of holding crypto is not the volatility. It is that an exchange shows you one number, your cost basis says another, and a coin-for-coin swap quietly changes both without any money entering or leaving your life.

A volatile price line above a perfectly flat line marking 0.4137 BTC held unchanged all year, with a dashed line for what was originally paid.

Crypto is the part of most people's net worth with the best real-time data and the worst records. Every price is public, every transaction is on a ledger by design, and yet almost nobody who holds it can tell you what they put in, what it is worth, and how those two relate.

The reason is not laziness and it is not volatility. It is that a crypto position quietly violates three assumptions that every other kind of record-keeping depends on: that money and assets are different things, that a trade has a price in your own currency, and that a balance shown by an institution is a balance you have.

Get those three straight and the rest is ordinary bookkeeping.

A stablecoin is not an investment

The first and most consequential decision: treat stablecoins as cash, and everything else as an asset.

If you hold 12,000 USDT, that is not a portfolio position with a price to track. It is a dollar balance in an unusual account. Modelling it as an investment produces a portfolio full of holdings whose value never moves, a "return" line that is permanently zero, and an allocation chart in which your cash is competing for space with your actual bets.

Modelled as cash, it behaves correctly everywhere: it is spendable, it counts toward liquidity, it belongs in the high-liquidity band of your net worth, and buying a coin with it is a purchase rather than a swap.

The same logic applies to the exchange itself. An exchange account holding several stablecoins and several coins is not one thing — it is a cash account and a set of asset positions that happen to live behind the same login. Splitting it that way is the single change that makes the rest of this tractable.

Where "stable" stops being an assumption

This treatment assumes the peg holds, which is a real assumption and not a guaranteed one. If you are holding a meaningful amount, it is worth knowing what backs the specific coin you hold, and worth noticing that treating it as cash means a depeg would show up in your records as a mysterious loss on an asset you had classified as money. That is the trade-off you are accepting for a much cleaner picture the other 99% of the time.

A coin-for-coin trade is two events

Here is the thing that breaks most people's records.

You swap 0.5 ETH for 0.017 BTC. No dollars are involved. No money enters or leaves. It feels like one action — a rebalance, a shuffle within the same pot — and the natural instinct is to record it as a transfer.

It is not a transfer. It is a sale of ETH followed by a purchase of BTC, and the two need a price. If you record it as a transfer, you carry your ETH cost basis onto a BTC position, and from that moment your records are describing a holding you never bought at a price you never paid.

The price to use is the one implied by the trade itself, denominated in the coin you gave up. You disposed of 0.5 ETH — value that at the ETH price at the moment of the trade, and that value is simultaneously the proceeds of the sale and the cost of the purchase. The two legs balance exactly, which is what makes it auditable.

Denominating from the outgoing side rather than the incoming one matters when the two exchange prices disagree slightly, which they routinely do. Pick the outgoing leg as the source of truth and every swap produces exactly one defensible number.

0.4137 BTC
Position after 3 buys and 1 swap · cost basis $28,940
Bought with USDT, Jan0.1820 Bought with USDT, Apr0.1287 Received in ETH swap0.1030 Average cost$69,954
The third line is the one that goes missing. Recorded as a transfer, that 0.1030 BTC arrives with no cost of its own — and every gain figure from then on is wrong by whatever the ETH was worth.

Which price is the price?

At any moment a coin has several prices: slightly different on each exchange, different again on aggregator indices, and different once more in the order book at the size you would actually trade.

For valuing a holding, use a broad reference price — an index or a large-venue price — and use the same source consistently. Consistency matters more than which one you pick, because a portfolio valued on a rotating cast of sources produces movements that are partly real and partly source noise, and you cannot tell them apart.

For recording a transaction, use the price you actually got. Same rule as foreign exchange: balances get the market's price, movements get yours.

There is an unglamorous engineering reality behind this. Price providers rate-limit, go down, and disagree about ticker symbols. A portfolio that silently shows yesterday's price as today's is worse than one that says it could not fetch a price, because the first is invisible. We ended up running a provider chain — a primary, then two fallbacks — with a shared cache and an explicit stale marker, after a stretch where a single provider's per-minute limit meant some assets simply never updated. If you are assembling this yourself from an API, assume the API will fail and decide now what the failure should look like.

Never invent a holding

When you import an exchange's trade history you will find gaps. A coin was deposited from a wallet you no longer use, an old trade predates the export window, a chunk arrived from a bridge. The trade history says you hold 0.41 BTC; the arithmetic of the imported trades says 0.33.

There are two ways to close a gap like that, and only one is honest. The wrong way is to synthesise a purchase — invent an opening trade at some plausible historical price so the numbers reconcile. It works instantly and it permanently contaminates your cost basis with a number nobody ever paid.

The right way is to report the discrepancy and make you resolve it: state what you actually paid, or explicitly record it as an opening balance with an unknown basis. It is more friction, and it is the difference between records you can rely on and records that merely add up. Capital Wizard reports the gap; it will not fill it in for you.

A reconciliation that always succeeds is not checking anything.

The rule that applies well beyond crypto

An unrealised gain is not income

A position that has doubled is worth more. It has not paid you anything.

This distinction is obvious stated plainly and remarkably easy to lose in a records system where everything is denominated in one currency and summed. Keep unrealised movement out of your income and expense totals entirely — it belongs to the asset, as a revaluation. Otherwise a good quarter in the market shows up as if you had earned it, your savings rate looks excellent, and you conclude that your spending is under control at exactly the moment it is not.

The same applies in reverse, and worse: a bad quarter makes a perfectly healthy income look like a loss, and people make cuts they did not need to make.

Tax treatment of all of this varies enormously by country — swaps are taxable events in some places and not others, and none of this is tax advice. But the record-keeping principle holds regardless of jurisdiction: a swap needs a price, a valuation is not a receipt, and your accountant will need the first far more than the second.

The short version

Thing Wrong model Right model
Stablecoin balance An asset with a price A cash account
Buying a coin with USDT A swap A purchase, in dollars
Coin for coin A transfer A sale plus a purchase, priced on the outgoing leg
Exchange account One balance Cash, plus separate asset positions
Missing history Invent an opening trade Report the gap, ask
Price rose 40% Income Revaluation of the asset

None of this is specific to crypto, which is the point. These are the same rules that apply to a brokerage account or a foreign currency balance; crypto just breaks them all at once, quickly enough that the damage shows up within a year rather than a decade.

See your own number instead of reading about someone else’s.

Import a statement, add your accounts, and get a real net-worth figure in an evening. Six months free, no card required.

Start free
6 months free · no cardStart free