计算工具 · 投资理财

投资 ROI/IRR/NPV

投资回报/内部收益率/净现值

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 60 次使用
投资分析 · ROI / IRR / NPV
现金流序列流出为负 · 流入为正
折现率 / 要求回报率10%
% /期
每期周期影响年化口径
场景预设点击套用
编辑现金流与折现率即时计算 ROI / NPV / IRR · 全程本地运算不上传
三大指标,一次看懂一笔投资值不值

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 为准。本结果仅供投资可行性参考,不构成任何投资建议,实际收益受风险、税费、通胀等影响。

第一节

关于本工具

About

一笔投资投下去,三年后到底赚了多少?只看总回报,时间成本和资金再投资机会都被忽略了。这个工具同时算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 年白干的风险。

设备采购 vs 租赁

工厂需要一台价值 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 的用户进行深度分析多项目组合、敏感性分析等复杂场景
第二节

使用指南

Getting Started

使用步骤

  1. 1在「初始投资」框输入投入金额,如 -100000(负号表示现金流出),输入后自动校验数值格式
  2. 2在「每年现金流」框按时间顺序输入各期净收入,如 30000, 40000, 50000,每行一个值,回车换行
  3. 3点击「计算」按钮,结果区同时显示 ROI(百分比)、IRR(百分比)和 NPV(金额),三值联动更新
  4. 4鼠标悬停任一结果旁的「?」图标,弹出该指标的计算公式与适用条件说明
  5. 5点击「重置」清空所有输入框与结果,重新开始一组新计算

输入输出示例

输入输出说明
初始投资:-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、4000

IRR 是净现值等于零的折现率,现金流必须有正有负才能解。初始投资是现金流出(负值),后续收益是流入(正值),符号反了 IRR 会无解或算出负值。

2.NPV 计算时折现率用了百分比小数混用

✗ 错误年折现率输入 5(实际想表达 5%)
✓ 修复年折现率输入 0.05

NPV 公式中折现率是小数形式(如 0.05 代表 5%),直接输 5 会被当作 500% 折现,导致 NPV 严重偏负。

3.ROI 计算时把总收益当成了净收益

✗ 错误投入 10000,收回 12000,ROI = 12000 / 10000 = 1.2
✓ 修复ROI = (12000 - 10000) / 10000 = 0.2

ROI 是净收益除以投资成本,不是总收益除以成本。总收益 12000 减去成本 10000 才是净收益 2000。

4.不同时间点的现金流没有按年对齐

✗ 错误第 1 年投入 10000,第 6 个月收回 3000,第 18 个月收回 5000,直接按年度序列输入
✓ 修复将现金流按实际发生时间拆成半年期:第 0 年 -10000,第 0.5 年 3000,第 1.5 年 5000

IRR/NPV 要求每期时间间隔相等,默认按年。半年或跨年度的现金流必须换算到对应时间点,否则折现期数错误导致结果偏差。

5.NPV 中把终值残值漏算了

✗ 错误项目 5 年,每年净现金流 5000,设备残值 2000 没算进去
✓ 修复第 5 年现金流应为 5000 + 2000 = 7000

NPV 评估的是项目全生命周期现金流,设备残值、回收流动资金等终值属于第 N 期现金流的一部分,漏掉会低估项目价值。

6.多个项目比较时用了不同计算期数

✗ 错误项目 A 算 3 年,项目 B 算 5 年,直接比较 NPV
✓ 修复统一到相同年限(如取最小公倍数或永续年金法)再比较

NPV 受计算期数影响,期数越长 NPV 通常越大。不同年限的项目直接比 NPV 没有意义,必须用等额年成本或永续年金法标准化。

7.ROI 计算时把融资利息也算进投资成本

✗ 错误项目投资 100万,贷款利息 10万,ROI 分母用 110万
✓ 修复ROI 分母只用自有资金投入 100万,利息在分子净收益中已体现

ROI 衡量的是投资效率,利息是融资成本,应体现在净收益(分子)里,而不是重复计入投资成本(分母)。

第三节

工作原理

How It Works

核心公式

NPV = Σ_{t=0}^{n} CF_t / (1 + r)^t

变量说明

  • CF_t第 t 期的现金流(正为收入,负为支出)
  • r折现率(如 0.1 表示 10%)
  • t期数,从 0(初始投资)到 n
  • n总期数

示例

初始投资 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,项目可行。

输入现金流(期初投入 + 各期净流入)输入折现率 / 目标收益率(年化百分比)本地迭代求解• IRR:牛顿法逼近净现值为零• NPV:按公式逐期折现求和• ROI:总收益 / 总成本(纯浏览器端,无网络请求)输出结果• IRR(内部收益率)• NPV(净现值)• ROI(投资回报率)• 盈亏判断
用户输入 本地处理 输出结果
第四节

开发者集成

For Developers

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% }
第五节

常见问题

Q & A
算出来的 IRR 是年化收益率吗?怎么和理财产品的年化收益对不上?

IRR(内部收益率)计算的是项目周期内的现金流回报率,结果默认是“整个周期”的收益率,不一定是年化。如果现金流是逐年发生,那结果就是年化;如果是按月、按季,则需要将结果换算为年化(比如月 IRR 乘以 12 或使用 (1+月IRR)^12-1 公式)。市面上理财产品年化通常假设复利并按 365 天计,而本工具 IRR 按输入的时间间隔计算,不做自动年化换算,两者口径不同时数字自然对不上。

NPV 算出来是负数,是不是这个项目绝对不能投?

NPV 为负只说明按你输入的折现率(通常是最低期望回报率)计算,未来现金流折现后不足以覆盖初始投入,不代表项目本身亏钱。比如你设折现率 15%,NPV 为负,但项目实际回报率可能是 10%,比存银行高但没达到你的门槛。建议同时看 IRR:如果 IRR 仍高于资金成本或同期无风险利率(如国债),项目仍有相对价值,只是未达预期。

我有一笔钱分 12 个月投进去,最后一次性收回,这个工具能算吗?

可以,但需要把每笔投入作为独立的负现金流,按实际发生时间填入。比如每月 1 号投 1 万,共 12 笔,最后第 13 个月收回 15 万。输入时日期列对应每笔实际日期,金额列填 -10000(12 行),最后一行填 +150000。工具按时间序列计算 IRR 和 NPV,不支持“一次性输入总额再自动分摊”的模式,需要手动列出每笔。

为什么我算的 IRR 和 Excel 里 IRR 公式结果不一样?

差异通常来自两个原因:一是 Excel 的 IRR 函数要求现金流必须等间隔(如每年一次),如果间隔不均,Excel 算的是“名义 IRR”,而本工具按实际天数计算,结果更精确。二是 Excel 默认迭代上限 20 次,如果现金流符号变化多、解不唯一,Excel 可能只返回第一个解或报 #NUM!,本工具采用不同算法处理多解情况。建议对比时用相同的现金流序列和 Excel 的 XIRR 函数(支持不等间隔),两者结果应一致。

我输入的是每月定投的金额,但算出来的 IRR 特别高,是不是算错了?

如果每月定投金额小、最终回收金额大,且时间跨度短(比如投 6 个月、第 7 个月翻倍回收),IRR 会非常高。这是因为 IRR 本质是“资金占用效率”,小额资金在短时间内的翻倍,换算成年化确实惊人。这种情况属于真实收益率,但需注意:IRR 高不代表风险低或可持续,建议结合 NPV 和投资周期综合判断。如果觉得数字不合理,检查最终回收金额是否输入正确,或尝试延长投资周期再看。

这个工具要联网吗?我的数据会不会上传到服务器?

完全不需要联网。本工具是纯前端实现(FE),所有计算都在浏览器本地完成,数据不会离开设备。即使断网也可以正常使用,刷新页面后输入数据会丢失(因为未保存到服务器)。适合处理敏感的投资数据,无需担心隐私泄露。

可以同时比较多个投资方案的 ROI/IRR/NPV 吗?

目前工具一次只能输入一组现金流,不支持多方案并列对比。如果需要比较两个方案,建议分别计算后自行对比结果。对于 NPV,注意两个方案的折现率要设相同才有可比性;对于 IRR,优先选 IRR 高的方案,但如果现金流规模差异大,建议结合 NPV 绝对值判断(IRR 高但 NPV 小的方案不一定更好)。

为什么我输入了正数现金流,结果 IRR 显示错误或 #NUM!?

IRR 要求现金流序列中至少有一个正数和一个负数,否则无法计算(因为 IRR 本质是找到使 NPV=0 的折现率)。如果所有现金流都是正数(比如只有收入没有投资),IRR 不存在。请检查第一笔是否为负数(代表初始投资),或者中间是否有负数现金流(代表追加投入)。如果确实只有收入没有支出,IRR 无意义,此时只看 ROI(总收益/总投入)即可。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭