我觉得背景的东西是最重要的,所以看到这些提法印象很深。接下来说制度细节,那就是每个人、每年都可能有适用或者不适用的情况了。我最喜欢的制度细节,就是账户里可以有多少钱。可惜的是,我们通常都不会存到极限。在2012年,个人contribution的上限是$17000,我们公司的 match 是略小于工资的 7% (作为比较,网上有帖子说,通常的 match 是个人 contribution 的 50%,但是不超过工资的 6%)。如果一个人的工资是 $25w,那么 7% 就是上限 $17000,用公司提供的 "maximize match if contribution over 7%" 表格,match 比这个值稍微小一些。总的 contribution 就是略多于 $30000。对于 50 岁以上的人有税收优惠,还可以再多 $5500。极限是在某个网站上看到的:如果一个人,他可以通过小企业家给自己定 match,可以到 100% 或者上限 $50000 这个数字。而小企业家自己只能用收益 25% 或者上限 $50000 这个数字。那么这个人和小企业家自己加起来,可以达到很高的数字。网上的东西不可全信,我的复述也可能有问题。关于上限,有很多帖子。如果真的有那么多钱,找个会计师很容易——也有其他更好的避税办法。YY 的话就这么多。
有同事担心401(k)账号里的钱不是自己的。我们公司的 match 都是立即 vested,也就是不与服务年限有关。
如果劳动合同终止,401(k)账户可以 roll over 到 traditional IRA。关于这个也很有意思,2012 年 traditional IRA 的极限是 $5000,不过收入超过 $10w 就没有税收优惠了。IRA 和 Roth IRA 的额度是算在一起的。有很多帖子说可以把 traditional IRA 转成 Roth IRA,不知道什么时候才应该转?也许最有用的一点是可以取本金出来而没有惩罚性的税。
401(k) 没有手续费,也许是因为公司与 TRP 签订了账户管理的合同。从基金池里选的基金,或者通过 brokerage 账户投资,都要付手续费。brokerage 账户默认是没有开的,不清楚账户管理费怎样。TRP 要求开 brokerage 账户之前,必须开一个准备金账户。这个和国内一样。准备金账户按活期计利息。通过 IRA 可以投资 TRP 的 Target Date Fund 基金,不知道怎么样。好像每个这样的基金账户都是独立呈现的,和准备金账户并列?通过 TRP brokerage 可以买到的基金就很多,也可以选其他投资方式,这些账户怎么在 account summary 上呈现就不知道了。我们公司 401(k) 的基金池很小,每个基金都很有代表性,其中有一个货币基金是 TRP 的 private fund。
改变 contribution 最好的时机是这样几个,年底最后一次发薪之前,奖金发放之前、之后,工资调整之前,还有一个特别的日子,就是一年的收入不会再变化时,为了 max match 所作的改动。每次改动都要注意一点,就是改动并不是即时生效。另外一个比较 tricky 的事情,是改动的依据。如果依据 TRP 网站报告的值,而不是 ADP 网站报告的值,计算的结果就会有偏差,因为目前 TRP 只在月末更新 contribution 总额。如果计算出错,又在下一次工资发放时才发现,这时再次更改 contribution,就要同时估计到这两种情况。再仔细解释一下上述各个时机:每年的 401(k) 限额不同,所以年底一定要为下一年做调整,HR 会提醒。奖金发放之前,HR 也会提醒。我倾向于减少税收影响,拿到平稳的收入,而不是把奖金拿到手里,因为拿到手里的钱会被税务局砍掉一半,直到下一年退税时才会回来。奖金发放之后、工资调整、max match 这些就没有 HR 提醒了,完全取决于个人有没有想 max match。我想最佳的策略是在上半年使用较高的 contribution 百分比,让投资期限更久,下半年使用 max match 的最小百分比(也就是 7%)。比如一个人有 $5w 的收入,那么 max match 是将近 3000 元,为了达到这个 match,最小的 contribution 是 $3500。可是这个数字离上限 $17000 还有很大的距离。假定工资每月发放一次,没有奖金,在上半年x个月里使用较大的百分比p,px/12+7(12-x)/12=17000/50000,p = 7+(34-7)*12/x,x 取值1~12,可以得到这样的一组数字: (331, 169, 115, 88, 71, 61, 53, 47, 43, 39, 36, 34) 扣除超过 100% 的 contribution,如果用 88% 的话,只要四个月就可以了。当然四个月不吃不喝是不太现实。公司的 max match 表格也可以用来算这个,因为是每月发放两次, p = 7+(34-7)*24/x,x 取值1~24,结果是 (655, 331, 223, 169, 136, 115, 99, 88, 79, 71, 65, 61, 56, 53, 50, 47, 45, 43, 41, 39, 37, 36, 35, 34),只要前 7 次用 99% 就可以了。每月发放两次工资是有道理的。假定一个工资是$10w的人在把奖金全部 contribute 之后,还需要 $5000 才可以达到上限。这时最大的 match 只有 5%。公司为小于 7% 的员工提供不同的 max match 计算表格。
1 class contribution: 2 def __init__(self,limit,income,match=7): 3 self._limit=max(0,limit) 4 self._income=max(0,income) 5 self._match=max(0,match) 6 self._match = min(self._match, 100*self._limit/self._income) 7 8 def contribute(self,nm,x): 9 return self._match+(100*self._limit/self._income-self._match)*nm/x 10 11 def all_contributions(self,nm): 12 for i in range(nm): 13 yield (i+1,self.contribute(nm,i+1)) 14 15 def all_contribution_values(self,nm): 16 return (j for i,j in self.all_contributions(nm)) 17 18 if __name__=="__main__": 19 salary=70000 20 bonus=salary/10 21 limit=17500-bonus 22 c=contribution(limit,salary) 23 print tuple(c.all_contribution_values(24)) 代码没有对输入做足够检查,在工资系统里,contribution 百分比必须是整数,工资发放次数是常数。 edit: https://github.com/bbbush/my401k