投资回报 ROI / IRR / NPV
现金流(每行一个数,t=0 为初始投资,通常为负数)
贴现率 % (NPV 用)
投资回报/内部收益率/净现值
现金流(每行一个数,t=0 为初始投资,通常为负数)
贴现率 % (NPV 用)
· ROI(投资回报率)= (总回报 − 总投入) / 总投入
· NPV(净现值)= Σ CF_t / (1 + r)^t · 大于 0 = 项目可行
· IRR(内部收益率)= 使 NPV = 0 的贴现率 · IRR > 资金成本则可行
· 回本期:累计现金流转正的年份
了解工具定位 · 使用场景 · 对比优势
输入初始投资额、每期现金流和折现率,一键计算投资回报率(ROI)、内部收益率(IRR)和净现值(NPV),并对比三个指标的结果差异。创业者评估项目可行性、投资者比较不同标的、财务人员做预算决策时,直接填入数字即可。所有计算在浏览器内完成,数据不上传服务器。
工厂需要采购一条产线,方案 A 投入 200 万、年净现金流 80 万持续 5 年;方案 B 投入 300 万、年净现金流 110 万持续 7 年。单看回收期 A 更短,但 NPV 和 IRR 能考虑资金时间价值。本工具输入两套方案的期初投入与各期现金流,直接输出 NPV 与 IRR 对比,帮采购经理判断哪个方案真正跑赢融资成本。
加盟一家奶茶店,加盟费 30 万、装修设备 20 万,预估前三年每年净利 25 万、第四年起因竞争下滑至 15 万。本工具把 5 年现金流输入,计算 IRR 是否高于银行理财或同行平均水平。如果 IRR 低于 10%,说明这笔钱投定期存款可能更稳妥。
买一套老房花 50 万翻新,持有 3 年卖出预计售价 120 万,但每年物业费 / 税费 / 空置成本合计 3 万。本工具把买入成本、翻新支出、持有期现金流、最终售价全部输入,算出 NPV(贴现率用同期房贷利率 4.5%)和 IRR。若 NPV > 0 且 IRR > 4.5%,说明这笔生意跑赢持有现金。
花 20 万读一个在职 MBA,毕业后预期每年涨薪 5 万持续 10 年。本工具输入学费支出(首年)与未来 10 年的增量现金流,计算 IRR 是否超过同期教育贷款利率(约 6%)。如果 IRR 只有 4%,说明这笔教育投资的回报可能不如提前还贷。
工厂计划投入 100 万升级自动化设备,预计每年节省人工成本 30 万,但设备 5 年后残值仅 10 万。本工具输入期初投资、每年节省的现金流、残值,用 IRR 与公司资本成本(如 8%)对比。若 IRR > 8%,技术改造可立项;否则资金应优先用于其他项目。
| 维度 | 本工具 | Excel (IRR/XIRR/NPV 函数) | 财务计算器 (HP 12C 等) |
|---|---|---|---|
| 数据隐私 | 纯浏览器计算,数据不上传服务器 | 文件保存在本地,但需注意宏安全设置 | 完全离线,无数据外泄风险 |
| 处理速度 | 输入即出,毫秒级响应 | 需手动输入公式、拖动填充,秒级计算 | 按键输入,计算速度取决于熟练度,秒级 |
| 操作门槛 | 无公式记忆,填写字段即可 | 需掌握 IRR/XIRR/NPV 函数语法及参数顺序 | 需熟悉 RPN 或代数输入逻辑及财务键位 |
| 现金流频率 | 支持等间隔 (年/月) 与不等间隔 (日期) | IRR 要求等间隔;XIRR 支持不等间隔 | 基础型号仅支持等间隔现金流 |
| 结果精度 | 浮点数计算,小数点后 6 位 | 受 Excel 迭代计算设置影响,默认精度有限 | 内置算法,精度受限于设备位数 |
| 多方案对比 | 单次计算一个方案,需手动记录对比 | 可建立多列模型,公式自动联动,对比方便 | 需手动记录或切换寄存器,对比繁琐 |
| 平台依赖 | 任何浏览器,无需安装 | 需安装 Microsoft Excel 或兼容软件 | 需购买专用硬件设备 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 初始投资: 100000, 年现金流: [30000, 30000, 30000, 30000, 30000] | ROI: 50% | IRR: 15.24% | NPV(10%): 13723.6 | 典型场景:5年等额回本,正NPV说明项目可行 |
| 初始投资: 50000, 年现金流: [10000, 20000, 30000] | ROI: 20% | IRR: 19.44% | NPV(10%): -1748.9 | 典型场景:递增现金流,ROI为正但NPV为负 |
| 初始投资: 10000, 年现金流: [2000, 2000, 2000, 2000, 2000] | ROI: 0% | IRR: 0% | NPV(10%): -2418.4 | 边界case:刚好回本(总现金=初始投资) |
| 初始投资: 100000, 年现金流: [50000, -20000, 80000] | ROI: 10% | IRR: 8.72% | NPV(10%): -4245.3 | 边界case:现金流含负值(亏损年份) |
| 初始投资: 0, 年现金流: [1000, 1000, 1000] | ROI: ∞ | IRR: 无穷大 | NPV(10%): 2486.9 | 边界case:零初始投资,ROI无意义 |
| 初始投资: 100000, 年现金流: [100000] | ROI: 0% | IRR: 0% | NPV(10%): -9090.9 | 易错case:1年回本,用户常误以为IRR=100% |
| 初始投资: 100000, 年现金流: [0, 0, 0, 0, 150000] | ROI: 50% | IRR: 8.45% | NPV(10%): -6857.6 | 易错case:前期无收益,NPV可能为负 |
初始投资 10000,后续每年收回 3000,全部填正数初始投资填 -10000(现金流出),后续每年收回填 +3000(现金流入)NPV/IRR 公式要求现金流出用负号、流入用正号;符号反了会算出荒谬结果(如 IRR 为负值或 NPV 被低估)
年利率 5%,IRR 填 5%IRR 是使 NPV=0 的折现率,与名义年利率不同;需输入实际现金流序列让工具计算IRR 是求解出的隐含收益率,不是输入的参数;用户常把借款利率或存款利率误填为 IRR
5 年项目只输入 4 笔现金流期初(第 0 期)投资 + 第 1-5 年每年现金流 = 共 6 个时间点NPV/IRR 按时间序列逐期计算;遗漏第 0 期或末尾期会导致折现基准偏移,结果偏差可达 20%+
第 2 年无现金流,留空或填 0 但跳过该行第 2 年无现金流必须填 0,且保持时间序列连续工具按行号顺序计算,跳过行相当于压缩了时间轴,导致 IRR 高估(实际资金占用时间更长)
年现金流 + 月折现率 1%年现金流对应年折现率;月现金流对应月折现率(年/12)NPV 公式要求现金流周期与折现率周期严格匹配;混用会导致折现因子错误,NPV 偏差可达数倍
3 年回本,IRR 就是 33%IRR 需输入具体现金流序列计算,与回本年限无直接换算关系回本年限是静态指标,IRR 考虑资金时间价值;同样 3 年回本的项目,前期回款多的 IRR 更高
投资金额 9999999999999999(16 位以上整数)金额控制在 10^12 以内(万亿级),或使用科学计数法前确认工具支持JavaScript Number 安全整数范围约 9e15,超出后浮点精度丢失,IRR 迭代计算可能不收敛
项目有正负交替现金流,直接取工具算出的唯一 IRR检查现金流符号变化次数:变化 >1 次时可能存在多个 IRR,应参考 NPV 曲线笛卡尔符号法则:现金流符号每变化一次可能多一个实根;工具默认返回第一个解,可能不是经济含义上的那个
公式推导 · 流程图解 · 依据出处
NPV = Σ (CF_t / (1 + r)^t) - I_0
NPV — 净现值(元)CF_t — 第 t 期现金流入(元)r — 折现率(小数形式)t — 期数(年或月)I_0 — 初始投资额(元)初始投资 100 万元,第 1 年回收 30 万,第 2 年回收 50 万,第 3 年回收 60 万,折现率 10%。则 NPV = 30/(1.1)^1 + 50/(1.1)^2 + 60/(1.1)^3 - 100 = 27.27 + 41.32 + 45.08 - 100 = 13.67 万元。NPV > 0,项目可行。
适用于常规项目投资决策,要求各期现金流独立且折现率恒定。不适用于现金流符号多次变化(此时 IRR 可能多解)或折现率随时间波动的情形。公式基于标准财务学(Brealey & Myers《公司理财》)。
3 种主流语言 · 复制即用
import numpy as np
from numpy_financial import irr, npv
# 现金流:第0年投入-1000,第1-5年每年回收300
cashflows = [-1000, 300, 300, 300, 300, 300]
# 净现值(折现率10%)
npv_value = npv(0.10, cashflows)
print(f"NPV = {npv_value:.2f}") # NPV = 137.24
# 内部收益率
irr_value = irr(cashflows)
print(f"IRR = {irr_value:.4f}") # IRR = 0.1524 (15.24%)
# 投资回报率(简单ROI)
total_return = sum(cashflows[1:])
roi = (total_return - abs(cashflows[0])) / abs(cashflows[0])
print(f"ROI = {roi:.2%}") # ROI = 50.00%package main
import (
"fmt"
"math"
)
// NPV 计算净现值
func NPV(rate float64, cashflows []float64) float64 {
var npv float64
for i, cf := range cashflows {
npv += cf / math.Pow(1+rate, float64(i))
}
return npv
}
// IRR 使用牛顿法计算内部收益率
func IRR(cashflows []float64) float64 {
guess := 0.1
for i := 0; i < 1000; i++ {
npv := NPV(guess, cashflows)
// 导数近似
derivative := (NPV(guess+0.0001, cashflows) - npv) / 0.0001
if math.Abs(derivative) < 1e-12 {
break
}
guess -= npv / derivative
if math.Abs(npv) < 1e-6 {
break
}
}
return guess
}
func main() {
cashflows := []float64{-1000, 300, 300, 300, 300, 300}
// 净现值(折现率10%)
fmt.Printf("NPV = %.2f\n", NPV(0.10, cashflows)) // 137.24
// 内部收益率
fmt.Printf("IRR = %.4f\n", IRR(cashflows)) // 0.1524
// 简单ROI
totalReturn := 0.0
for _, cf := range cashflows[1:] {
totalReturn += cf
}
roi := (totalReturn - math.Abs(cashflows[0])) / math.Abs(cashflows[0])
fmt.Printf("ROI = %.2f%%\n", roi*100) // 50.00%
}// 净现值计算
function npv(rate, cashflows) {
return cashflows.reduce((acc, cf, i) => acc + cf / Math.pow(1 + rate, i), 0);
}
// 内部收益率(牛顿法)
function irr(cashflows) {
let guess = 0.1;
for (let i = 0; i < 1000; i++) {
const npvVal = npv(guess, cashflows);
const derivative = (npv(guess + 0.0001, cashflows) - npvVal) / 0.0001;
if (Math.abs(derivative) < 1e-12) break;
guess -= npvVal / derivative;
if (Math.abs(npvVal) < 1e-6) break;
}
return guess;
}
const cashflows = [-1000, 300, 300, 300, 300, 300];
// 净现值(折现率10%)
console.log(`NPV = ${npv(0.10, cashflows).toFixed(2)}`); // 137.24
// 内部收益率
console.log(`IRR = ${irr(cashflows).toFixed(4)}`); // 0.1524
// 简单ROI
const totalReturn = cashflows.slice(1).reduce((a, b) => a + b, 0);
const roi = (totalReturn - Math.abs(cashflows[0])) / Math.abs(cashflows[0]);
console.log(`ROI = ${(roi * 100).toFixed(2)}%`); // 50.00%7 个高频疑问