How to Analyze a Crypto Portfolio From a CSV (Across Multiple Exchanges)

To analyze a crypto portfolio spread across several exchanges, export a CSV from each venue and normalize them into one schema. Then net the transactions into current positions and attach cost basis to calculate unrealized profit and loss. The hard part is not the maths. It is that no two exchanges export the same columns.
Anyone holding assets in more than one place has run into this. Each dashboard shows a confident number, and none of them shows the whole picture. The total exists only as arithmetic somebody does by hand on a Sunday.
This guide covers the export step and the normalization schema that makes the files comparable. It then walks the position and profit-and-loss calculations, and where the manual route starts costing more time than it saves.
This article is about data analysis technique. It is not investment, tax or financial advice.
What you need before you start
You need a transaction export from every venue that holds a position. That means exchanges, and wallets too if you can get a transaction history out of them. Trade history alone is not enough. Deposits, withdrawals, staking rewards, airdrops and fees all move your holdings, and a portfolio built only from buys and sells will not reconcile.
You also need to decide two things up front, because they change the answer:
Your cost basis method. FIFO, LIFO and weighted average produce genuinely different unrealized profit figures on the same trades. Pick one and apply it consistently across every venue.
Your reporting currency. If you have traded pairs like ETH/BTC, some transactions have no fiat price attached. You will need a reference price at transaction time to express those in one currency.
A good result looks like this. You get a position table showing quantity, average cost, current value and unrealized profit for each asset. Beside it sits an allocation view showing what share of the crypto portfolio each asset represents.
How to do it manually
Option 1: Normalize every export into one schema
Open each CSV and map its columns onto a common set: timestamp, venue, transaction type, asset, quantity, price, fee currency, fee amount.
This is where most of the work lives. One venue writes Buy, another writes BUY, a third writes Trade with a positive or negative quantity carrying the direction. Timestamps arrive in local time on one export and UTC on another, which matters as soon as you sort chronologically. Fees appear as a separate column on some exports and as a deduction baked into the quantity on others. Miss that and every position runs slightly high.
Convert all timestamps to UTC and standardize the type labels. Stack the files into one sheet with a venue column, so you can trace any row back to its source.
Option 2: Net the transactions into positions
Group the stacked sheet by asset and sum the signed quantities. Buys, deposits, rewards and airdrops add; sells, withdrawals and fees paid in that asset subtract.
Two checks are worth running before you trust the result. Any asset showing a negative balance means a missing deposit or an unmapped transaction type. Any asset showing a suspiciously round number usually points to a transfer between your own venues. It got counted as a buy on one side without the matching withdrawal on the other. Internal transfers are the single most common source of double-counting.
Option 3: Attach cost basis and calculate profit and loss
Walk the transaction list per asset in chronological order, applying your chosen method to track the cost of the units you still hold. Weighted average is the easiest to build in a spreadsheet: maintain a running total of cost and quantity, and recompute the average on each buy.
Multiply the remaining quantity by the current market price for current value. Subtract the retained cost for unrealized profit, and total the realized gains booked on each sell. Then add an allocation column — each asset's value as a percentage of the portfolio — which is usually the number that changes someone's mind.
Where the manual route slows down
The schema mapping is not a one-time cost. Exchanges revise their export formats, and a column that moved position silently breaks a lookup that ran fine last quarter.
The reconciliation is worse. Finding the one unmatched internal transfer inside 4,000 rows means sorting by asset and timestamp and reading until two entries line up. That is genuinely tedious work, and it repeats every time you refresh.
And the file grows. A few years of activity across three venues runs to tens of thousands of rows. At that size, a workbook full of chained lookups and running-average formulas gets slow and fragile at once.
How to analyze a crypto portfolio with Powerdrill Bloom
Step 1: Upload your data
Upload the CSV exports from every venue at once. Powerdrill Bloom profiles each file separately, so differing column names and date formats are visible before anything is combined. You can see which export uses UTC and which does not.
Step 2: Describe the analysis in natural language
Ask for what you want in plain terms. Combine these exports into one transaction history, net them into positions by asset, and flag internal transfers that appear on only one side. Then ask for allocation by asset, unrealized profit on a weighted-average basis, or how the position mix has shifted over the past year.
Step 3: Export the chart, report, or deck
Pull out an allocation chart, a position table, or a written summary of concentration and performance. Next quarter's refresh means uploading the new exports and asking the same question.
Why this beats a quarterly spreadsheet rebuild
| Manual spreadsheet | Powerdrill Bloom | |
|---|---|---|
| Schema mapping | Rebuilt when an export format changes | Handled per file at upload |
| Internal transfer checks | Manual sorting and reading | Ask for unmatched pairs directly |
| Adding a fourth venue | New mapping, new formulas | One more file |
| Follow-up questions | New formulas each time | Ask against the same data |
The compounding cost of the manual route is that every question is a small project. Asking "what did my allocation look like in March" means rebuilding a point-in-time position table. When asking is cheap, you ask more, and portfolio concentration is exactly the kind of thing people discover only when checking is easy.
Common mistakes
Five errors account for most wrong numbers in a crypto portfolio built this way.
Counting internal transfers as trades. A withdrawal from one venue and a deposit at another is one movement. Counted as two independent events, it inflates both your holdings and your apparent trading volume.
Ignoring fees paid in the traded asset. Paying a fee in ETH reduces your ETH position. Exports that bake this into the quantity and exports that break it out need different handling.
Mixing cost basis methods across venues. Weighted average on one exchange and FIFO on another produces a portfolio number that means nothing.
Forgetting staking rewards and airdrops. They increase quantity without a corresponding buy. Leave them out and your average cost per unit comes out too high.
Comparing against a stale price. Current value needs a price from a consistent timestamp across all assets. Prices pulled hours apart make the allocation percentages drift.
Conclusion
A multi-venue crypto portfolio analysis comes down to four steps: export everything, normalize to one schema, net into positions, and attach cost basis. Done in a spreadsheet it is entirely possible. It stays possible right up until you add a fourth venue, or an exchange changes its export columns.
If the quarterly rebuild has become the reason you check less often than you meant to, try Powerdrill Bloom on your existing exports. For the single-venue version of this problem, see analyzing a crypto exchange CSV export. For combining files generally, the merge CSV feature page covers the mechanics, and turning a CSV into a chart covers the visual output. A survey of the wider tooling sits in our roundup of free AI crypto analysis tools.
Frequently asked questions
How do I combine crypto exports from different exchanges?
Map each export's columns onto a shared schema: timestamp, venue, type, asset, quantity, price, fee. Then convert all timestamps to UTC and stack the files with a venue column. Keeping the venue column is what lets you trace any figure back to its source.
What is the best way to calculate crypto cost basis in a spreadsheet?
Weighted average is the most practical to build by hand. Keep a running total of cost and quantity per asset, and recompute the average on each buy. FIFO and LIFO need lot-level tracking, which gets unwieldy past a few hundred transactions.
Why does my crypto portfolio total not match my exchange dashboards?
The usual causes are internal transfers counted twice, fees paid in the traded asset not deducted, or staking rewards missing from the transaction list. Check for negative balances first — they always indicate a missing or unmapped transaction.
Can I analyze wallet transactions alongside exchange CSVs?
Yes, provided you can export a transaction history with timestamps, asset, quantity and direction. On-chain histories usually need gas fees mapped as a separate fee row, since they reduce the balance of the fee-paying asset.
Do I need to track every small transaction?
For an allocation view, small transactions barely move the result. For cost basis and realized gains they matter, because each one changes the average cost of the units you still hold. Completeness matters more the closer you get to profit figures.