Beancount 中的股票归属
Martin Blais, 2015 年 6 月
http://furius.ca/beancount/doc/vesting
引言
本文通过一个示例说明 Beancount 中限制性股票单位(RSU)的归属过程。此示例可能不完全符合您的具体情况,但提供了足够详细的说明,使您能够根据自身情况进行调整。
您可以通过此处找到一个可运行的示例文件,以便跟随本文操作。
限制性股票薪酬
许多科技公司向员工提供名为“授予”(或“奖励”)的“限制性股票单位”(RSU)作为激励薪酬,这本质上是承诺在未来向您释放实际股票。这些股票是“受限”的,意味着您无法立即使用它们——只有在股票“归属”时才能获得,而归属遵循既定的时间表。通常,您会被承诺在三到四年期间内,每季度或每月归属固定数量的股票。如果您离开公司,剩余未归属的股票将作废。
您可以将这些 RSU 视为一种资产,一种随时间定期到账的应收款项。这些 RSU 本质上是以公司股票为计价单位的薪酬。我们希望追踪这些未归属单位的逐步归属过程,并正确记录其转换为实际股票的过程,包括其成本基础以及归属时所缴纳的税款。
追踪奖励
商品
首先,我们需要定义一些商品。在本示例中,我供职于“Hooli 公司”,最终将收到该公司的股票(以美元计价):
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."
奖励账户
收到的授予属于收入。我使用“Income:US:Hooli”作为来自 Hooli 的所有收入账户的根目录,但特别定义了一个账户用于记录未归属股票的单位:
2013-01-28 open Income:US:Hooli:Awards HOOL.UNVEST
当股票归属时,我们需要在另一侧记录这笔收入,因此我们定义一个费用账户,用于统计在一段时间内已归属的股票总量:
2014-01-28 open Expenses:Hooli:Vested HOOL.UNVEST
接收奖励
当您收到新的奖励(例如每年一次,有些人称之为“股票刷新”)时,您将其作为收入接收,并存入一个专门用于追踪该笔奖励的新账户中:
2014-04-02 * "Award S0012345"
Income:US:Hooli:Awards -1680 HOOL.UNVEST
Assets:US:Hooli:Unvested:S0012345 1680 HOOL.UNVEST
2014-04-02 open Assets:US:Hooli:Unvested:S0012345
您可能同时拥有多个生效的奖励。为每个奖励设置独立账户是很好的做法,因为它能自然地列出其内容,并在奖励到期时关闭账户——已打开的奖励账户列表即为您所有未归属且正在归属中的奖励清单。在此示例中,我使用了奖励编号(#S0012345)作为子账户名称,这样做的好处是,对账单通常都会包含该编号。
我喜欢将所有奖励集中在一个小型专用区域中。
归属事件
然后,我另设一个部分,专门记录所有与归属事件相关的交易。
账户
首先,当我们归属股票时,这属于应税收入事件。股票的现金价值需要计入收入账户:
2013-04-04 open Income:US:Hooli:RSU
已缴纳的税款应记入您 elsewhere 定义的年度支出账户中,以对应当年的税款(此内容在本手册其他地方有说明):
2015-01-01 open Expenses:Taxes:TY2015:US:StateNY
2015-01-01 open Expenses:Taxes:TY2015:US:Federal
2015-01-01 open Expenses:Taxes:TY2015:US:SocSec
2015-01-01 open Expenses:Taxes:TY2015:US:SDI
2015-01-01 open Expenses:Taxes:TY2015:US:Medicare
2015-01-01 open Expenses:Taxes:TY2015:US:CityNYC
在支付了所获收入的税款后,剩余现金会先存入一个临时账户,再进行转换:
2013-01-28 open Assets:US:Hooli:RSURefund
此外,在另一个部分中,我们还应设置一个账户,用于记录经纪商为您持有和管理股票的情况:
2013-04-04 open Assets:US:Schwab:HOOL
通常您无法自行选择经纪商,因为您所在的公司通常会与外部机构合作,以管理限制性股票计划。这类管理机构常见的有摩根士丹利、所罗门史密斯巴尼、嘉信理财,甚至 E*Trade。在本示例中,我们将使用嘉信账户。
此外,我们还需要一个支票账户,用于接收因零股而支付的现金补偿。在示例中,我假设使用的是美国银行账户:
2001-01-01 open Assets:US:BofA:Checking
归属
首先,是归属事件本身:
2015-05-27 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0
doc: "2015-02-13.hooli.38745783.pdf"
Income:US:Hooli:RSU -4597.95 USD
Expenses:Taxes:TY2015:US:Medicare 66.68 USD
Expenses:Taxes:TY2015:US:Federal 1149.48 USD
Expenses:Taxes:TY2015:US:CityNYC 195.42 USD
Expenses:Taxes:TY2015:US:SDI 0.00 USD
Expenses:Taxes:TY2015:US:StateNY 442.32 USD
Expenses:Taxes:TY2015:US:SocSec 285.08 USD
Assets:US:Hooli:RSURefund 2458.97 USD
这与我每次归属时收到的工资单逐行对应。由于 Hooli 的所有 RSU 奖励都在每月同一天归属,这意味着我会按奖励类别形成一组组记录(在示例文件中我展示了两个奖励)。
需要注意以下几点:
-
收入条目的金额等于归属股数乘以股票的公允市价(FMV)。本例中为 35 股 × 131.37 美元/股 = 4597.95 美元。我直接使用工资单上提供的金额。
-
收到归属股票属于应税收入事件,Hooli 会自动代扣税款并代表员工向政府缴付。这些支出账户(Expenses:Taxes)对应您的 W-2 表格中的税款项目。
-
最后,我不会直接将转换后的股票存入经纪账户;这是因为缴税后的剩余现金不一定能恰好转换为整数股。因此,我使用了一个临时账户(
Assets:US:Hooli:RSURefund),将接收与转换两个步骤分离。
这样,每笔交易都精确对应一张工资单,使数据录入更加简便。
另外请注意,我使用了唯一的链接(^392f97dd62d0)将特定归属事件的所有交易分组。您也可以选择使用标签,如果更喜欢的话。
转换为实际股票
现在,我们将剩余的现金转换为股票单位。这一操作在经纪公司进行,您应在经纪账户中看到新增的股票。经纪公司通常会为每次归属事件和每个奖励出具一份“股票释放报告”,其中包含转换所需的详细信息,即从现金转换的实际股数和成本基础(归属日的公允价值):
2015-05-25 * "Conversion into shares" ^392f97dd62d0
Assets:US:Schwab:HOOL 18 HOOL {131.3700 USD}
Assets:US:Hooli:RSURefund
Assets:US:Hooli:Unvested:S0012345 -35 HOOL.UNVEST
Expenses:Hooli:Vested 35 HOOL.UNVEST
前两笔分录将股票存入账户,并从留置账户中扣除相应金额,该账户存放着归属交易后剩余的现金。您务必使用报表中提供的具体公允价值,而非近似价格,因为这会影响后续的税务处理。请注意,您无法购买 fractional 股份,因此四舍五入后的股数(18 股)将导致留置账户中残留少量现金。
最后两笔分录从未归属股票余额中扣除,我则“确认”了一笔费用;该费用账户用于统计特定时间段内归属的股票总数。
对于您拥有的每一项股票奖励,通常都会发生一次此类转换。我将它们分别录入,以便每份报表对应一笔交易。这是一个值得遵循的好习惯。
小数部分退款
所有转换事件将现金从留置账户中移出后,留置账户中会残留所有转换产生的小数部分余额。在我的情况下,Hooli 会在归属后 3-4 周以一份单独的工资单形式退还所有剩余金额(甚至会逐项列出每一笔)。我也将其作为一笔交易录入:
2015-06-13 * "HOOLI INC PAYROLL" ^392f97dd62d0
doc: "2015-02-13.hooli.38745783.pdf"
Assets:US:Hooli:RSURefund -94.31 USD
Assets:US:Hooli:RSURefund -2.88 USD ; (For second award in example)
Assets:US:BofA:Checking 97.19 USD
在小数部分支付完成后,留置账户应为空。我通过余额断言来验证这一点:
2015-06-14 balance Assets:US:Hooli:RSURefund 0 USD
这让我对数字的准确性更有信心。
组织您的输入数据
我喜欢将所有归属事件集中放在我的输入文件中;这样便于更新和核对,尤其是当您拥有多个奖励时。例如,若有两项奖励,我会像这样分块录入多组交易,并用 4-5 行空行分隔:
2015-05-27 * "Vesting Event - S0012345 - HOOL" #award-S0012345 ^392f97dd62d0
doc: "2015-02-13.hooli.38745783.pdf"
Income:US:Hooli:RSU -4597.95 USD
Assets:US:Hooli:RSURefund 2458.97 USD
Expenses:Taxes:TY2015:US:Medicare 66.68 USD
Expenses:Taxes:TY2015:US:Federal 1149.48 USD
Expenses:Taxes:TY2015:US:CityNYC 195.42 USD
Expenses:Taxes:TY2015:US:SDI 0.00 USD
Expenses:Taxes:TY2015:US:StateNY 442.32 USD
Expenses:Taxes:TY2015:US:SocSec 285.08 USD
2015-05-27 * "Vesting Event - C123456 - HOOL" #award-C123456 ^392f97dd62d0
doc: "2015-02-13.hooli.38745783.pdf"
Income:US:Hooli:RSU -1970.55 USD
Assets:US:Hooli:RSURefund 1053.84 USD
Expenses:Taxes:TY2015:US:Medicare 28.58 USD
Expenses:Taxes:TY2015:US:Federal 492.63 USD
Expenses:Taxes:TY2015:US:CityNYC 83.75 USD
Expenses:Taxes:TY2015:US:SDI 0.00 USD
Expenses:Taxes:TY2015:US:StateNY 189.57 USD
Expenses:Taxes:TY2015:US:SocSec 122.18 USD
2015-05-25 * "Conversion into shares" ^392f97dd62d0
Assets:US:Schwab:HOOL 18 HOOL {131.3700 USD}
Assets:US:Hooli:RSURefund
Assets:US:Hooli:Unvested:S0012345 -35 HOOL.UNVEST
Expenses:Hooli:Vested 35 HOOL.UNVEST
2015-05-25 * "Conversion into shares" ^392f97dd62d0
Assets:US:Schwab:HOOL 9 HOOL {131.3700 USD}
Assets:US:Hooli:RSURefund
Assets:US:Hooli:Unvested:C123456 -15 HOOL.UNVEST
Expenses:Hooli:Vested 15 HOOL.UNVEST
2015-06-13 * "HOOLI INC PAYROLL" ^392f97dd62d0
doc: "2015-02-13.hooli.38745783.pdf"
Assets:US:Hooli:RSURefund -94.30 USD
Assets:US:Hooli:RSURefund -2.88 USD
Assets:US:BofA:Checking 97.18 USD
2015-02-14 balance Assets:US:Hooli:RSURefund 0 USD
未归属股票
断言未归属余额
最后,您可能偶尔需要核对未归属股票的数量。我通常每半年执行一次。为 Hooli 管理 RSU 的经纪公司应能提供每项奖励剩余的未归属股数,因此只需登录网站查询即可:
2015-06-04 balance Assets:US:Hooli:Unvested:S0012345 1645 HOOL.UNVEST
2015-06-04 balance Assets:US:Hooli:Unvested:C123456 705 HOOL.UNVEST
为未归属股票定价
您还可以为未归属股票定价,以估算其未归属的美元价值。为此,您应使用一种虚构货币,因为我们希望避免资产负债表将这些未归属资产误列为普通美元资产:
2015-06-02 price HOOL.UNVEST 132.4300 USD.UNVEST
撰写本文时,bean-web 界面无法在未按成本计价的情况下转换单位,但通过 SQL 查询接口或编写自定义脚本,您应能生成这些数据:
$ bean-query examples/vesting/vesting.beancount
beancount> select account, sum(convert(position, 'USD.UNVEST')) as unvested
where account ~ 'Unvested' group by account;
account unvested
--------------------------------- ----------------------
Assets:US:Hooli:Unvested:S0012345 217847.3500 USD.UNVEST
Assets:US:Hooli:Unvested:C123456 93363.1500 USD.UNVEST
出售已归属股票
每次归属事件后,股票会留在您的经纪账户中。出售这些股票的操作与任何其他交易完全相同(详见 使用 Beancount 进行交易)。例如,出售示例中的股票将如下所示:
2015-09-10 * "Selling shares"
Assets:US:Schwab:HOOL -26 HOOL {131.3700 USD} @ 138.23 USD
Assets:US:Schwab:Cash 3593.98 USD
Income:US:Schwab:Gains
在这里你可以看到为什么你在转换事件中使用的成本基础必须正确:你必须为差额缴税(在 收入:美国:Schwab:收益 中)。在本例中,应税差额为每股票(138.23 - 131.37)美元。
我喜欢将所有经纪交易保留在文档的独立部分,其他与经纪相关的交易,如手续费、股息和转账,也放在同一部分。
结论
这是一个简单的示例,模拟了科技公司处理此类薪酬的方式。它绝非全面,某些细节在你的情况中必然有所不同。特别是,它并未说明如何处理期权(ISOs)。我希望本文件提供的内容足够丰富,能让你据此推导并适应你的具体情况。如果遇到困难,请访问 邮件列表 联系我们。