Skip to content

UK Capital Gains Formulas

Technical reference for the mathematical formulas PrivateACB uses to calculate UK Capital Gains Tax. This guide covers the Section 104 pool, cost apportionment for matching rules, and worked examples.

Each cryptocurrency has its own Section 104 pool tracking two values:

  • Pool quantity (Q) — total tokens in the pool
  • Pool cost (C) — total allowable cost in GBP

When tokens are acquired and not consumed by same-day or 30-day matching:

Q_new = Q_old + acquired_quantity
C_new = C_old + acquired_cost

When tokens are disposed from the pool:

Disposed_cost = C × (disposed_quantity ÷ Q)
Q_new = Q - disposed_quantity
C_new = C - Disposed_cost
Average_cost = C ÷ Q

The average cost per token stays the same after a disposal — only the total quantity and total cost decrease proportionally.


All same-day acquisitions are consolidated into a single acquisition:

Consolidated_acq_quantity = Σ(all same-day acquisition quantities)
Consolidated_acq_cost = Σ(all same-day acquisition costs)

All same-day disposals are consolidated into a single disposal:

Consolidated_disp_quantity = Σ(all same-day disposal quantities)
Consolidated_disp_proceeds = Σ(all same-day disposal proceeds)

If the disposal quantity is less than or equal to the acquisition quantity:

Same_day_cost = Consolidated_acq_cost × (Consolidated_disp_quantity ÷ Consolidated_acq_quantity)

If the disposal quantity exceeds the acquisition quantity, only the acquisition quantity is matched:

Same_day_matched_quantity = Consolidated_acq_quantity
Same_day_cost = Consolidated_acq_cost
Remainder = Consolidated_disp_quantity - Consolidated_acq_quantity

The remainder passes to the 30-day rule.


Acquisitions within the 30-day window are matched in chronological order (earliest first):

Window_start = disposal_date + 1 day
Window_end = disposal_date + 30 days

For each acquisition in the window, starting with the earliest:

Matched_quantity = MIN(remaining_disposal_quantity, available_acquisition_quantity)
Matched_cost = acquisition_cost × (Matched_quantity ÷ acquisition_quantity)

The acquisition’s available quantity decreases as it’s consumed by disposals. Earlier disposals have priority.

If the disposal spans multiple acquisitions:

Total_30day_cost = Σ(Matched_cost for each acquisition)
Total_30day_quantity = Σ(Matched_quantity for each acquisition)

Any remaining disposal quantity after exhausting the 30-day window passes to the Section 104 pool.


Gain_or_Loss = Proceeds - (Same_day_cost + Thirty_day_cost + Pool_cost)

Where:

  • Proceeds = total GBP proceeds from the disposal
  • Same_day_cost = cost from same-day matching (may be £0)
  • Thirty_day_cost = cost from 30-day matching (may be £0)
  • Pool_cost = cost from Section 104 pool for remaining quantity (may be £0)

If Gain_or_Loss > 0, it’s a chargeable gain. If Gain_or_Loss < 0, it’s a capital loss.

PrivateACB classifies each disposal by which rules contributed:

Match TypeMeaning
Same-day100% of disposal matched by same-day rule
30-day100% of disposal matched by 30-day rule (no same-day)
Pool100% of disposal matched from Section 104 pool
MixedTwo or more rules contributed to the disposal

Only the pool portion of a disposal affects the pool:

Pool_disposed_quantity = Total_disposed_quantity - Same_day_matched_quantity - Thirty_day_matched_quantity
Pool_disposed_cost = Pool_cost × (Pool_disposed_quantity ÷ Pool_quantity)
New_pool_quantity = Pool_quantity - Pool_disposed_quantity
New_pool_cost = Pool_cost - Pool_disposed_cost

Tokens matched by same-day or 30-day rules do not affect the pool.


Net_gains = Total_gains - Total_losses
Taxable_gains = MAX(0, Net_gains - AEA)
Estimated_tax = Taxable_gains × CGT_rate
Tax YearAEA
2024/25 onwards£3,000
2023/24£6,000
2022/23 and earlier£12,300
BandRate
Basic rate18%
Higher rate24%

HMRC expects pro-rata costs to be rounded up to the nearest pound for allowable costs. PrivateACB maintains full decimal precision internally and applies rounding in reports and PDF exports.


Worked Example: All Three Rules (TC6 / CRYPTO22256)

Section titled “Worked Example: All Three Rules (TC6 / CRYPTO22256)”

This example demonstrates the complete calculation flow using all three matching rules.

Setup: 100,000 token F in pool, total cost £300,000.

DateTransactionQuantityAmount
31 JulBuy10,000£45,000
31 JulSell30,000£150,000
5 AugSell20,000£100,000
6 AugBuy50,000£225,000
7 AugSell100,000£150,000

31 Jul disposal (30,000 tokens):

  • Same-day: 10,000 tokens from 31 Jul acquisition
  • 30-day window (1 Aug — 30 Aug): 6 Aug acquisition has 50,000 tokens
  • Matched: 20,000 of 50,000 from 6 Aug
  • Remainder: 0 (30,000 = 10,000 same-day + 20,000 thirty-day)

5 Aug disposal (20,000 tokens):

  • Same-day: none
  • 30-day window (6 Aug — 4 Sep): 6 Aug acquisition has 30,000 remaining
  • Matched: 20,000 of 30,000 from 6 Aug
  • Remainder: 0

7 Aug disposal (100,000 tokens):

  • Same-day: none
  • 30-day window (8 Aug — 6 Sep): no acquisitions
  • Remainder: 100,000 → pool

31 Jul acquisition (10,000 tokens, £45,000):

  • Matched to 31 Jul disposal → diverted, does not enter pool

31 Jul disposal (30,000 tokens, £150,000):

  • Same-day cost: £45,000 (10,000 tokens)
  • 30-day cost: £225,000 × (20,000/50,000) = £90,000 (20,000 tokens)
  • Pool cost: £0 (0 tokens)
  • Gain: £150,000 - £45,000 - £90,000 = £15,000

5 Aug disposal (20,000 tokens, £100,000):

  • Same-day cost: £0
  • 30-day cost: £225,000 × (20,000/50,000) = £90,000 (20,000 tokens)
  • Pool cost: £0
  • Gain: £100,000 - £90,000 = £10,000

6 Aug acquisition (50,000 tokens, £225,000):

  • 40,000 matched to disposals → diverted
  • 10,000 unmatched → enter pool
  • Pool update: 100,000 + 10,000 = 110,000 tokens; £300,000 + £45,000 = £345,000

7 Aug disposal (100,000 tokens, £150,000):

  • Same-day cost: £0
  • 30-day cost: £0
  • Pool cost: £345,000 × (100,000/110,000) = £313,636
  • Loss: £150,000 - £313,636 = -£163,636
DisposalMatch TypeGain/Loss
31 JulMixed (same-day + 30-day)+£15,000
5 Aug30-day+£10,000
7 AugPool-£163,636
Total-£138,636

FormulaCanadaUnited StatesAustraliaUnited Kingdom
Cost methodWeighted average (ACB)Lot cost (per parcel)Lot cost (per parcel)Same-day/30-day cost, then pool average
Gain formulaProceeds - ACB per unit × qtyProceeds - lot costProceeds - lot costProceeds - (SD cost + 30d cost + pool cost)
Loss adjustmentDenied loss → added to ACBDeferred loss → added to replacement basisNoneNo adjustment — matching changes cost used
Inclusion/discount50% inclusion rateST/LT rates50% discount (>12 months)AEA deduction (£3,000)
Tax formula(Gain × 50%) × marginal rateST @ ordinary + LT @ LTCG rateQ18 netting then discount(Net gains - AEA) × CGT rate


Last Updated: March 2026 PrivateACB Version: 2.4