IRR 内部收益率计算器

使用牛顿迭代法求解IRR,显示各期现金流和NPV曲线

现金流输入
各期现金流(元)
计算结果

NPV曲线图(NPV vs 折现率)

let periodCount = 5; function initTable(){ const defaults=[-500000,120000,150000,180000,200000,250000]; let html='时期(t)现金流 CFₜ (元)说明操作'; for(let i=0;i<=periodCount;i++){ html+=`t=${i}${i===0?'':''}`; } document.getElementById('cfTable').innerHTML = html; } function addPeriod(){ periodCount++; const tbody=document.getElementById('cfTable'); const row=document.createElement('tr'); row.id='row'+periodCount; row.innerHTML=`t=${periodCount}`; tbody.appendChild(row); } function removePeriod(n){ const row=document.getElementById('row'+n); if(row) row.remove(); } function loadExample(){ periodCount=6; initTable(); } // 牛顿法求IRR,返回 {irr, iterations, converged, history} function findIRRDetail(cfs){ if(cfs.length<2) return null; // 先检查符号变化 let neg=0,pos=0; cfs.forEach(c=>{if(c<0)neg++;if(c>0)pos++;}); if(neg===0||pos===0) return null; let rate=0.1; const history=[]; for(let iter=0;iter<200;iter++){ let npv=0,dnpv=0; for(let i=0;i50) rate=50; } return {irr:rate*100,iterations:history.length,history}; } function calcNPV(cfs,r){ let npv=0; for(let i=0;i
${irr.toFixed(4)}%
内部收益率 IRR
${result.iterations}
迭代次数
${cfs.length}
现金流期数
`; // 判断 const irrVal = irr; let verdictHTML=''; if(irrVal > 30) verdictHTML=`🔥 IRR=${irr.toFixed(2)}% 极高收益率,项目极具吸引力!`; else if(irrVal > 15) verdictHTML=`✅ IRR=${irr.toFixed(2)}% 高于市场平均回报,项目值得考虑。`; else if(irrVal > 5) verdictHTML=`📊 IRR=${irr.toFixed(2)}% 中等收益水平,需结合风险和机会成本评估。`; else if(irrVal > 0) verdictHTML={`⚠️ IRR=${irr.toFixed(2)}% 收益率较低,可能不如银行存款或国债。`;} else verdictHTML=`❌ IRR=${irr.toFixed(2)}% 负收益,项目不可行。`; document.getElementById('verdictBox').className='verdict-box '+(irrVal>5?'verdict-good':irrVal>=0?'':'verdict-bad'); document.getElementById('verdictBox').innerHTML=verdictHTML; // NPV曲线 drawNPVCurve(cfs, irr); // 迭代过程表 let iterHTML='迭代r (%)NPV(r)NPV\'(r)'; result.history.slice(0,15).forEach(h=>{ iterHTML+=`${h.iter}${h.rate.toFixed(8)}${fmtY(h.npv)}${fmtY(h.dnpv)}`; }); if(result.history.length>15) iterHTML+=`... 共${result.history.length}次迭代 ...`; document.getElementById('iterTable').innerHTML=iterHTML; // 公式 document.getElementById('formulaBox').innerHTML=`

牛顿迭代法求解IRR

定义:IRR是使NPV=0的折现率 r*

Σ CFₜ / (1+r*)^t = 0

牛顿迭代公式:r_{n+1} = r_n - NPV(r_n) / NPV'(r_n)

本例:共${result.iterations}次迭代收敛至 IRR = ${irr.toFixed(4)}%

验证:当 r=${irr.toFixed(4)}% 时,NPV = ${calcNPV(cfs,irr/100).toFixed(2)} ≈ 0 ✅

`; document.getElementById('resultArea').classList.add('show'); } function drawNPVCurve(cfs, irr){ const container=document.getElementById('npvCurve'); const W=container.offsetWidth||700, H=240; const pad={left:60,right:30,top:20,bottom:40}; // 计算数据点 const rates=[]; const npvs=[]; for(let r=-0.3;r<=1.0;r+=0.02){ rates.push(r*100); npvs.push(calcNPV(cfs,r)); } // 找范围 const minNPV=Math.min(...npvs), maxNPV=Math.max(...npvs); const range=maxNPV-minNPV||1; // 坐标转换 function tx(r){return pad.left+(r+30)/130*(W-pad.left-pad.right);} function ty(npv){return H-pad.bottom-(npv-minNPV)/range*(H-pad.top-pad.bottom);} // 生成路径 let pathD=''; for(let i=0;i IRR=${irr.toFixed(2)}% NPV 0 ${fmt(maxNPV)} ${fmt(minNPV)} -30% 100% 折现率 r `; container.innerHTML=svg; } initTable();