跨多个交易所、钱包和 DeFi 协议 管理加密货币投资组合可能颇具挑战。这份全面指南将向你展示如何使用 Beancount.io 强大的纯文本记账系统来搭建并维护精确的加密货币投资组合追踪。
探索一份实时的加密货币示例账本:
传统投资组合跟踪器为何不能满足需求
加密货币投资组合工具的常见问题
- 交易所支持有限:许多工具不支持所有交易所或 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 美元,则:
| 资产 | 美元价值 | 占比计算 | 显示占比 |
|---|---|---|---|
| BTC | 200 | 200 / 260 * 100 | 76.92% |
| ETH | 60 | 60 / 260 * 100 | 23.08% |
| 总计 | 260 | 260 / 260 * 100 | 100.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。