加盟店选址对比
加盟连锁品牌前,老王在三个候选铺位间犹豫:A 铺首年租金 30 万、预估月流水 15 万;B 铺租金 20 万、月流水 10 万;C 铺租金 18 万、月流水 8 万。单看月利润似乎接近,但各铺装修投入、合同期限、押金不同。用本工具分别计算三个方案的 IRR,发现 A 铺因 5 年合同期内的租金递增,IRR 反而最低;C 铺虽月利润少,但投资回收期短、IRR 最高。老王据此放弃了 A 铺,避免了 3 年白干的风险。
ROI(投资回报率)=(累计现金流入 − 投入成本)÷ 投入成本。最直观,但忽略「时间价值」——明年的钱不如今天的钱值钱。年化 ROI=(1+ROI)^(1/年数)−1,把总回报摊到每年,便于横比。
NPV(净现值)= Σ CFₜ /(1+r)ᵗ(t 从 0,含初始投资)。把未来每期现金流按折现率 r 折成「今天的钱」再求和。NPV > 0 即在要求回报率下仍有净赚,项目可行;NPV < 0 则不如把钱投到回报率 r 的去处。
IRR(内部收益率)=使 NPV=0 的那个折现率,相当于这笔投资「自身的年回报率」。IRR > 你的要求回报率(资金成本)即可行。本工具用牛顿法 + 二分变号兜底数值求解,并把 IRR 回代验证 NPV≈0。
回收期:累计现金流由负转正的时点,越短风险越低。折现回收期对每期现金流先折现再累计,更严格、更真实。
提示:IRR 在现金流多次变号(先投后收再投)时可能存在多个解或无实数解,此时应以 NPV 为准。本结果仅供投资可行性参考,不构成任何投资建议,实际收益受风险、税费、通胀等影响。
一笔投资投下去,三年后到底赚了多少?只看总回报,时间成本和资金再投资机会都被忽略了。这个工具同时算ROI、IRR和NPV,输入现金流序列就能看到三个维度——投100万、年回30万持续五年,IRR是15.2%,NPV按10%折现率算出来是13.7万。所有计算在浏览器本地完成,数据不上传服务器,适合个人投资者复盘基金定投、创业者评估项目可行性、财务人员快速校验Excel模型。
加盟连锁品牌前,老王在三个候选铺位间犹豫:A 铺首年租金 30 万、预估月流水 15 万;B 铺租金 20 万、月流水 10 万;C 铺租金 18 万、月流水 8 万。单看月利润似乎接近,但各铺装修投入、合同期限、押金不同。用本工具分别计算三个方案的 IRR,发现 A 铺因 5 年合同期内的租金递增,IRR 反而最低;C 铺虽月利润少,但投资回收期短、IRR 最高。老王据此放弃了 A 铺,避免了 3 年白干的风险。
工厂需要一台价值 120 万的数控机床,可用 6 年。财务小张面临两难:直接采购需一次性付清,占用现金;租赁方案每月付 2.8 万,但 6 年总支出 201.6 万,看似更贵。小张用本工具的 NPV 函数,以公司资金成本 8% 为折现率,将租赁的 72 笔月付折现为现值 156 万,再与采购的 120 万对比。NPV 为正说明租赁实际成本更高,且采购后设备残值约 30 万,最终 NPV 差异达 66 万。小张据此写出的分析报告,让老板决定采购而非租赁。
银行理财经理推荐一款年化 4.5% 的 3 年期产品,但要求每年初缴 10 万,到期一次性返还 33 万。老李直觉觉得收益不错,但算不清实际年化。他用本工具将每年初的 10 万支出作为现金流(-10 万、-10 万、-10 万),第 3 年末的 33 万作为流入,计算 IRR 后发现实际年化只有 3.2%,远低于宣传的 4.5%。原因是资金占用时间被前置,IRR 比简单年化低 1.3 个百分点。老李当场放弃了该产品。
创业者阿杰做 BP 时,需要向投资人说明 500 万融资对应 20% 股权的合理性。他预测项目前 3 年每年亏损 200 万、第 4 年盈利 100 万、第 5 年盈利 500 万。用本工具以投资人要求的 30% 回报率计算 NPV,得到项目估值约 2100 万。因此 500 万占 24% 股权是合理区间,而非阿杰最初拍脑袋的 10%。谈判时阿杰直接展示 NPV 计算过程,投资人认可了估值逻辑,顺利签约。
小陈的旧车现在卖能得 8 万,若再开 3 年,预计残值仅 2 万,但期间每年需多花 1.5 万维修保养。他纠结:现在换车要贴 12 万买新车,还是再忍 3 年?用本工具将两种方案未来 3 年的现金流折现比较:旧车方案每年 -1.5 万 + 第 3 年末 +2 万,NPV 为 -2.2 万;新车方案首年 -12 万 + 第 3 年末预估残值 6 万,NPV 为 -7.1 万。结论是旧车再开 3 年的实际成本比换新车低近 5 万,小陈决定暂不换车。
| 维度 | 本工具 | Excel / 手动计算 | 专业投资分析软件 |
|---|---|---|---|
| 计算速度 | 秒级返回结果 | 需手动输入公式或迭代试错 | 需加载项目文件,首次计算较慢 |
| 输入便捷性 | 直接输入现金流序列,自动识别正负 | 需自行设置 IRR 函数参数或手动迭代 | 需定义项目结构、周期、现金流字段 |
| 错误风险 | 自动校验输入合法性,避免公式引用错误 | 公式参数易输错,迭代易陷入死循环 | 配置复杂,参数遗漏或类型错误概率高 |
| 学习成本 | 零门槛,打开即用 | 需掌握 Excel 财务函数或手动迭代方法 | 需学习软件操作逻辑与项目建模 |
| 离线可用 | 纯浏览器运行,无需联网 | 需安装 Office 软件 | 需安装客户端并授权 |
| 适用场景 | 快速估算单项目投资回报 | 适合已熟悉 Excel 的用户进行深度分析 | 多项目组合、敏感性分析等复杂场景 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 初始投资:-10000;第1年现金流:3000;第2年现金流:4000;第3年现金流:5000;贴现率:10% | NPV = 1,083.48;IRR = 18.14%;ROI = 20.00% | 常规:典型正NPV项目,IRR > 贴现率,验证三个指标同步计算逻辑 |
| 初始投资:-5000;第1年现金流:2000;第2年现金流:2000;第3年现金流:2000;贴现率:8% | NPV = 154.32;IRR = 9.70%;ROI = 20.00% | 常规:等额年金型现金流,验证IRR与贴现率接近时的精度 |
| 初始投资:-10000;第1年现金流:-2000;第2年现金流:8000;第3年现金流:6000;贴现率:12% | NPV = -1,056.78;IRR = 无法计算(符号变化超过1次,存在多个IRR或无解) | 边界:现金流符号变化超过一次(正负交替),IRR可能无唯一解,工具应明确提示 |
| 初始投资:0;第1年现金流:1000;第2年现金流:1000;第3年现金流:1000;贴现率:5% | NPV = 2,723.25;IRR = 无穷大(无初始投资);ROI = 无穷大 | 边界:初始投资为0,IRR和ROI数学上无定义,工具需特殊处理(显示无穷或提示错误) |
| 初始投资:-10000;第1年现金流:10000;第2年现金流:0;第3年现金流:0;贴现率:10% | NPV = -909.09;IRR = 0.00%;ROI = 0.00% | 边界:仅有一期正现金流且金额等于初始投资,IRR=0%是精确边界值 |
| 初始投资:-10000;第1年现金流:3000;第2年现金流:3000;第3年现金流:3000;贴现率:-5% | NPV = 19,575.00;IRR = 18.14%;ROI = -10.00% | 易错:贴现率输入为负数(经济衰退场景),NPV会异常大,用户易忽略贴现率符号 |
| 初始投资:-10000;第1年现金流:1000;第2年现金流:2000;第3年现金流:3000;贴现率:15% | NPV = -4,348.76;IRR = 无法计算(所有现金流之和 < 初始投资,IRR无实数解) | 易错:总现金流(6000)小于初始投资(10000),IRR无实数解,工具应明确提示而非报错 |
1.IRR 计算时现金流的正负号搞反
初始投资 10000,后续收益 -2000、-3000、-4000初始投资 -10000,后续收益 2000、3000、4000IRR 是净现值等于零的折现率,现金流必须有正有负才能解。初始投资是现金流出(负值),后续收益是流入(正值),符号反了 IRR 会无解或算出负值。
2.NPV 计算时折现率用了百分比小数混用
年折现率输入 5(实际想表达 5%)年折现率输入 0.05NPV 公式中折现率是小数形式(如 0.05 代表 5%),直接输 5 会被当作 500% 折现,导致 NPV 严重偏负。
3.ROI 计算时把总收益当成了净收益
投入 10000,收回 12000,ROI = 12000 / 10000 = 1.2ROI = (12000 - 10000) / 10000 = 0.2ROI 是净收益除以投资成本,不是总收益除以成本。总收益 12000 减去成本 10000 才是净收益 2000。
4.不同时间点的现金流没有按年对齐
第 1 年投入 10000,第 6 个月收回 3000,第 18 个月收回 5000,直接按年度序列输入将现金流按实际发生时间拆成半年期:第 0 年 -10000,第 0.5 年 3000,第 1.5 年 5000IRR/NPV 要求每期时间间隔相等,默认按年。半年或跨年度的现金流必须换算到对应时间点,否则折现期数错误导致结果偏差。
5.NPV 中把终值残值漏算了
项目 5 年,每年净现金流 5000,设备残值 2000 没算进去第 5 年现金流应为 5000 + 2000 = 7000NPV 评估的是项目全生命周期现金流,设备残值、回收流动资金等终值属于第 N 期现金流的一部分,漏掉会低估项目价值。
6.多个项目比较时用了不同计算期数
项目 A 算 3 年,项目 B 算 5 年,直接比较 NPV统一到相同年限(如取最小公倍数或永续年金法)再比较NPV 受计算期数影响,期数越长 NPV 通常越大。不同年限的项目直接比 NPV 没有意义,必须用等额年成本或永续年金法标准化。
7.ROI 计算时把融资利息也算进投资成本
项目投资 100万,贷款利息 10万,ROI 分母用 110万ROI 分母只用自有资金投入 100万,利息在分子净收益中已体现ROI 衡量的是投资效率,利息是融资成本,应体现在净收益(分子)里,而不是重复计入投资成本(分母)。
NPV = Σ_{t=0}^{n} CF_t / (1 + r)^t
CF_t第 t 期的现金流(正为收入,负为支出)r折现率(如 0.1 表示 10%)t期数,从 0(初始投资)到 nn总期数初始投资 100 万元(CF₀ = -100),第 1 年回收 30 万(CF₁ = 30),第 2 年回收 50 万(CF₂ = 50),第 3 年回收 60 万(CF₃ = 60),折现率 10%(r = 0.1)。NPV = -100 + 30/(1.1)¹ + 50/(1.1)² + 60/(1.1)³ = -100 + 27.27 + 41.32 + 45.08 = 13.67 万元。NPV > 0,项目可行。
5 种主流语言实现,复制即用:
import numpy_financial as npf
# 示例:投资 -1000,第1-5年每年回收 300
cashflows = [-1000, 300, 300, 300, 300, 300]
npv = npf.npv(rate=0.1, values=cashflows) # 折现率 10%
irr = npf.irr(cashflows)
roi = (sum(cashflows[1:]) + cashflows[0]) / abs(cashflows[0]) * 100
print(f"NPV: {npv:.2f}") # 输出: NPV: 137.24
print(f"IRR: {irr:.4%}") # 输出: IRR: 15.24%
print(f"ROI: {roi:.2f}%") # 输出: ROI: 50.00%// 使用 financial 库(npm install financial)
const { npv, irr } = require('financial');
const cashflows = [-1000, 300, 300, 300, 300, 300];
const rate = 0.1;
const npvResult = npv(rate, ...cashflows);
const irrResult = irr(...cashflows);
const roi = ((cashflows.slice(1).reduce((a,b)=>a+b,0) + cashflows[0]) / Math.abs(cashflows[0])) * 100;
console.log(`NPV: ${npvResult.toFixed(2)}`); // NPV: 137.24
console.log(`IRR: ${(irrResult * 100).toFixed(2)}%`); // IRR: 15.24%
console.log(`ROI: ${roi.toFixed(2)}%`); // ROI: 50.00%package main
import (
"fmt"
"math"
)
// 简单 IRR 求解(牛顿法)
func irr(cashflows []float64) float64 {
rate := 0.1
for i := 0; i < 1000; i++ {
npv := 0.0
npvDeriv := 0.0
for t, cf := range cashflows {
npv += cf / math.Pow(1+rate, float64(t))
npvDeriv -= float64(t) * cf / math.Pow(1+rate, float64(t+1))
}
if math.Abs(npv) < 1e-7 {
break
}
rate -= npv / npvDeriv
}
return rate
}
func main() {
cashflows := []float64{-1000, 300, 300, 300, 300, 300}
rate := 0.1
// NPV
npv := 0.0
for t, cf := range cashflows {
npv += cf / math.Pow(1+rate, float64(t))
}
// IRR
irrRate := irr(cashflows)
// ROI
totalIn := 0.0
for _, cf := range cashflows[1:] {
totalIn += cf
}
roi := (totalIn + cashflows[0]) / math.Abs(cashflows[0]) * 100
fmt.Printf("NPV: %.2f\n", npv) // NPV: 137.24
fmt.Printf("IRR: %.2f%%\n", irrRate*100) // IRR: 15.24%
fmt.Printf("ROI: %.2f%%\n", roi) // ROI: 50.00%
}#!/bin/bash
# 依赖:python3 + numpy-financial
# 安装:pip install numpy-financial
python3 << 'EOF'
import numpy_financial as npf
cashflows = [-1000, 300, 300, 300, 300, 300]
rate = 0.1
npv = npf.npv(rate, cashflows)
irr = npf.irr(cashflows)
roi = (sum(cashflows[1:]) + cashflows[0]) / abs(cashflows[0]) * 100
print(f"NPV: {npv:.2f}")
print(f"IRR: {irr:.4%}")
print(f"ROI: {roi:.2f}%")
EOF// 依赖:无外部库,纯 Rust 实现
fn npv(rate: f64, cashflows: &[f64]) -> f64 {
cashflows.iter().enumerate().map(|(t, cf)| {
cf / (1.0 + rate).powi(t as i32)
}).sum()
}
fn irr(cashflows: &[f64]) -> f64 {
let mut rate = 0.1;
for _ in 0..1000 {
let npv: f64 = cashflows.iter().enumerate().map(|(t, cf)| {
cf / (1.0 + rate).powi(t as i32)
}).sum();
let npv_deriv: f64 = cashflows.iter().enumerate().map(|(t, cf)| {
-t as f64 * cf / (1.0 + rate).powi(t as i32 + 1)
}).sum();
if npv.abs() < 1e-7 { break; }
rate -= npv / npv_deriv;
}
rate
}
fn main() {
let cashflows = vec![-1000.0, 300.0, 300.0, 300.0, 300.0, 300.0];
let rate = 0.1;
let npv_val = npv(rate, &cashflows);
let irr_val = irr(&cashflows);
let roi = (cashflows[1..].iter().sum::<f64>() + cashflows[0]) / cashflows[0].abs() * 100.0;
println!("NPV: {:.2}", npv_val); // NPV: 137.24
println!("IRR: {:.2}%", irr_val * 100.0); // IRR: 15.24%
println!("ROI: {:.2}%", roi); // ROI: 50.00%
}IRR(内部收益率)计算的是项目周期内的现金流回报率,结果默认是“整个周期”的收益率,不一定是年化。如果现金流是逐年发生,那结果就是年化;如果是按月、按季,则需要将结果换算为年化(比如月 IRR 乘以 12 或使用 (1+月IRR)^12-1 公式)。市面上理财产品年化通常假设复利并按 365 天计,而本工具 IRR 按输入的时间间隔计算,不做自动年化换算,两者口径不同时数字自然对不上。
NPV 为负只说明按你输入的折现率(通常是最低期望回报率)计算,未来现金流折现后不足以覆盖初始投入,不代表项目本身亏钱。比如你设折现率 15%,NPV 为负,但项目实际回报率可能是 10%,比存银行高但没达到你的门槛。建议同时看 IRR:如果 IRR 仍高于资金成本或同期无风险利率(如国债),项目仍有相对价值,只是未达预期。
可以,但需要把每笔投入作为独立的负现金流,按实际发生时间填入。比如每月 1 号投 1 万,共 12 笔,最后第 13 个月收回 15 万。输入时日期列对应每笔实际日期,金额列填 -10000(12 行),最后一行填 +150000。工具按时间序列计算 IRR 和 NPV,不支持“一次性输入总额再自动分摊”的模式,需要手动列出每笔。
差异通常来自两个原因:一是 Excel 的 IRR 函数要求现金流必须等间隔(如每年一次),如果间隔不均,Excel 算的是“名义 IRR”,而本工具按实际天数计算,结果更精确。二是 Excel 默认迭代上限 20 次,如果现金流符号变化多、解不唯一,Excel 可能只返回第一个解或报 #NUM!,本工具采用不同算法处理多解情况。建议对比时用相同的现金流序列和 Excel 的 XIRR 函数(支持不等间隔),两者结果应一致。
如果每月定投金额小、最终回收金额大,且时间跨度短(比如投 6 个月、第 7 个月翻倍回收),IRR 会非常高。这是因为 IRR 本质是“资金占用效率”,小额资金在短时间内的翻倍,换算成年化确实惊人。这种情况属于真实收益率,但需注意:IRR 高不代表风险低或可持续,建议结合 NPV 和投资周期综合判断。如果觉得数字不合理,检查最终回收金额是否输入正确,或尝试延长投资周期再看。
完全不需要联网。本工具是纯前端实现(FE),所有计算都在浏览器本地完成,数据不会离开设备。即使断网也可以正常使用,刷新页面后输入数据会丢失(因为未保存到服务器)。适合处理敏感的投资数据,无需担心隐私泄露。
目前工具一次只能输入一组现金流,不支持多方案并列对比。如果需要比较两个方案,建议分别计算后自行对比结果。对于 NPV,注意两个方案的折现率要设相同才有可比性;对于 IRR,优先选 IRR 高的方案,但如果现金流规模差异大,建议结合 NPV 绝对值判断(IRR 高但 NPV 小的方案不一定更好)。
IRR 要求现金流序列中至少有一个正数和一个负数,否则无法计算(因为 IRR 本质是找到使 NPV=0 的折现率)。如果所有现金流都是正数(比如只有收入没有投资),IRR 不存在。请检查第一笔是否为负数(代表初始投资),或者中间是否有负数现金流(代表追加投入)。如果确实只有收入没有支出,IRR 无意义,此时只看 ROI(总收益/总投入)即可。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。