跳转到主要内容

在 Beancount 中跟踪具有成本基础的加密货币投资组合

在 Beancount 中跨交易所跟踪加密货币投资组合,在一个账本中实现成本基础、批次和绩效分析。详见正文说明。详见正文说明。详见正文说明。

管理跨多个交易所、钱包和 DeFi 协议 的加密货币投资组合可能具有挑战性。这份全面指南将展示如何使用 Beancount.io 强大的纯文本会计系统设置并维护准确的加密货币投资组合跟踪。

查看实时加密货币示例账本:

在新标签页中打开 Cryptocurrency Example Ledger

传统投资组合跟踪器为何不能满足需求

加密货币投资组合工具的常见问题

  • 交易所支持有限:许多工具不支持所有交易所或 DeFi 协议
  • 成本基础不准确:简化的 FIFO/LIFO 计算忽略复杂情况
  • 遗漏交易:API 限制和手动录入缺口
  • 无法自定义:固定类别和报告结构
  • 隐私顾虑:与第三方服务共享 API 密钥
  • 供应商锁定:专有数据格式和有限导出选项

Beancount.io 的优势

  • 完全控制:以纯文本格式拥有你的数据
  • 无限自定义:创建你需要的任意账户结构
  • 精确的成本基础:基于批次的具体识别跟踪
  • 多协议支持:处理任何交易所、钱包或 DeFi 协议
  • 透明计算:清楚查看数字是如何计算的
  • 面向未来:纯文本格式确保长期可访问性

设置你的加密货币投资组合结构

基础账户层级

从一个全面的账户结构开始,反映你的加密生态系统:

; Exchange Accounts - Organized by Platform
1970-01-01 open Assets:Crypto:Coinbase:USD
1970-01-01 open Assets:Crypto:Coinbase:BTC
1970-01-01 open Assets:Crypto:Coinbase:ETH
1970-01-01 open Assets:Crypto:Coinbase:ADA
 
1970-01-01 open Assets:Crypto:Binance:USD
1970-01-01 open Assets:Crypto:Binance:BTC
1970-01-01 open Assets:Crypto:Binance:ETH
1970-01-01 open Assets:Crypto:Binance:BNB
 
1970-01-01 open Assets:Crypto:Kraken:USD
1970-01-01 open Assets:Crypto:Kraken:BTC
1970-01-01 open Assets:Crypto:Kraken:ETH
1970-01-01 open Assets:Crypto:Kraken:ADA
1970-01-01 open Assets:Crypto:Binance:ADA
 
; Wallet Accounts - Organized by Type
1970-01-01 open Assets:Crypto:Wallet:Ledger:BTC
1970-01-01 open Assets:Crypto:Wallet:Ledger:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:USDC
1970-01-01 open Assets:Crypto:Wallet:MetaMask:UNI
1970-01-01 open Assets:Crypto:Wallet:TrustWallet:BNB
 
; DeFi Protocol Accounts
1970-01-01 open Assets:DeFi:Uniswap:ETH-USDC-LP
1970-01-01 open Assets:DeFi:Compound:CUSDC
1970-01-01 open Assets:Staking:Ethereum:ETH
1970-01-01 open Assets:Staking:Cardano:ADA
 
; Income Tracking
1970-01-01 open Income:Crypto:Staking:ETH
1970-01-01 open Income:Crypto:Staking:ADA
1970-01-01 open Income:Crypto:Mining:BTC
1970-01-01 open Income:Crypto:Airdrops
1970-01-01 open Income:Crypto:DeFi:Yield
1970-01-01 open Income:Crypto:Arbitrage
1970-01-01 open Income:CapitalGains:Crypto
1970-01-01 open Income:CapitalGains:LongTerm
 
; Expense Tracking
1970-01-01 open Expenses:Crypto:Fees:Trading
1970-01-01 open Expenses:Crypto:Fees:Network
1970-01-01 open Expenses:Crypto:Fees:Withdrawal
1970-01-01 open Expenses:CapitalLoss:Crypto

这里有一个命名规则,且解析器会强制执行,而非约定:每个账户组成部分和每个商品符号,都必须以大写字母或数字开头。 Compound 在其自身界面中使用 cUSDC 收据标记,但 Assets:DeFi:Compound:cUSDC 和一个 cUSDC 商品都是词法错误。拼写为 CUSDC,并在商品的 name: 元数据中保留协议自身的拼写。

带元数据的商品定义

用丰富的元数据定义你的加密货币,以便更好地跟踪:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  sector: "digital-currency"
  price-source: "coinbase"
  website: "https://bitcoin.org"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "coinbase"
  website: "https://ethereum.org"
 
1970-01-01 commodity ADA
  name: "Cardano"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "binance"
  website: "https://cardano.org"
 
1970-01-01 commodity DOT
  name: "Polkadot"
  asset-class: "cryptocurrency"
  sector: "interoperability"
  price-source: "kraken"
  website: "https://polkadot.network"

多交易所投资组合跟踪

记录跨交易所购买

以精确成本基础追踪不同交易所的同一加密货币:

; Bitcoin purchases on different exchanges
2024-01-15 * "Buy BTC on Coinbase"
  Assets:Crypto:Coinbase:BTC      1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD  -45000.00 USD
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
 
2024-01-20 * "Buy BTC on Binance"
  Assets:Crypto:Binance:BTC       0.5 BTC {46000.00 USD}
  Assets:Crypto:Binance:USD   -23000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
 
2024-01-25 * "Buy BTC on Kraken"
  Assets:Crypto:Kraken:BTC        0.8 BTC {44000.00 USD}
  Assets:Crypto:Kraken:USD    -35200.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Kraken:USD       -30.00 USD

跨交易所转账

跟踪交易所间的转账,同时保持成本基础:

2024-02-01 * "Transfer BTC from Coinbase to Ledger"
  Assets:Crypto:Coinbase:BTC      -0.5 BTC {45000.00 USD}
  Assets:Crypto:Wallet:Ledger:BTC  0.5 BTC {45000.00 USD}
  Expenses:Crypto:Fees:Withdrawal  0.0005 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:BTC      -0.0005 BTC {45000.00 USD}

套利机会

套利是跨两个市场发生的一个经济事件,所以把它记录为一笔交易。该分录在 Coinbase 以 $2,580.00 卖出你已持有的 10 ETH,并立即以 $2,500.00 在 Binance 还原该仓位:

2024-02-10 * "Arbitrage: Buy ETH on Binance, Sell on Coinbase"
  ; Buy leg on Binance
  Assets:Crypto:Binance:ETH       10 ETH {2500.00 USD}
  Assets:Crypto:Binance:USD   -25000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
  ; Sell leg on Coinbase, at the higher price
  Assets:Crypto:Coinbase:ETH     -10 ETH {2500.00 USD} @ 2580.00 USD
  Assets:Crypto:Coinbase:USD   25800.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:Crypto:Arbitrage       -800.00 USD  ; 25,800.00 proceeds - 25,000.00 basis

三件要复制的事情:

  • 帖子之间绝不要留空行。 空行表示交易结束,Beancount 会在之后的帖子报告语法错误。改用缩进的 ; 注释来标记每个腿——这就是上面两行注释所做的。
  • 收益是处置收益,$800.00,由于 Income 账户持有债权,它是负值。$55.00 的手续费是单独的:它将 $800.00 的毛利差转为 $745.00 的利润,且已在另外两个帖子中记录。
  • 卖出腿减少的是你必须已持有的批次。此分录假设之前在 Coinbase 以 $2,500.00 买入了 10 ETH;如果没有该批次,减少操作就无法对冲入账。

高级成本基准管理

基于批次的跟踪

Beancount.io 的基于批次的系统提供了精准的成本基准跟踪:

; Multiple purchases at different prices
2024-01-01 * "BTC Purchase Lot 1"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
2024-02-01 * "BTC Purchase Lot 2"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD -45000.00 USD
 
2024-03-01 * "BTC Purchase Lot 3"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {50000.00 USD}
  Assets:Crypto:Coinbase:USD -50000.00 USD

收益和损失的符号约定

Income 账户持有债权,因此 Beancount 把它们存为负数。下面的每一个收益因此是对收入账户的负数过账,且每一个损失是对费用账户的正数过账。手续费独立于两者:它自身是费用,所以如果从收益中再扣除它,会造成重复扣减并使交易不平衡。

单笔处置的计算方式总是:

gain (or loss) = gross proceeds - cost basis of the lots removed
net cash       = gross proceeds - fees

特定识别法

出售特定批次以实现最佳税务管理。在减少的过账中命名该批次成本,即为 Beancount 中的“特定识别”,它适用于默认的 STRICT 记账方式:

; Sell the most expensive lot: 1.0 BTC bought at $50,000.00
2024-04-01 * "Sell BTC Lot 3 for tax optimization"
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {50000.00 USD} @ 48000.00 USD
  Assets:Crypto:Coinbase:USD   48000.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
  Expenses:CapitalLoss:Crypto   2000.00 USD  ; 50,000.00 basis - 48,000.00 proceeds

卖出最早或最新的批次

命名不同的成本代表选择不同批次。这两笔销售先卖掉 $40,000.00 批次,然后是 $45,000.00 批次——即上面示例中 $50,000.00 批次之后仍然存在的两个,这与 FIFO 和 LIFO 自动产生的选择相同,只不过这里手动指定:

; Sell the oldest lot (bought 2024-01-01 at $40,000.00)
2024-05-01 * "Sell 0.5 BTC from the oldest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {40000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD  ; gross proceeds, 0.5 * 52,000.00
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -6000.00 USD  ; 26,000.00 proceeds - 20,000.00 basis
 
; Sell the newest remaining lot (bought 2024-02-01 at $45,000.00)
2024-05-02 * "Sell 0.5 BTC from the newest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {45000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -3500.00 USD  ; 26,000.00 proceeds - 22,500.00 basis

同一售价,不同批次,实际收益相差 $2,500.00。如果你希望 Beancount 自动选择批次,可以在账户上设置记账方法,而不是命名成本——即在 open 指令中使用 "FIFO""LIFO""HIFO",如库存管理中所述。

投资组合绩效分析

价格跟踪设置

设置自动价格导入以实现准确估值:

; Daily price updates
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD
2024-01-15 price ADA 0.50 USD
 
2024-01-16 price BTC 46000.00 USD
2024-01-16 price ETH 2550.00 USD
2024-01-16 price ADA 0.52 USD

投资组合配置跟踪

使用 Beancount.io 的报告功能分析配置:

-- Query for portfolio allocation by asset
SELECT
  account,
  sum(position) as balance,
  value(sum(position)) as market_value
WHERE account ~ "Assets:Crypto"
GROUP BY 1
ORDER BY market_value DESC

绩效指标

跟踪关键绩效指标:

-- Total portfolio value query
SELECT
  sum(value(position)) as total_portfolio_value
WHERE account ~ "Assets:Crypto"
 
-- Realized gains/losses
SELECT
  sum(position) as realized_gains
WHERE account ~ "Income:CapitalGains:Crypto"

质押与 DeFi 集成

质押奖励跟踪

用适当的收入确认方式记录质押奖励。到账的资产单位和确认的收入是同一事件的两个方面,因此它们的权重必须抵消:[units] × [price] 的资产输入,等值美元的收入输出——收入是贷方,因此是负数。

2024-01-31 * "ETH Staking Rewards - January"
  Assets:Staking:Ethereum:ETH     0.08 ETH {2500.00 USD}
  Income:Crypto:Staking:ETH     -200.00 USD  ; 0.08 * 2,500.00
 
2024-01-31 * "ADA Staking Rewards - January"
  Assets:Staking:Cardano:ADA        25 ADA {0.50 USD}
  Income:Crypto:Staking:ADA      -12.50 USD  ; 25 * 0.50

{2,500.00 USD}{0.50 USD}外部估价。Beancount 只存储你写入的数据;它不会抓取价格或判断哪个报价是正确的。选择一个来源——你实际会卖出的交易所或者公开的指数——并保持一致使用,因为那个数字既是你的收入也是你未来的成本基数。

奖励的成本基数只确认一次

上面确认的 $200.00 成为 0.08 ETH 的成本基数。以后出售时只实现自奖励日起的变动:

2024-06-30 * "Sell the January ETH staking reward"
  Assets:Staking:Ethereum:ETH   -0.08 ETH {2500.00 USD} @ 3000.00 USD
  Assets:Crypto:Coinbase:USD     240.00 USD  ; gross proceeds, 0.08 * 3,000.00
  Income:CapitalGains:Crypto     -40.00 USD  ; 240.00 proceeds - 200.00 basis

$40.00 的资本利得,而非 $240.00 —— 前 $200.00 已在一月份作为收入确认。将全部 $240.00 计为利得是奖励收入被双重计算的最常见方式。奖励何时变成应税所得及税率因司法管辖区而异;账簿分别记录收支,因此可以从中报告任何一种处理方式。

DeFi 收益跟踪

跟踪复杂的 DeFi 头寸:

提供流动性涉及将两种商品交换为第三种,因此每个部分必须以相同货币计价,交易才能平衡。ETH 和 LP 部分因有成本记录已统一货币单位;稳定币部分则需要明确的 @ 1.00 USD,否则 Beancount 会看到 25,000 单位的 USDC 流出,同时又有 $25,000.00 价值流入,它们是不同商品,无法相抵消。

2024-02-01 * "Uniswap LP Position"
  Assets:Crypto:Wallet:MetaMask:ETH    -10 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:USDC -25000 USDC @ 1.00 USD
  Assets:DeFi:Uniswap:ETH-USDC-LP      100 UNI-V2-ETH-USDC {500.00 USD}
 
2024-02-28 * "Uniswap LP Rewards - February"
  Assets:Crypto:Wallet:MetaMask:UNI    50 UNI {8.00 USD}
  Income:Crypto:DeFi:Yield          -400.00 USD  ; 50 * 8.00

自动投资组合管理

导入交易所数据

Beancount 不附带任何交易所 API 客户端,也没有配置文件能让它连接 Coinbase 或 Binance。支持的方式是导入器:你下载交易所导出的 CSV 文件(或用自己的脚本抓取),然后用 beangulp 转换成 Beancount 交易,这个导入框架取代了 Beancount 2 内置的 beancount.ingest。Beancount 3 中不存在 beancount.ingest

如果你确实编写了抓取脚本,其凭证文件仅属于你自己——Beancount 工具链中没有任何东西会读取它:

# Configuration for YOUR OWN fetch script. No Beancount tool reads this file.
exchanges:
  coinbase:
    api_key: "your_api_key"
    api_secret: "your_api_secret"
    passphrase: "your_passphrase"
  binance:
    api_key: "your_api_key"
    api_secret: "your_api_secret"

自动对账

设置自动余额验证:

; Balance assertions for automated verification
2024-01-31 balance Assets:Crypto:Coinbase:BTC    2.5 BTC
2024-01-31 balance Assets:Crypto:Binance:ETH    15.0 ETH
2024-01-31 balance Assets:Crypto:Kraken:ADA   1000.0 ADA

这三个数字来自的交易所页面,而不是本页,所以上面的区块在你的交易录入账本之前不会验证任何内容。有两个规则决定它是否能验证。balance 指令断言指定日期开始时的余额,因此标注为 2024-01-31 的断言不会看到该日的任何入账——日期应设为你要结算期间后的第二天。且每个断言的账户必须是开放状态,这也是为什么 Assets:Crypto:Kraken:ADA 出现在上方的基础账户层级章节中。

保持价格数据更新

价格以 price 指令形式存在账本中,而 Beancount 3.2.3 中没有任何功能会帮你自动抓取它们。不存在**custom "price-source" 指令**——裸商品符号甚至不是有效的 custom 值,因此那行会是语法错误——也不存在**beancount.plugins.forecast 模块**;如果你尝试命名它,加载器会因导入错误而停止。

通过 bea engine enable beanprice 在受管理引擎中启用 beanprice,然后使用 bea price main.beancount 抓取报价。它读取每个 commodity 指令上的 price: 元数据字段,形式为 "<quote currency>:<source module>/<ticker>",并写入你附加到账本里的 price 指令:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/BTC-USD"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/ETH-USD"
 
; Example quotes to append after reviewing the output of bea price - and what you would otherwise type by hand
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD

你附加在商品上的任何其他元数据——sectorwebsite,或本指南早期使用的 price-source 字段——都是自由格式的文档,仅供你参考。加载器会存储它们,但没有任何工具会对此做出操作。

税务优化策略

税收亏损收割

实施系统化的税收亏损收割:

; The lot being harvested, so this block stands on its own
2024-03-01 * "Buy ADA on Binance"
  Assets:Crypto:Binance:ADA       1000 ADA {0.60 USD}
  Assets:Crypto:Binance:USD    -600.00 USD
 
; Identify positions with unrealized losses
2024-12-15 * "Tax loss harvesting - Sell ADA at loss"
  Assets:Crypto:Binance:ADA      -1000 ADA {0.60 USD} @ 0.45 USD
  Assets:Crypto:Binance:USD       450.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading      5.00 USD
  Assets:Crypto:Binance:USD        -5.00 USD
  Expenses:CapitalLoss:Crypto     150.00 USD  ; 600.00 basis - 450.00 proceeds
 
; Repurchase after wash sale period (31 days)
2025-01-16 * "Repurchase ADA after wash sale period"
  Assets:Crypto:Binance:ADA      1000 ADA {0.45 USD}
  Assets:Crypto:Binance:USD     -450.00 USD
  Expenses:Crypto:Fees:Trading     5.00 USD
  Assets:Crypto:Binance:USD       -5.00 USD

长期与短期收益

跟踪持有期以进行税务优化:

; Use metadata to track purchase dates
2024-01-01 * "BTC Purchase - Long-term hold" ^long-term-btc
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
; Sell after one year for long-term capital gains treatment
2025-01-02 * "BTC Sale - Long-term capital gains" ^long-term-btc
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {40000.00 USD} @ 55000.00 USD
  Assets:Crypto:Coinbase:USD   55000.00 USD
  Income:CapitalGains:LongTerm -15000.00 USD  ; 55,000.00 proceeds - 40,000.00 basis

两笔录入上的 ^long-term-btc 链接让你能之后一并调出买入和卖出;Beancount 本身不会追踪持有期。

报告与分析

投资组合摘要报告

生成全面的投资组合报告:

-- Portfolio allocation by cryptocurrency
SELECT
  commodity,
  sum(position) as total_units,
  value(sum(position)) as market_value,
  value(sum(position)) / (
    SELECT value(sum(position))
    FROM positions
    WHERE account ~ "Assets:Crypto"
  ) * 100 as allocation_percentage
WHERE account ~ "Assets:Crypto"
GROUP BY commodity
ORDER BY market_value DESC;

绩效分析

跟踪投资组合随时间的绩效:

-- Monthly portfolio performance
SELECT
  year(date) as year,
  month(date) as month,
  value(sum(position)) as portfolio_value
WHERE account ~ "Assets:Crypto"
GROUP BY year, month
ORDER BY year, month;

收入分析

分析收入来源:

-- Income breakdown by source
SELECT
  account,
  sum(position) as total_income
WHERE account ~ "Income:Crypto"
GROUP BY account
ORDER BY total_income DESC;

最佳实践与技巧

1. 记录一致性

  • 执行后立即记录交易
  • 使用标准化的交易描述
  • 在元数据中包括交易哈希

2. 定期对账

  • 每周核对所有平台的余额
  • 使用余额断言来捕捉差异
  • 监控缺失的交易

3. 备份和安全

  • 定期备份你的 Beancount 文件
  • 使用版本控制(Git)跟踪更改
  • 加密敏感数据

4. 文档

  • 记录你的账户结构决策
  • 维护复杂交易的备注
  • 保存 API 配置记录

5. 税务准备

  • 季度生成税务规划报告
  • 维持详细的审计记录
  • 复杂情况咨询税务专业人士

结论

有效的加密货币投资组合追踪需要精准、一致和合适的工具。Beancount.io 提供了管理多个交易所、钱包和 DeFi 协议中复杂加密投资组合所需的灵活性和强大功能。

使用 Beancount.io 进行加密投资组合追踪的关键优势:

  • 完整的数据所有权:你的数据采用纯文本格式
  • 精确的成本基础:基于批次的追踪与具体识别
  • 无限灵活性:自定义账户结构和报告
  • 税务优化:先进策略降低税务负担
  • 面向未来:开放格式确保长期可访问性

从基础设置开始,随着投资组合复杂度增加逐步扩展你的追踪。适当的设置投资将带来准确的报告、税务优化和投资组合洞察的回报。

准备好掌控你的加密货币投资组合了吗?立即开始使用 Beancount.io

来源:https://beancount.io/zh/docs/Solutions/cryptocurrency-portfolio-tracking