亲手把股权结构表推演到融资轮
目标
在虚构公司的股权结构表上,依次应用归属、离职者回购、投后估值 SAFE 转换,以及包含期权池增加的种子轮,并计算每个阶段谁被稀释了多少。
为什么重要
股权条件写在合同里,但它的结果,不计算一遍是看不出来的。没有设置归属的股权、彼此稀释的 SAFE、被计入投前估值的池增加量,都会悄悄改变创始人的份额。只有自己能够计算,才能读懂谈判桌上的数字。(不构成法律、税务建议。)
材料——/opt/fixtures/founder/equity/company.json
founders:name, shares, vesting_start, cliff_months, vesting_months, left_on(离开的日期,没有则为 null)pool:granted(已授予的期权)、unissued(未授予的池)safes:investor, amount, post_money_capround:date, investor, pre_money, investment, pool_target
定义
- 已满月数:从开始日期到基准日的(年之差 × 12 + 月之差),如果基准日的日小于开始日的日,就减去 1(为负则为 0)。
- 归属:月数 < cliff 则为 0,否则为
shares × min(달 수, vesting_months) // vesting_months。离职者只保留按left_on计算的归属份额,其余的由公司回购并注销。留下的创始人全部持有。 - 轮次之前的股票 C = 创始人持有 + pool_granted + pool_unissued。
- SAFE 转换:
f_i = amount / post_money_cap,F = Σf_i,S_i = floor(f_i × C / (1 − F))。转换之后的股票 D = C + ΣS。 - 轮次:
k = (pre_money + investment) / pre_money,U = pool_unissued,p = pool_target。池增加P = max(0, floor((p·D·k − U) / (1 − p·k))),每股价格= pre_money / (D + P),投资人股票= floor(investment / 주당 가격)(占位符为每股价格),实际投前估值= 주당 가격 × D(占位符为每股价格)。 - 持股比例是 0–1 之间的比率,在小数点后第四位四舍五入。
步骤
- 在
/root/founder/equity/equity.py中创建vested(shares, start, cliff, total, on)(日期是 "YYYY-MM-DD" 字符串,返回整数)。 - 在
/root/founder/equity/departures.json中,为每个离职者写入{"left_on", "months", "vested", "repurchased"}(键是姓名)。 - 在
/root/founder/equity/cap_pre.json中写入holders(姓名、pool_granted、pool_unissued → 股票,离职者也按剩余股票包含在内)、total、ownership。 - 在
equity.py中创建safe_shares(C, safes)(safes 是材料中的列表原样,返回顺序相同的股票数列表),并在/root/founder/equity/safes.json中写入shares(投资人 → 股票)、total_after(D)、ownership(投资人 → 相对 D 的比例)。 - 在
/root/founder/equity/naive.json中写入常见错误——把f_i × C向下取整后的股票给了 SAFE 的情形——的shares,以及此时的ownership(相对于 C + Σ错误股票)。 - 在
equity.py中创建priced_round(D, U, pre_money, investment, pool_target)→{"pool_increase", "price", "investor_shares", "post_fd", "effective_pre_money"},并在/root/founder/equity/round.json中写入用材料计算的结果(price 保留到小数点后第二位,effective_pre_money 四舍五入为整数)。 - 在
/root/founder/equity/cap_post.json中写入轮次之后的holders(pool_unissued 加上增加量,并加入本轮投资人)、total、ownership。 - 在
/root/founder/equity/dilution.json中写入minji([轮次之前、SAFE 转换之后、轮次之后] 三个持股比例)、founders_after(留下的全体创始人在轮次之后的持股比例)、headline_pre_money、effective_pre_money、investor_ownership(本轮投资人)。
参考
- 严格按定义遵守整数除法和向下取整(
//、math.floor)。评分器连一股的差别都会察觉。 - 常见错误:给悬崖期之前离职的人归属,把月数按天数四舍五入来数,把 SAFE 比例直接乘以 C,把池增加量计入投资之后的股票,把持股比例写成百分数(53.35)。
归属——已满的月份与悬崖期
在 /root/founder/equity/equity.py 中创建 vested(shares, start, cliff, total, on)。
先数已满的月数。如果基准日的“日”小于开始日的“日”,那个月就还没有满。悬崖期之前为 0,之后用整数除法(//)。
离职者的份额
在 /root/founder/equity/departures.json 中,为每个离职者写入 left_on、months、vested、repurchased。
只写有 left_on 的创始人。repurchased 是原有股票 − 已归属的股票。
轮次之前的股权结构表
在 /root/founder/equity/cap_pre.json 中写入 holders、total、ownership。
离职者只有归属的份额,留下的创始人全部持有,再把 pool_granted、pool_unissued 放在同一张表里。持股比例是 0–1 的比率。
转换两份投后估值 SAFE
在 equity.py 中加入 safe_shares(C, safes),并在 /root/founder/equity/safes.json 中写入 shares、total_after、ownership。
每份 SAFE 在转换后,必须从全部股票中获得投资额 ÷ 估值上限这么多。SAFE 之间也会彼此稀释,所以用比例之和 F 来计算 C × f / (1 − F)。
常见错误——直接把比例乘上去
在 /root/founder/equity/naive.json 中写入把 f_i × C 向下取整得到的 shares,以及此时的 ownership(相对于 C + Σ)。
这一步是故意做错的计算。请确认投资人的份额比承诺的比例(投资额 ÷ 估值上限)更小。
把池增加量计入投前估值的种子轮
在 equity.py 中加入 priced_round(D, U, pre_money, investment, pool_target),并在 /root/founder/equity/round.json 中写入结果。
k = 投后 ÷ 投前。按定义中的公式求出池增加量 P 并向下取整,每股价格 = 投前 ÷ (D + P),投资人股票 = 投资 ÷ 价格向下取整。
轮次之后的股权结构表
在 /root/founder/equity/cap_post.json 中写入 holders、total、ownership。
在加入了 SAFE 投资人的表中,给 pool_unissued 加上增加量,并把本轮投资人(材料中的 round.investor)作为新的一行放进去。
谁被稀释了多少
在 /root/founder/equity/dilution.json 中写入 minji(三个时点)、founders_after、headline_pre_money、effective_pre_money、investor_ownership。
SAFE 转换之后 minji 的持股比例 = minji 的股票 ÷ D。实际投前估值直接使用第 6 步的结果。