跳转到主要内容

在 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}

套利机会​

套利是在两个场所发生的同一个经济事件,所以要把它记录为一笔交易。下面这笔分录以 $2,580.00 卖出你已经在 Coinbase 持有的 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 集成​

质押奖励跟踪​

记录质押奖励并正确确认收入。到账的单位与确认的收入是同一事件的两个侧面,所以它们的权重必须相互抵消:[单位] × [价格] 的资产流入,对应相同数量的美元收入流出——而收入是贷方,所以为负数。

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 交易。beangulp 是接替 Beancount 2 内置 beancount.ingest 的导入器框架。beancount.ingest 在 Beancount 3 中已不存在。

如果你确实要写抓取脚本,它的凭据文件只属于你自己——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 的断言看不到 2024-01-31 当天过账的任何内容——把它标注为你所结算期间的后一天。而且每个被断言的账户都必须处于打开状态,这正是 Assets:Crypto:Kraken:ADA 出现在上面基本账户层级一节中的原因。

托管账本中的受管价格​

使用 实时价格 选择一种估值货币和受支持的加密资产,然后把生成的 include 粘贴到你的托管账本中。资产符号必须与你的持仓一致。价格源提供的是带日期的估值价格;它们不会设定质押奖励和空投的收入金额或取得成本。

对于同一日期和同一货币对(包括倒数货币对),你自己的价格优先。缓存报价在故障期间可能过期,所以要检查它的观测时间。下面的本地抓取流程对于上游 Beancount 和 Fava 仍然有用。

保持价格数据更新​

价格以 price 指令的形式存放在账本中。上游 Beancount 3.2.3 不会自行抓取它们;托管受管 include 使用的是上面描述的 Beancount.io 加载器扩展。这里没有 custom "price-source" 指令——一个裸的商品符号甚至不是合法的 custom 值,所以那行是语法错误——也没有 beancount.plugins.forecast 模块;如果你写上它,加载器会以导入错误停止。

用 bea engine enable beanprice 在受管引擎中启用 beanprice,然后用 bea price main.beancount 抓取报价。它读取每个 commodity 指令上的 price: 元数据字段,形式为 "<报价货币>:<来源模块>/<代码>",并写出你追加到账本中的 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

你附加到商品上的任何其他元数据——sector、website,或本指南前面用过的 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 本身并不追踪持有期。

报告与分析​

投资组合摘要报告​

以一种估值货币计算每种加密货币在投资组合中的占比。本示例使用 2024 年 3 月 31 日可用的美元价格,以及 4 月 1 日之前的持仓。要换一个报告日期,就同时改这两个日期。在你本地的 BQL 查询工具中运行下面的 SELECT 语句。

-- Portfolio allocation by cryptocurrency
SELECT
  currency,
  units(sum(position)) AS total_units,
  convert(sum(position), 'USD', 2024-03-31) AS allocation_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:'
GROUP BY currency
ORDER BY currency;

在计算百分比之前,先检查每个非零的 allocation_value 都是美元。换算使用的是估值日当天或之前可用的已记录价格。缺少换算可能会让金额保持原币种。如果还剩下任何 BTC、ETH 或其他非美元金额,估值就是不完整的。补上缺失的带日期价格再重跑;不要把无价格的资产当作零,也不要加上不相关的货币单位。

把美元金额相加得到投资组合总额。然后按 资产美元价值 / 总美元价值 * 100 计算每项资产的占比。在显示百分比之前保持完整精度。例如,持有 1 BTC 和 3 ETH,BTC 价格为 200 美元、ETH 价格为 20 美元,则:

资产美元价值占比计算显示占比
BTC200200 / 260 * 10076.92%
ETH6060 / 260 * 10023.08%
总计260260 / 260 * 100100.00%

把各占比四舍五入到两位小数,可能使其显示之和与 100% 略有出入。价值为零的库存可能显示为空白。对于空投资组合或美元总额为零的情况,把占比报告为不可用,不要除以零。本示例描述的是正值的资产持仓;负余额需要按带符号的风险敞口来解释,而不是当作普通的投资组合占比。

绩效分析​

用下个月之前的所有持仓,报告每个月末的投资组合价值。把估值日期设为月末,这样之后的价格就无法改变这个快照。这些示例以美元报告。在你本地的 BQL 查询工具中分别运行每个 SELECT。

1 月 31 日:

SELECT convert(sum(position), 'USD', 2024-01-31) AS portfolio_value
FROM close ON 2024-02-01
WHERE account ~ '^Assets:Crypto:';

2 月 29 日:

SELECT convert(sum(position), 'USD', 2024-02-29) AS portfolio_value
FROM close ON 2024-03-01
WHERE account ~ '^Assets:Crypto:';

3 月 31 日:

SELECT convert(sum(position), 'USD', 2024-03-31) AS portfolio_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:';

FROM close ON 会排除日期在其截止点当天或之后的过账条目。convert 内部的日期选择的是报告日当天或之前可用的价格。要换一个月,就同时改这两个日期。你想要报告的每个月都要查询,包括没有交易的月份。在把结果当作美元总额之前,按上文所述检查未换算的货币。

例如,假设 1 月末有 2 BTC,单价 100 美元,以及 3 ETH,单价 10 美元。2 月卖出 1 BTC,剩下 1 BTC 和 3 ETH。如果 3 月没有交易,但已记录的价格涨到 200 美元/BTC 和 20 美元/ETH,则各快照为:

月末期末加密货币价值
1 月 31 日2 * 100 + 3 * 10 = 230 美元
2 月 29 日1 * 100 + 3 * 10 = 130 美元
3 月 31 日1 * 200 + 3 * 20 = 260 美元

2 月的价值假设该月没有新的价格指令。卖出的 @ 价格记录的是其成交金额;它不会创建市场价格指令。这些查询只覆盖 Assets:Crypto: 账户,所以存放在别处的现金收入不在其中。

按交易月份对过账条目分组,衡量的是每个月的变动,而不是累计的期末持仓。它也会遗漏没有交易的月份。期末价值之间的变化包括买入、卖出、转账和价格变动。它们不是经现金流调整后的投资回报。

收入分析​

分析收入来源:

-- 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