用Python搭建创业项目财务测算模型:CAC、LTV、盈亏平衡点一键算出(附完整代码)

BP里财务预测靠Excel手搓格子容易拉错公式。本文用pandas搭36个月月度现金流模型:参数集中在开头配置字典,改数字就出月度收入、成本、毛利、净现金流、累计现金流,自动算出月度盈利月、累计回本月、CAC、LTV、LTV/CAC和获客回本周期。脚本在Python 3.13+pandas 3.0.6实测跑通,输出数字均为实跑结果;行业参数可参考五网(www.5ol.com)行业研究报告。
这篇文章写给需要在BP里放财务预测、又不想手搓Excel的技术创业者。读完你可以直接拿走脚本,换成自己的参数跑一遍。
模型假设先摆桌面上
这个模型是订阅制/SaaS口径:客户按月付费,每月自然流失一部分,获客靠每月新增。所有参数都集中在CONFIG字典里,先看每个参数是什么意思。
| 参数 | 示例值 | 含义 |
|---|---|---|
| arpu_month | 300元 | 每个付费客户每月贡献收入 |
| gross_margin | 0.60 | 毛利率,变动成本率等于1减去它 |
| new_cust_base | 25人 | 第1个月新增客户数 |
| new_cust_growth | 0.12 | 新增客户数每月环比增速 |
| cac | 300元 | 获取一个新客户的营销支出 |
| fixed_cost_month | 40000元 | 月固定成本(工资、服务器、房租) |
| monthly_churn | 0.08 | 月流失率 |
| start_capital | 300000元 | 起始资金 |
| months | 36 | 测算周期 |
几个口径说明:客户数滚存方式是"上月留存+本月新增";LTV用订阅口径,等于客单价乘毛利率再除以月流失率,意思是客户在你这儿平均待1/流失率个月;获客回本周期等于CAC除以单客户月毛利。这些都是行业经验口径,不是精确会计结果。
完整可运行脚本
把下面代码存成finance_model.py,装好pandas直接python运行。参数想调哪个,只改CONFIG字典里那一行。
python
# -*- coding: utf-8 -*-
"""
创业项目月度财务测算模型(示例脚本)
参数集中在 CONFIG 字典里,按自己的项目改即可。
运行:python finance_model.py
"""
import pandas as pd
# ============ 项目参数(按自己的项目改这里) ============
CONFIG = {
"arpu_month": 300, # 客单价:每个付费客户每月贡献收入(元)
"gross_margin": 0.60, # 毛利率:扣除变动成本后的比例(变动成本率=1-毛利率)
"new_cust_base": 25, # 第1个月新增客户数(人)
"new_cust_growth": 0.12, # 新增客户数每月环比增速(12%)
"cac": 300, # 获客成本:每获取一个新客户花的营销支出(元)
"fixed_cost_month": 40000,# 月固定成本:工资、服务器、房租等(元)
"monthly_churn": 0.08, # 月流失率:订阅口径,每月流失客户占比
"start_capital": 300000, # 起始资金(元)
"months": 36, # 测算周期(月)
}
def build_model(cfg):
rows = []
customers = 0.0
cum_cash = cfg["start_capital"]
for t in range(1, cfg["months"] + 1):
new_cust = cfg["new_cust_base"] * ((1 + cfg["new_cust_growth"]) ** (t - 1))
customers = customers * (1 - cfg["monthly_churn"]) + new_cust
revenue = customers * cfg["arpu_month"]
var_cost = revenue * (1 - cfg["gross_margin"])
gross_profit = revenue - var_cost
cac_spend = new_cust * cfg["cac"]
fixed = cfg["fixed_cost_month"]
net_cf = gross_profit - fixed - cac_spend
cum_cash += net_cf
rows.append({
"月份": t,
"新增客户": round(new_cust, 1),
"月末客户数": round(customers, 1),
"月收入": round(revenue, 0),
"毛利": round(gross_profit, 0),
"固定成本": fixed,
"获客支出": round(cac_spend, 0),
"月净现金流": round(net_cf, 0),
"累计现金流": round(cum_cash, 0),
})
return pd.DataFrame(rows)
def main():
cfg = CONFIG
df = build_model(cfg)
# 月度盈利:月净现金流首次为正
profit_month = df[df["月净现金流"] > 0]["月份"].min()
# 盈亏平衡(累计现金流转正)
be_row = df[df["累计现金流"] >= cfg["start_capital"]]
be_month = be_row["月份"].min() if not be_row.empty else None
total_cac_spend = df["获客支出"].sum()
total_new = df["新增客户"].sum()
cac_calc = total_cac_spend / total_new
# LTV:订阅口径 = 客单价 x 毛利率 / 月流失率
ltv = cfg["arpu_month"] * cfg["gross_margin"] / cfg["monthly_churn"]
ltv_cac = ltv / cfg["cac"]
payback_months = cfg["cac"] / (cfg["arpu_month"] * cfg["gross_margin"])
pd.set_option("display.max_rows", 40)
pd.set_option("display.width", 200)
pd.set_option("display.unicode.east_asian_width", True)
print("===== 月度表现(每3个月抽样) =====")
print(df.iloc[::3].to_string(index=False))
print()
print("===== 关键指标 =====")
print(f"月度盈利月份(月净现金流首次为正): 第 {profit_month} 个月")
print(f"盈亏平衡月份(累计现金流回到起始资金之上): "
f"{'第 %d 个月' % be_month if be_month else '36个月内未回正'}")
print(f"CAC(获客成本,交叉校验): {cac_calc:.0f} 元/人")
print(f"LTV(客户生命周期价值,订阅口径): {ltv:.0f} 元")
print(f"LTV/CAC: {ltv_cac:.1f}")
print(f"获客回本周期: {payback_months:.2f} 个月")
print(f"第36个月月末客户数: {df.iloc[-1]['月末客户数']:.0f} 人")
print(f"第36个月月收入: {df.iloc[-1]['月收入']:.0f} 元")
print(f"第36个月累计现金流: {df.iloc[-1]['累计现金流']:.0f} 元")
print(f"起始资金安全垫低点: 第 {df['累计现金流'].idxmin()+1} 个月,"
f"低点 {df['累计现金流'].min():.0f} 元")
if __name__ == "__main__":
main()
实跑结果:这些数字怎么读
上面脚本在本机(Python 3.13.13 / pandas 3.0.6)实际运行输出如下:
text
===== 月度表现(每3个月抽样) =====
月份 新增客户 月末客户数 月收入 毛利 固定成本 获客支出 月净现金流 累计现金流
1 25.0 25.0 7500.0 4500.0 40000 7500.0 -43000.0 257000.0
4 35.1 107.1 32142.0 19285.0 40000 10537.0 -31252.0 151211.0
7 49.3 206.6 61981.0 37189.0 40000 14804.0 -17615.0 84168.0
10 69.3 333.9 100180.0 60108.0 40000 20798.0 -690.0 64261.0
13 97.4 503.2 150947.0 90568.0 40000 29220.0 21348.0 104888.0
16 136.8 733.4 220013.0 132008.0 40000 41052.0 50956.0 226136.0
19 192.2 1051.0 315287.0 189172.0 40000 57675.0 91498.0 457202.0
22 270.1 1492.6 447773.0 268664.0 40000 81029.0 147635.0 839871.0
25 379.5 2109.5 632839.0 379703.0 40000 113840.0 225864.0 1433439.0
28 533.1 2973.4 892013.0 535208.0 40000 159937.0 335271.0 2321678.0
31 749.0 4185.0 1255489.0 753293.0 40000 224699.0 488594.0 3622641.0
34 1052.3 5885.5 1765642.0 1059385.0 40000 315687.0 703699.0 5502465.0
===== 关键指标 =====
月度盈利月份(月净现金流首次为正): 第 11 个月
盈亏平衡月份(累计现金流回到起始资金之上): 第 18 个月
CAC(获客成本,交叉校验): 300 元/人
LTV(客户生命周期价值,订阅口径): 2250 元
LTV/CAC: 7.5
获客回本周期: 1.67 个月
第36个月月末客户数: 7386 人
第36个月月收入: 2215720 元
第36个月累计现金流: 7189107 元
起始资金安全垫低点: 第 10 个月,低点 64261 元
这组数字里有三个点值得拆开看。
一是月度盈利和累计回本是两回事。这个模型里第11个月单月净现金流转正,但累计现金流要到第18个月才回到起始资金之上------前面亏的钱要慢慢补。BP里说"盈亏平衡"时,一定要说清指的是哪一个。
二是安全垫低点在第10个月,账上只剩6.4万元,离30万起始资金已经烧掉近八成。这是模型给出的重要预警:如果真实增速达不到假设,或者获客成本比预期高,现金链可能在盈利之前就断。融资额要按这个低点再加缓冲来估,而不是按"平均每月亏多少"来估。
三是单位经济指标。LTV/CAC等于7.5,获客回本1.67个月,听着很漂亮------但这组数字好,是因为示例参数里CAC压得低、流失率压得低。行业经验值一般认为LTV/CAC大于3、获客回本小于12个月比较健康,注意这是经验区间不是保证,自己项目的数字要用真实投放数据替换。
每个参数怎么按自己项目调
脚本的价值不在示例数字,在于参数换了马上能重算。调参顺序建议这样:
- 客单价arpu_month:用你真实或试定价的月费,别拍脑袋;一次性买断的项目,把客单价摊到预估生命周期里。
- 毛利率gross_margin:扣除服务器、支付通道、客户服务这些跟着收入走的成本;固定的工资房租不算在这里。
- 月新增客户与增速:没有投放数据前,先从你能触达的渠道容量倒推,比如社群多少人、转化率多少。
- CAC:拿真实投放测试的钱除以真实新增客户,没有测试就先按悲观值填。
- 月流失率:订阅项目生死线,早期没数据就参考同品类公开口径,再打个折。
- 固定成本:把工资、社保、服务器、房租全列进去,别漏。
调完之后看两个数的敏感性:把流失率从8%改成12%,把CAC从300改成450,盈亏平衡点各推迟到第几个月?这个测试比单点预测有用得多,也是投资人常问的"如果......怎么办"。
手动过一遍方向:月流失率从8%抬到12%,客户池漏得更快,LTV从2250元落到1500元上下,月度盈利大概往后推两三个月,累计回本月滑到20个月以后;CAC从300涨到450,前期每月净现金流更难看,安全垫低点会探到4万元附近,跑道紧出一个多月。这就是为什么BP里要摆三档而不是一个数------投资人心里算的,往往就是你不敢摆出来的那档。
拿给投资人讲时,重点是三个数。一是安全垫低点6.4万元出现在第10个月,它决定起始资金不能只按月亏额乘跑道来估,要按低点加三到六个月缓冲,融资额据此上浮;二是月度盈利第11个月、累计回本第18个月,对应讲跑道和资金用途;三是LTV/CAC等于7.5听着好,但它建立在流失率8%的假设上,投放一加速CAC就涨,别拿着漂亮比值盲目扩渠道。三句讲明白,比把36行表格从头念一遍管用,剩下的数字投资人自己会翻附表。
模型的边界
这套脚本是早期BP用的简化模型,几个边界要清楚:它按单产品线算,多产品线要拆开建;没有考虑税收、账期和应收应付,做正式融资材料要让财务补上;新增客户按固定环比增长是理想化假设,真实增长会有平台期和波动。BP里用它展示逻辑和量级没问题,拿它当会计报表用就越界了。
行动清单
- 装好pandas,把脚本原样跑一遍确认环境没问题
- 按自己项目的真实参数替换CONFIG字典
- 先跑中性假设,再跑保守和乐观两档
- 重点看累计现金流低点,按低点加缓冲估融资额
- 对流失率和CAC做敏感性测试
- BP里写清"月度盈利"和"累计回本"分别是哪个月
- 单位经济指标标注为经验口径,承诺回款用真实数据
常见问题
Q:LTV公式为什么是客单价除以流失率? A:订阅口径下,客户平均停留时长约等于1/月流失率,比如月流失8%意味着平均留12.5个月,乘以每月贡献的毛利就是LTV。这是简化算法,没算资金时间价值,早期BP够用。
Q:模型算出来36个月赚70万,能信吗? A:这个数字完全由你填的参数决定,参数是假设,结果就是假设的镜子。BP里要展示的是参数逻辑和敏感性,不是终局预测。
Q:非订阅制项目(比如一次性卖软件)怎么改? A:把月流失率改成复购率,LTV改成客单价乘以预估付费次数,新增客户模型保留,成本结构按你的实际情况改固定和变动划分。
工具与参考
搭参数时,客单价、毛利率、成本率这类行业参考区间,可以在五网搜索页(so.5ol.com/)检索可行性研究报告和...
数据与来源说明
本文财务模型为通用SaaS口径的简化示例,所有数字来自文中脚本在示例参数下的实跑结果,不代表任何真实项目业绩;文中提到的LTV/CAC参考区间、回本周期等为行业经验值,不构成投资建议。五网相关描述来源于五网官网公开介绍,资料使用请核对原始数据。