Beancount 记账进阶
作者:nunumick 发布时间:14 Jan 2025 分类: life
上一篇讲了把个人记账软件切换到 Beancount,这篇继续聊下一些进阶用法。
RSU & 股票记账
RSU 奖励是一种预期获益,准确说未归属的部分是一种赠予协议(承诺),只有每年确定归属的部分才能算是产生了收入,且归属时要按所得价值进行个人所得缴税(不同档位税率不同,个人所得税最高可以到 45%),最后在股票交易时还会视超出成本的增量所得收缴资本利得税(20%)。
签订RSU协议 -> 按计划归属 -> 缴税存股(成本价) -> 交易(市价) -> 缴纳所得税(市价 > 成本价)
流程如上,所以如果只计算收入和支出,并不一定需要把未归属的 RSU 部分也记录下来。把每次的股票归属看做公司以归属时市价赠予一定数量的股票(应纳税收益),而这个市价即为后续股票交易的成本价。
应纳税收益 = RSU归属数量 * 计税价格(归属前一日股票收盘价) * 汇率(归属前一日人民币/美金汇率)
以同样是归属 1000 股 BABA(市价 80 USD) 适用税率 20% 来举例说明,根据不同的缴税方式有两种情况:
- 现金缴税
- 卖股缴税
;;定义通货&价格
2020-01-01 commodity BABA
name: "AlibabaGroup Inc."
quote: USD
;;通货价格更新
2021-01-01 price BABA 72.36 USD
;;现金缴税情况:建议分为两个交易记录,一笔缴税,一笔存股
2022-01-01 * "中银国际" "2022年RSU股权激励发放-存股"
Income:Salary:RSU -1000 BABA {80.00 USD}
Assets:Stock:BoC:RSU:BABA 1000 BABA {80.00 USD}
2022-01-01 * "2022年RSU股权激励发放-个人所得税"
Assets:Bank:CMBCHINA -16000 USD {7.00 CNY}
Expenses:Government:Tax
;;卖股抵税,则可以一笔记录
2022-01-01 * "中银国际" "2022年RSU股权激励发放-归属"
Income:Salary:RSU -1000 BABA {80.00 USD}
Assets:Stock:BoC:RSU:BABA 800 BABA {80.00 USD}
Expenses:Government:Tax
理论上归属利润都是 = 应纳税收益 - 税费 = 64000 USD。但是卖股抵税是有时间差的,卖出价格不一定是 80 USD,可能高也可能低,如果卖出时价格更高,则存入股数就大于 800(赚到了),反之则会损失一些。
;;比如卖股抵税时价格涨到了85
2022-01-01 * "中银国际" "2022年RSU股权激励发放-归属"
Income:Salary:RSU -1000 BABA {80 USD}
Expenses:Government:Tax 189 BABA {85 USD} ;实际卖出总价是16065
Assets:Stock:BoC:RSU:BABA 811 BABA {80 USD} @ 85 USD ;实际存股数,成本80
Expenses:Government:Tax -65 USD ;退回超卖的部分价值
Assets:Stock:BoC 65 USD ;退回超卖的部分价值
Income:Investing ;额外得到945投资收益:880 + 65
卖出股票和贵金属通货交易类似,值得一提的是股票交易有批次的概念,即 FIFO 原则:
在股票交易中,FIFO(先进先出)是一项重要的会计原则,尤其在税务方面。它要求投资者在出售股票时,必须先卖出最早购买的股票份额,以此来确定持有期和相应的资本利得。这种规则有助于计算投资收益,因为它确保了长期和短期资本利得的正确划分。长期资本利得通常享有更低的税率,而短期资本利得则按普通所得税率征税。
在 Beancount 中,默认为 STRICT 模式,不过我们可以为某个账户显式声明遵循 FIFO 库存管理模式,这样就可以让 Beancount 自动选择股票批次和成本价
;;开户
2021-01-01 open Assets:Stock:BoC:RSU:BABA BABA "FIFO"
;;RSU归属,股票买入
2022-01-01 * "中银国际" "RSU归属"
Income:Salary:RSU -1000 BABA {80.00 USD}
Assets:Stock:BoC:RSU:BABA 800 BABA {80.00 USD}
Expenses:Government:Tax
2022-07-01 * "中银国际" "RSU归属"
Income:Salary:RSU -200 BABA {72.00 USD}
Assets:Stock:BoC:RSU:BABA 160 BABA {72.00 USD}
Expenses:Government:Tax
;;股票卖出,声明FIFO模式,可以合并批次简化格式,更符合实际需求
2023-01-01 * "卖出股票FIFO"
Assets:Stock:BoC:RSU:BABA -900 BABA {} @ 87.90 USD ;卖出价87.9,成本价和批次自动计算
Assets:Stock:BoC:Cash 79,105.00 USD ;实际进账
Expenses:Stock:Fee 5.00 USD ;交易手续费
Income:Investing ;利润
;;如果不使用FIFO声明,则需补全卖出批次与成本价,结果是等价的
2023-01-01 * "卖出股票"
Assets:Stock:BoC:RSU:BABA -800 BABA {80 USD} @ 87.90 USD
Assets:Stock:BoC:RSU:BABA -100 BABA {72 USD} @ 87.90 USD
Assets:Stock:BoC:Cash 79,105.00 USD ;实际进账
Expenses:Stock:Fee 5.00 USD ;交易手续费
Income:Investing
固定资产记账
手搓资产负债表的时候,我习惯于只记录不动产当前市价,这会没有办法看到成本与收益,也会造成当前资产虚高的假象。不动产本质上也是一类投资,和股票买卖一样,房子在买入时有成本价,只有在卖出时才会实现价值变现。
使用 Beancount 的成本盈亏模型,可以更直观的反映出房子在成本和现价的利润变化。关于不动产的账户定义,我更建议以房屋每平米单价自定义出通货来跟踪,举例说明:
;;通货定义
2020-01-01 commodity HOUSE.A ;A房屋每平米单价
name: "A房屋"
2020-01-01 commodity HOUSE.B ;B房屋每平米单价
name: "B房屋"
;;不动资产开户
2020-01-01 open Assets:Property:A HOUSE.A
2020-01-01 open Assets:Property:B HOUSE.B
;;初始化买入
2021-01-01 * "A房屋买入"
Assets:Property:A 100 HOUSE.A {20000.00 CNY} ;A房屋买入单价、面积
Equity:Opening-Balances
2022-01-01 * "B房屋买入"
Assets:Property:B 80 HOUSE.B {30000.00 CNY} ;B房屋买入单价、面积
Equity:Opening-Balances
;;跟踪单价变化引起的资产变化
2024-12-01 price HOUSE.A 40000.00 CNY ;单价上涨
2024-12-01 price HOUSE.B 28000.00 CNY ;单价下跌
活用 Beancount 的通货体系,可以给任意物品定义价格,比如一辆车、一块布等等等等
2020-01-01 commodity CAR.TESLA
name: "Tesla"
2024-12-01 open Assets:Vehicle:Tesla CAR.TESLA
2024-12-01 * "购入新车"
Assets:Vehicle:Tesla 1 CAR.TESLA {300,000 CNY} @@ 300,000 CNY
Equity:Opening-Balances
2025-01-11 price CAR.TESLA 250,000 CNY