資本政策表をラウンドまで自分で回す
한국어 원문으로 표시합니다.
목표
가상의 회사 지분표에 베스팅·퇴사자 재매입·포스트머니 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단계 결과를 그대로 씁니다.