现金流有正有负却算不出XIRR:无解与不收敛怎么区分
有正数也有负数,仍可能不存在有效年化根;即使根存在,一次迭代也可能失败。这两类情况要分开诊断。本例样本甲负一百、正五十、负一百,方程没有实根;样本乙负一百、一年后收一百一十,正确根是百分之十,但本文牛顿法若从百分之一千启动,第一步会跳到定义域之外,不能据此宣布样本无解。
先把「输入合格」「存在根」「找到根」分清楚吗?
输入合格是金额和日期满足函数要求,例如正负现金流都存在、行数对应、日期类型有效。存在根是数学方程在规定定义域内能否达到零。找到根则与算法、初值、精度和迭代上限有关。前一层通过不代表后一层自动通过,后一层失败也不一定能反推前一层失败。
本文把年率定义域限制在大于负百分之百,保证增长因子为正。两个样本都采用整三百六十五天间隔,金额都是构造数据,没有真实投资记录。故意选择简单输入,是为了让无解可以代数证明,有解可以直接核算,不必把所有结论都压在黑箱求解器身上。
两份现金流究竟有什么不同?
样本甲在二〇二五年开始,三个日期依次为三年一月一日;样本乙在二〇二六年开始,只跨一年。样本乙的最早日期单独作为自己的折现起点,不与甲共用一个空白首行。
| 日期 | 样本甲/元 | 样本乙/元 |
|---|---|---|
| 2025-01-01 | -100 | 尚未开始 |
| 2026-01-01 | 50 | -100 |
| 2027-01-01 | -100 | 110 |
对样本甲,令正增长因子为x,去分母后方程是-100x²+50x-100=0。变号后二次式的判别式为五十的平方减四乘一百乘一百,是负数,因此没有实根。更直接地说,正系数二次式在整个实数域保持正,不可能等于零;不是只在某个利率区间没找到。
利率扫描能告诉我们什么,不能告诉什么?
把几组候选年率逐个代入现值方程,可以观察符号与变化范围。表中甲始终为负,乙从正变负并在百分之十附近经过零。金额单位均为元,表格显示精度不参与内部求解。
| 候选年率 | 样本甲现值/元 | 样本乙现值/元 |
|---|---|---|
| -90.000000% | -9600.000000 | 1000.000000 |
| -50.000000% | -400.000000 | 120.000000 |
| 0.000000% | -150.000000 | 10.000000 |
| 10.000000% | -137.190083 | -0.000000 |
| 50.000000% | -111.111111 | -26.666667 |
| 100.000000% | -100.000000 | -45.000000 |
| 1000.000000% | -96.280992 | -90.000000 |
这张表对甲的无解结论只是直观佐证,完整证明来自二次式;对于任意不规则现金流,有限扫描表一直同号不能独自证明全域无解。扫描范围外可能还有根,两根之间的窄区间也可能没采到,甚至存在只触及零轴而不变号的情形。不要把「没看见」写成「不存在」。
乙则可直接用两笔现金流验证:一百元在三百六十五天后变成一百一十元,对应百分之十,代回现值为零。这样我们提前知道根存在,便能把后面的失败明确归类为数值求解问题,而不是金额或日期本身出了错。
已知有解的样本为何还能迭代失败?
本文脚本实现一个用于演示的牛顿迭代,从年率十启动,计算现值与导数后更新,首步得到年率负八十九,已经低于负一,脚本按定义域检查停止。这里的十是小数形式的百分之一千,不是百分之十。算法跨出有效域是具体、可复现的失败原因,不能用换个符号或修改真实金额把它掩盖掉。
改用负百分之五十到正百分之五十的夹逼区间,区间两端现值异号,二分求解回到百分之十。本文没有在特定电子表格版本中人为制造同一错误代码,也不宣称所有软件都会按相同步骤失败;展示的是数值方法可能失败的机制与独立恢复方法。
收到错误提示后,应按什么顺序定位?
先核对日期类型、金额是否为数值、日期与金额是否等长,再把最早日期与其金额成对排在首行。接着检查是否确实存在正负流、是否缺少期末资产,以及账户边界是否一致。输入错误没有排除之前,扫描和换初值可能只是给坏数据找一个看似合理的结果。
输入可确认后,再做几组候选率的现值扫描,记录范围与步长。若能夹住根,可尝试有边界的方法,并把结果回代。若始终找不到,则描述为「在所查范围未检出」,除非有像本文甲样本这样的完整数学证明。多次变号还要警惕多根,不能见到一个解就停止披露限制。
哪些做法会把错误诊断变成数据篡改?
为了让软件返回数字而随意删去一笔负现金流,或者把期末支出改成收入,都会改变原问题。求解成功不再证明原账户有可解释的年化。应该保留原始输入,另存修复假设与计算结果;只有发现原始记录确实录错时,才依据凭证更正。
错误报告至少写出输入验证状态、搜索范围、方法、初值、停止原因与回代残差。这样别人能看出是无解证据充分,还是仅一次算法没有收敛。一个诚实的失败诊断,比无法解释却格式漂亮的百分数更有用,也不会把构造结果误当成投资判断。
数值发散与结果很大,能不能一眼判断?
不能只凭百分数大小判断。极短期间的正收益确实可能对应很大年化,某些求解迭代也可能在远处停留;需要看是否满足定义域、残差是否足够小,以及输入日期有没有缩短持有期。给输出设一个看起来顺眼的上限,只能作为人工提示,不能替代方程检查。
同样,返回负数也不等于错误。负收益可能对应有效根,也可能是符号、缺资产或日期错误造成的另一套方程。应按同一流程检查,不因为结果让人不舒服就反复换初值,直到找到正数才停止。对失败过程保留日志,才能看出是算法路径变了,还是原始数据真的被修正。
到哪里核对口径与基础计算?
概念背景见本站基础文章;相关计算工具可辅助做基础核算。本文扩展情景由上面的独立账表复现,使用工具前请检查它实际提供的参数,不把表格中的全部功能视为工具已有功能。
道积君编辑组|AI辅助起草,构造算例经程序复算。全部数字是教学构造,不是真实产品、历史行情或实盘记录;仅用于投资教育,不构成投资建议,也不预测未来收益。
公式资料:Microsoft XIRR函数、Google Sheets XIRR。核对日:2026-10-23。上述资料用于现金流与日期公式核对,不作为任何具体产品交易规则的依据。
复算资料
本篇编号为DJ016。可下载Python核算脚本(文本)与完整输入输出JSON,对照文中表格复算。脚本文件改存为.py后可用Python运行;数据均为构造教学样本。