复式借贷记账法 Beancount (4) - RSU

10 minute read

本篇介绍如何在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股

创建商品

1990-12-02 commodity HOOL
  name: "Common shares of Hooli Inc."
  quote: USD

2013-01-28 commodity HOOL.UNVEST
  name: "Unvested shares of Hooli from awards."

首先我们用commodity来定义股票。我们用后缀的方式来跟踪还没有真正到手的股票,这样的好处是还没有给你的股票(HOOL.UNVEST)不会和已经给你的股票HOOL混在一起。

创建未发放股票收入和支出账户

2020-01-01 open Income:US:Hooli:Awards        HOOL.UNVEST
2020-01-01 open Expenses:Hooli:Vested         HOOL.UNVEST

然后我们用一对Income和Expense来记录还未Invest的股票,

创建股票奖励账户

2020-01-01 open Assets:US:Hooli:Unvested:S0012345

2020-01-01 * "Award S0012345"
  Income:US:Hooli:Awards                -1500 HOOL.UNVEST
  Assets:US:Hooli:Unvested:S0012345      1500 HOOL.UNVEST

一般公司会在你的员工股票账户里有一个award number来跟踪这一份股票奖励。每次refresh或者retaintion offer都会有一个新的award number可以用来区分不同的股票奖励。不过一般最大的那一笔就是你的入职股票奖励。

于是我们用一个Asset账户来跟踪一个特定的股票奖励,比如这里就是A君入职的股票奖励。这样你就可以知道对于某一个特定的股票奖励,还有多少股票没有发放给你。 如果没有这样的需求-跟踪还有多少未发放的股票, 则不用创建这个Asset,也不需要HOOL.UNVEST这样的单位.

创建货币账户

为跟踪Vesting的过程我们还需要货币账户

2020-01-01 open Income:US:Hooli:RSU
2020-01-01 open Assets:US:Hooli:RSURefund

创建你的股票账户

2020-01-01 open Assets:US:Etrade:HOOL

还需要一个资产账户用来存放已经发放给你的股票,这个就等同于你的brokerage股票账户,每个公司一般都会有自己合作的brokerage。 这里我们用Etrade来举例。

股票到账(Vesting Event)

Non-fractional Stock

对于有的brokerage, 出售股票补税的时候是出售的整数股, 那么就会在RSURefund账户中有一些结余.

从beancount的角度出发,一次股票到账其实是两个交易记录

2020-06-30 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0
  doc: "2020-06-30.hooli.38745783.pdf"
  Income:US:Hooli:RSU                                -13,509.31 USD
  Assets:US:Hooli:RSURefund
  Expenses:Taxes:Y2020:US:Federal                      3,065.68 USD
  Expenses:Taxes:Y2020:US:SocSec                         837.58 USD
  Expenses:Taxes:Y2020:US:Medicare                       195.88 USD
  Expenses:Taxes:Y2020:US:State:CA                     1,382.00 USD
  Expenses:Taxes:Y2020:US:SDI                            135.09 USD

2020-06-30 * "Conversion into shares" ^392f97dd62d0
  Assets:US:Etrade:HOOL                          52 HOOL {151.79 USD}
  Assets:US:Hooli:RSURefund
  Assets:US:Hooli:Unvested:S0012345             -89 HOOL.UNVEST
  Expenses:Hooli:Vested                          89 HOOL.UNVEST

可以这么理解这两笔交易:

  • 从钱的角度来看,则是一定数量的货币被奖励给你,然后一部分用来交了各种税费,剩下的进入了RSURefund
  • 从股票的角度来看, Assets:US:Hooli:Unvested:S0012345 中花掉35股HOOL.UNVEST 换得 HOOL,不过由于复式记账法每一笔交易要试算平衡,所以这里也相当于用了RSURefund买了这些最终进入你腰包的股票
  • RSURefund在两个交易记录中一进一出,终账应该为0
  • 结合这两笔交易记录,实际完成的就是 UNVEST STOCKS -> VESTED STOCKS + TAX

这里也可以简化成一笔交易:

2020-06-30 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0
  doc: "2020-06-30.hooli.38745783.pdf"
  Income:US:Hooli:RSU                                -13,509.31 USD
  Assets:US:Hooli:RSURefund
  Expenses:Taxes:Y2020:US:Federal                      3,065.68 USD
  Expenses:Taxes:Y2020:US:SocSec                         837.58 USD
  Expenses:Taxes:Y2020:US:Medicare                       195.88 USD
  Expenses:Taxes:Y2020:US:State:CA                     1,382.00 USD
  Expenses:Taxes:Y2020:US:SDI                            135.09 USD
  Assets:US:Etrade:HOOL                          52 HOOL {151.79 USD}
  Assets:US:Hooli:Unvested:S0012345             -89 HOOL.UNVEST
  Expenses:Hooli:Vested                          89 HOOL.UNVEST

Fractional Stock

现在也有的公司股票账户, 会出售fractional share, 即非整数股票, 会比较精准的卖出用来扣税的钱. 这样也可以写成一笔交易记录

这里偶尔也还是有一些损耗, 所以不能试算平衡, 可以用一个专门的expense/equity账户来记录损耗.

2020-06-30 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0
  doc: "2020-06-30.hooli.38745783.pdf"
  Income:US:Hooli:RSU                                -13,509.31 USD
  Expenses:Hooli:ConversionLoss
  Expenses:Taxes:Y2020:US:Federal                      3,065.68 USD
  Expenses:Taxes:Y2020:US:SocSec                         837.58 USD
  Expenses:Taxes:Y2020:US:Medicare                       195.88 USD
  Expenses:Taxes:Y2020:US:State:CA                     1,382.00 USD
  Expenses:Taxes:Y2020:US:SDI                            135.09 USD
  Assets:US:Etrade:HOOL                          52.333HOOL {151.79 USD}
  Assets:US:Hooli:Unvested:S0012345             -89 HOOL.UNVEST
  Expenses:Hooli:Vested                          89 HOOL.UNVEST

出售股票

出售已经发放给你的股票,和普通出售股票的交易并无差别。唯一可能需要注意的就是cost basis,要按照你之前vest的时候的成本来计算, 这样你就可以对你的增益的部分来计算你可能还要交的税(在vest给你的时候已经对那部分钱缴税了,现在只需要跟踪增值的部分即可)。

2020-09-10 * "Selling shares"
  Assets:US:Etrade:HOOL        -26 HOOL {151.79 USD} @ 138.23 USD
  Assets:US:Etrade:Cash         3946.54 USD
  Income:US:Etrade:Gains

MISC

  • 可以用balance断言(assert)来保证还没有invest的股票数目是正确的
  • 如果用price来给HOOL.UNVEST来定价,不过在Web上目前其价格并不会自动转换成货币,不过SQL query可以
  • 可以用balance来断言RSURefund账户余额是0

系列介绍

准备用一个系列的文章来介绍这个工具和一些技巧。 这些技巧有一些是我从已有的模版中找出来,也有一些是在Google Group里看到大家的推荐,自己又尝试出来的方法。

  1. 先导
  2. 基础知识
  3. 环境设置
  4. 如何对房产建模
  5. 如何对RSU建模
  6. 如何对ESPP建模
  7. 自动化导入
  8. 安全

wechat-qrcode