Skip to content

Research notes

Crypto portfolio return contributions

A 10% coin gain does not add 10% to the account. Trace starting weights, cash and compounding through a two-period contribution example.

Three ivory paper ribbons intertwine into a braid with a lime thread against a black studio background.
Illustration for research notes; examples in this article are educational.

Crypto portfolio return contribution measures how much each holding adds to or subtracts from the portfolio’s return. For one interval with fixed holdings and no external flows, multiply each asset’s beginning weight by its return, including cash. Contributions add across assets; across time, use a disclosed linking method so they reconcile to the compounded portfolio return.

A coin can have the highest percentage return and still contribute little if the portfolio held only a small amount. Conversely, a modest decline in a large position can dominate the result. Contribution analysis connects those price changes to the capital that actually experienced them.

Calculate one interval with beginning weights

Define the measured portfolio, reporting currency and start and end timestamps first. For an unleveraged spot portfolio, the opening weights include every asset and cash balance inside that boundary and sum to one.

For asset i in interval t:

weight(i,t) = opening asset value / opening portfolio value

contribution(i,t) = weight(i,t) × asset return(i,t)

portfolio return(t) = sum of all asset contributions(i,t)

Use decimal inputs: 50% is 0.50, and a 10% return is 0.10. Their product is 0.05, or 5 percentage points of portfolio return. That differs from saying the holding earned 5%; the holding earned 10%, while its capital weight translated that into a smaller portfolio effect.

The PerformanceAnalytics portfolio-return implementation documents this weighted-return relationship, beginning-of-period weights and the distinction between period contributions and aggregation through time. The arithmetic here is also directly checkable by calculating each holding’s dollar gain or loss and dividing by opening portfolio equity.

This simple identity assumes holdings are unchanged within the interval and returns cover the same timestamps. If the strategy trades halfway through a day, its midnight weight multiplied by the full day’s coin return does not describe the exposure it held. Split at the trade with suitable valuations, or use a transaction-aware method. A daily price series alone cannot reconstruct missing intraday holdings.

A three-asset example that reconciles to equity

The following figures are hypothetical, not market history or expected returns. A portfolio starts with $10,000: $5,000 in BTC, $3,000 in ETH and $2,000 in USD cash. There are no external flows, trades, fees or taxes within the first interval. The stipulated asset returns include the cash income shown.

HoldingOpening valueOpening weightAsset returnDollar gain or lossContribution
BTC$5,00050%+10%+$500+5.00 pp
ETH$3,00030%−5%−$150−1.50 pp
USD cash$2,00020%+0.10%+$2+0.02 pp
Portfolio$10,000100%+3.52%+$352+3.52 pp

“pp” means percentage points. Ending equity is $5,500 + $2,850 + $2,002 = $10,352, so the direct return is $352 / $10,000 = 3.52%.

BTC’s 5.00-point contribution exceeds the portfolio’s 3.52% net return because ETH offsets part of the gain. Dividing BTC’s contribution by the net return gives about 142% of the total. Such shares can exceed 100%, become negative or explode when total return approaches zero. Keep percentage-point contributions as the primary display; a share-of-total column needs that explanation.

Do not replace the opening weights with closing weights. After the first interval, BTC represents approximately 53.13% of equity, ETH 27.53% and cash 19.34%. Those weights describe the next interval’s starting exposure if nothing changes. Applying them retrospectively gives extra weight to the asset that already rose.

Cash belongs in the total, with its actual return

Dropping cash and rescaling BTC and ETH to 100% would answer a different question: the return of the invested slice. It would no longer reconcile to the $10,000 account. The GIPS handbook’s cash-return provisions include cash and cash-equivalent returns in portfolio performance. That provides a methodological reference; it does not establish GIPS compliance for this example or a reporting service.

An actual USD cash balance earning nothing has zero direct contribution, but its weight still determines how much capital participates in the other holdings. Calling that “cash drag” requires a stated alternative allocation. Zero contribution alone does not measure what the portfolio would have earned with less cash.

A stablecoin must be valued in the reporting currency. For a separate illustration, if a stablecoin position starts at a 20% USD weight and loses 2% in USD value, with no income, its contribution is 0.20 × −0.02 = −0.004, or −0.40 percentage points. A zero change in token quantity does not make its USD return zero. Include any income consistently and avoid counting a distribution both inside the asset return and again as a separate gain.

Now suppose the example portfolio is rebalanced exactly between two intervals to 40% BTC, 40% ETH and 20% USD cash. Assume this internal rebalance is self-financing and costless solely to isolate linking. It changes the allocation without changing the $10,352 portfolio value.

The second interval has stipulated returns of −4% for BTC, +8% for ETH and +0.10% for cash. Its contributions are −1.60, +3.20 and +0.02 percentage points, totaling +1.62%.

The combined return is:

(1 + 0.0352) × (1 + 0.0162) − 1 = 0.05197024 = 5.197024%

The GIPS handbook’s return-linking discussion describes geometric linking of periodic portfolio returns. Simply adding our two interval returns gives 5.14%, which misses the compounding term. The arithmetic versus geometric mean guide explains the separate question of averaging periodic returns; neither an average nor a raw sum is a cumulative contribution method.

One transparent linking convention scales every interval’s contribution by the portfolio wealth accumulated before that interval. Define W(t−1) as the product of 1 + portfolio return over all earlier intervals, starting at one. Then:

linked contribution(i) = sum over t of [W(t−1) × contribution(i,t)]

For two intervals, this becomes c(i,1) + (1 + R(1)) × c(i,2). With no external flows, it equals the holding’s summed interval investment gains divided by the initial portfolio value. Rebalance transfers between holdings are excluded from those gains.

HoldingFirst-interval contributionSecond-interval contributionLinked two-interval contribution
BTC+5.00 pp−1.60 pp+3.343680 pp
ETH−1.50 pp+3.20 pp+1.812640 pp
USD cash+0.02 pp+0.02 pp+0.040704 pp
Total+3.52 pp+1.62 pp+5.197024 pp

BTC contributes 5.00 + 1.0352 × (−1.60) = 3.343680 percentage points. Independently, its gains are $500 − $165.632 = $334.368, which is 3.343680% of the original $10,000. Adding all holdings’ gains gives $519.7024, and ending equity is $10,519.7024. The extra decimal places demonstrate the identity rather than suggest that market valuations have this precision.

This is one declared convention for assigning the compounded total across holdings. Different linking conventions can distribute compounding effects differently. Compare contribution reports only after checking their method. For a genuinely unchanged buy-and-hold portfolio, initial weights times each asset’s full-horizon return also reconcile; our intervening rebalance prevents using that shortcut.

Separate contribution from benchmark attribution

A positive contribution says a holding added to absolute portfolio return. It does not establish that owning it improved performance relative to a benchmark. A holding might gain while a comparable benchmark holding gains more; a losing cash substitute might still lose less than the alternative.

Choose that comparison explicitly with the strategy benchmark guide. If the question concerns active returns and their variability, the information ratio and tracking error guide addresses that measurement. A contribution table explains the account’s result without establishing selection skill or forecasting the next period.

Reconcile the report before interpreting the winners

Use this validation sequence on the underlying ledger:

  1. Match each opening value and asset return to one reporting currency and identical interval boundaries. Preserve price sources and the income policy.
  2. Confirm that opening weights sum to 100% for the unleveraged spot boundary, including cash. Inspect missing assets rather than silently normalizing them away.
  3. Reconcile the sum of interval contributions with the independently measured interval portfolio return. A gap can expose missing income, costs, trades or stale valuations.
  4. Assign each fee once, either inside a holding’s net result or as an explicit cost contribution. For a separate fee row, divide the negative fee amount by opening portfolio equity; do not invent an asset return on a zero opening balance. Reconcile market-price contributions and costs to the net account return.
  5. Apply the disclosed linking convention and reconcile the linked total with compounded portfolio return. Use unrounded numbers for the checks and round only the displayed results.

Outside deposits and withdrawals require return measurement that removes their direct funding effect before contribution linking. The time-weighted versus money-weighted returns guide covers that distinct problem. The dollar-gain-over-initial-equity interpretation above applies to the no-external-flow example; it cannot be carried over unchanged to a funded account.

Derivatives require additional care because contract notional, margin and equity are different denominators. A futures price return multiplied by posted-margin weight is not a general contribution formula. Reconcile contract profit, funding, fees and collateral valuation to equity instead of forcing the spot worksheet onto it.

Before labeling any holding the main driver, produce a contribution total that matches the account return at the interval and full-horizon levels. Save the opening weights, cash treatment and linking rule beside the result so another reader can reproduce it.

Keep the context with the example.

Each worked example is illustrative, with its sources and assumptions in the article. Read our editorial standards for authorship, verification and corrections.