复式借贷记账法 Beancount (4) - RSU
本篇介绍如何在Beancount对Restricted Stock Unit(RSU)来建模。一般上市公司会在员工工作约定时限/年限之后分配股票给员工。这部分收入可能会比你的基本工资还要高,通常在我们评价offer钱多少的时候会把这一部分计算到每年的收入中。
这里最主要的参考就是官方给的一个例子 这里还有作者写的一份指南
RSU Vesting
首先公司在给你RSU的时候相当于给了你一份股票奖励,不同于年终奖,这份奖励员工不能马上拿到,而是一般分散到四年中,分阶段的拿到。比如有的公司是quarterly即每个季度都拿到一份,四年拿完(25/25/25/25)。也有的公司会加上one year cliff,即第一年不拿RSU,但是第一年结束的时候能一次性的拿到25%,然后就每季度拿一份. 还有的公司会做5/15/40/40这样畸形分配比例,可能就是员工在两年内离职率较高,这样可以减少一些在员工股票上花费。
由于这个股票发放是单独的事件,所以我们建模的方式就是创建一个Asset账户(UNVEST)里面有所有许诺给你的股票,然后在每一次股票vest的时候,用一系列的Transaction把这次发给你的股票,从这个UNVEST账户中挪到你自己的股票账户里,同时处理好所有的税的记录.
税的记录很重要。如果是自掏腰包缴税话,那么你就100%拿到了每次发给你的股票,缴税完全可以是一个单独的缴税交易。但是事实上一般我们很少选择自掏腰包来付税, 因为税取决于给你股票的价值,这个能是一笔不小的开支,大多数人都会选择通过卖掉在这一次vest中的一部分股票来缴税 - 这也就让这个股票发放变得复杂起来,除了股票的转换,还有股票到钱的转换用来缴税。
初始化
假设A君在Hooli工作,其股票代码是Hool 在2020年初的时候入职,股票奖励是1500股
创建商品
1 | 1990-12-02 commodity HOOL |
首先我们用commodity来定义股票。我们用后缀的方式来跟踪还没有真正到手的股票,这样的好处是还没有给你的股票(HOOL.UNVEST)不会和已经给你的股票HOOL混在一起。
创建未发放股票收入和支出账户
1 | 2020-01-01 open Income:US:Hooli:Awards HOOL.UNVEST |
然后我们用一对Income和Expense来记录还未Invest的股票,
创建股票奖励账户
1 | 2020-01-01 open Assets:US:Hooli:Unvested:S0012345 |
一般公司会在你的员工股票账户里有一个award number来跟踪这一份股票奖励。每次refresh或者retaintion offer都会有一个新的award number可以用来区分不同的股票奖励。不过一般最大的那一笔就是你的入职股票奖励。
于是我们用一个Asset账户来跟踪一个特定的股票奖励,比如这里就是A君入职的股票奖励。这样你就可以知道对于某一个特定的股票奖励,还有多少股票没有发放给你。
创建货币账户
为跟踪Vesting的过程我们还需要货币账户
1 | 2020-01-01 open Income:US:Hooli:RSU |
创建你的股票账户
1 | 2020-01-01 open Assets:US:Etrade:HOOL |
还需要一个资产账户用来存放已经发放给你的股票,这个就等同于你的brokerage股票账户,每个公司一般都会有自己合作的brokerage。
这里我们用Etrade来举例。
股票到账(Vesting Event)
从beancount的角度出发,一次股票到账其实是两个交易记录
1 | 2020-06-30 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0 |
可以这么理解这两笔交易:
- 从钱的角度来看,则是一定数量的货币被奖励给你,然后一部分用来交了各种税费,剩下的进入了
RSURefund
- 从股票的角度来看,
Assets:US:Hooli:Unvested:S0012345
中花掉35股HOOL.UNVEST
换得HOOL
,不过由于复式记账法每一笔交易要试算平衡,所以这里也相当于用了RSURefund
买了这些最终进入你腰包的股票 RSURefund
在两个交易记录中一进一出,终账应该为0- 结合这两笔交易记录,实际完成的就是
UNVEST STOCKS -> VESTED STOCKS + TAX
出售股票
出售已经发放给你的股票,和普通出售股票的交易并无差别。唯一可能需要注意的就是cost basis,要按照你之前vest的时候的成本来计算, 这样你就可以对你的增益的部分来计算你可能还要交的税(在vest给你的时候已经对那部分钱缴税了,现在只需要跟踪增值的部分即可)。
1 | 2020-09-10 * "Selling shares" |
MISC
- 可以用
balance
断言(assert)来保证还没有invest的股票数目是正确的 - 如果用
price
来给HOOL.UNVEST
来定价,不过在Web上目前其价格并不会自动转换成货币,不过SQL query可以 - 可以用
balance
来断言RSURefund
账户余额是0
系列介绍
准备用一个系列的文章来介绍这个工具和一些技巧。
这些技巧有一些是我从已有的模版中找出来,也有一些是在Google Group里看到大家的推荐,自己又尝试出来的方法。
- 先导 复式借贷记账法 Beancount (0) - 先导
- 基础知识 复式借贷记账法 Beancount (1) - 基础知识
- 环境设置 复式借贷记账法 Beancount (2) - 环境设置
- 如何对房产建模 复式借贷记账法 Beancount (3) - 房产
- 如何对RSU建模 复式借贷记账法 Beancount (4) - RSU
- 如何对ESPP建模
- 自动化导入
- 安全