年化收益率计算器

把一段时间的总收益折算成"每年复利多少",并把算术平均、简单折算、分红口径摆在一起对照:填初值、末值、年数,就能看到同样 5% 的总收益在 2 年、3 年、30 年下分别是多少年化。

年化收益率(CAGR)2.4695%末值 ÷ 初值 再开 年数 次方,减 1
累计收益率5.0000%末值 ÷ 初值 − 1
算术平均年收益率10.0000%逐年收益率的算术平均
波动拖累(算术 − 年化)7.5305 个百分点算术平均 − 几何平均
若同一笔总收益发生在 N 年年化收益率简单折算(总收益 ÷ N)差额
1 年5.0000%5.0000%0.0000 个百分点
2 年2.4695%2.5000%0.0305 个百分点
3 年1.6396%1.6667%0.0270 个百分点
4 年1.2272%1.2500%0.0228 个百分点
5 年0.9806%1.0000%0.0194 个百分点
6 年0.8165%0.8333%0.0168 个百分点
7 年0.6994%0.7143%0.0148 个百分点
8 年0.6117%0.6250%0.0133 个百分点
9 年0.5436%0.5556%0.0120 个百分点
10 年0.4891%0.5000%0.0109 个百分点
11 年0.4445%0.4545%0.0100 个百分点
12 年0.4074%0.4167%0.0093 个百分点

提示:数字框里按 Enter 直接重算,「逐年收益率」是文本框,用 Ctrl + Enter;对照表默认 12 行,点「加载更多」看完 30 年,点「下载 CSV」导出(带 BOM,Excel 不乱码)。

使用方法

  1. 这个年化收益率计算器一共四个数字框。先在「初值」填 10000(示例值),单位元,必须大于 0;它是要当除数的,填 0 无法计算。
  2. 在「末值」填 10500(示例值),填价格口径的期末市值;在「年数」填 2(示例值),单位是年,允许 0.1~100,可以带一位小数。
  3. 「期间累计分红」默认 0。手上只有价格序列、不知道分红时保持 0;要按全收益口径算,就填这段时间累计拿到手的分红金额,工具会把它并入末值再折一次年化。
  4. 「逐年收益率」默认填 50, -30(示例值),用逗号或空格分隔,单位是百分数。填了它,右侧才会出现「算术平均年收益率」和「波动拖累」两张卡;留空则这两张卡显示未填。
  5. 数字框里按 Enter 直接重算;「逐年收益率」是文本框,Enter 留给换行,用 Ctrl + Enter(macOS 用 Cmd + Enter)触发。
  6. 下方对照表固定列出"同一笔总收益分别发生在 1~30 年时"的年化收益率,并把常见的简单折算(总收益 ÷ 年数)并排列出。默认显示 12 行,点「加载更多」看完 30 年。

这个年化收益率计算器能解决什么问题

一是把不同持有期的收益放在同一把尺子上。赚 5% 这个数字本身没有意义:一个月赚 5%、两年赚 5%、三十年赚 5%,是完全不同的三件事。本页把它们统一折成年化,示例条件(10000 → 10500,2 年)得到 2.4695%;同样 5% 如果用了 30 年,年化只有 0.1628%,连通胀都跑不过。

二是拆穿"平均收益"这个说法。很多人把逐年的收益率直接平均,得到"平均每年 10%",再按 10% 复利去推未来。示例里的两条收益率 50% 和 −30%,算术平均确实是 10.0000%,但真实年化只有 2.4695%,差了 7.5305 个百分点。差额来自波动:亏 30% 是在已经涨到 15000 的基数上亏的,亏掉的是 4500 元,而不是最初 10000 的 30%。

三是判断一只产品有没有跑赢。拿到净值曲线或对账单,把起点、终点和持有年数填进来,年化数字立刻可以和存款、国债、通胀放在一起比。想比实际购买力,再把年化减去同期通胀率(更严格的做法是用实际收益率 = (1 + 名义) ÷ (1 + 通胀) − 1)。

四是核对别人给的年化是不是口径一致的。同一只基金,用价格口径和全收益口径算出的年化可以差出一大截:示例里价格口径 2.4695%,把 500 元分红并进去就变成 4.8809%,差 2.4114 个百分点。窗口期内分过红的产品,用不含分红的净值曲线算年化,一定会低估。

本页不做这些事:不预测未来收益、不拉取任何行情或净值数据、不处理不定期的追加和赎回(那种情形要用内部收益率逐笔折现)。要算定期定额投入的终值,请用「复利计算器」;要算含通胀后的实际购买力,请用「通货膨胀计算器」。

计算公式:CAGR 与算术平均的差别

本页的主公式是复合年化收益率:CAGR = (末值 ÷ 初值)1 ÷ 年数 − 1,代码里就是 Math.pow(末值 / 初值, 1 / 年数) - 1。它的含义是"假设每年以同一个比例复利增长,涨到今天的倍数需要多大的年增长"。示例:(10500 ÷ 10000)1/2 − 1 = 1.050.5 − 1 = 2.4695%。也可以写成 (1 + 累计收益率)1 ÷ 年数 − 1,两式等价。

逐年的收益率要用几何平均,不能用算术平均。已知k年的年收益率 r₁…r_k,年化等于 ((1+r₁)×(1+r₂)×…×(1+r_k))1/k − 1,即几何平均。算术平均 (r₁ + r₂ + … + r_k) ÷ k 只在各年收益率完全相同时才等于几何平均:连续两年 10% 和 10%,算术平均 10.0000%、年化也是 10.0000%,两者一致;换成 50% 和 −30%,算术平均 10.0000%、年化 2.4695%;换成 +100% 和 −50%,算术平均 25.0000%、年化 0.0000%——翻倍又腰斩,两年下来一分没赚,算术平均却告诉你"每年赚 25%"。

两者的差有一个常用近似式:几何 ≈ 算术 − σ² ÷ 2,σ 是逐年收益率的标准差。示例里 50% 与 −30% 的标准差是 40.00%,σ² ÷ 2 = 8.00%,算出 2.0000%,与真值 2.4695% 差 0.47 个百分点;把序列换成 +20%、−10%、+5%、+15% 这四年,σ = 11.46%,近似式给 6.8438%,真值 6.8631%,误差缩到 0.02 个百分点以内。波动越大、年数越少,这个近似越松。这部分差额业界叫"波动拖累"或"波动成本"。

还有一种是"简单折算",连算术平均都不是。它用 累计收益率 ÷ 年数 直接当成年化。翻倍(累计 100%)用 2 年时间,简单折算给出 50.0000%,正确的年化是 41.4214%,差 8.5786 个百分点;用 30 年翻倍,简单折算 3.3333%,正确年化 2.3374%,差 0.9959 个百分点。年限越长,两者反而越接近,但永远不相等——因为简单折算把复利当成了加法。

含分红再投时的口径要单独说清。净值曲线一般是价格口径(也叫"复权前净值"或"单位净值"),分红派出去的部分不在里面。判断真实回报要用全收益口径:把每一次分红按当日净值买回份额,期末算总市值。若能拿到复权净值(后复权),直接用末值 ÷ 初值即可。本页的处理方式是把「期间累计分红」直接并入末值再折年化,等于假设分红全部按原价再投。

但"分红并进末值"只在两种情况下精确:分红发生在期末一次性收到,或者分红虽然发生在期中、但金额小到可以忽略时间差异。示例里 10000 元本金,第 1 年末收到 500 元分红且一直闲置、第 2 年末连本带价拿到 10500 元,逐笔现金流 −10000 / +500 / +10500 的内部收益率恰好是 5.0000%,而把 500 并进末值的算法给 4.8809%,两者差 0.1191 个百分点。要精确处理期中现金流,得用内部收益率逐笔折现,不能靠一个除法。这也是中国人民银行公告〔2021〕第 3 号对贷款年化利率的要求——以借款人实际占用的本金为基础、按内部收益率法(IRR)折算——道理是同一个:钱占用多久,就必须按多久计息。

完整示例(数值仅作演示)

下面这条链路和页面默认值完全一致:初值 10000 元、末值 10500 元、年数 2 年、累计分红 0、逐年收益率 50% 与 −30%。四张结果卡与对照表算出的关键数字如下:

再把年数换成别的值看总收益口径的变化:同样 10000 → 10500,若这 5% 是 1 年赚到的,年化 5.0000%;3 年赚到,年化 1.6396%;30 年赚到,年化 0.1628%。总收益一样,年化的差距却有 30 倍。若换成 10000 → 5000(腰斩),1 年的年化 −50.0000%,2 年是 −29.2893%——注意负收益年年化会被"摊薄",这并不代表亏损变少了。

输入范围与年化对照表

下表固定"累计翻倍(总收益 100%)"这一个前提,只改年数,看年化怎么随年数衰减,并和常见的简单折算并排比较。这张表和工具里的 30 年扫描表算法相同,工具只是把门槛数字换成了你填的初值、末值。

年数年化收益率简单折算(100÷N)差额
1 年100.0000%100.0000%0.0000 个百分点
2 年41.4214%50.0000%8.5786 个百分点
3 年25.9921%33.3333%7.3412 个百分点
5 年14.8698%20.0000%5.1302 个百分点
10 年7.1773%10.0000%2.8227 个百分点
20 年3.5265%5.0000%1.4735 个百分点
30 年2.3374%3.3333%0.9959 个百分点

第二张表是"同样两条收益率,算出来的平均完全不同",用来解释为什么必须用几何平均。三组序列的本金都是 10000 元,连续两年:

两年的收益率算术平均年化(几何平均)波动拖累两年后的钱
+10% / +10%10.0000%10.0000%0.0000 个百分点12,100 元
+50% / −30%10.0000%2.4695%7.5305 个百分点10,500 元
+100% / −50%25.0000%0.0000%25.0000 个百分点10,000 元

第三张表把分红口径摆开。同一个账户、同一段两年、同样从 10000 元变成 10500 元的价格,只因分红处理方式不同,年化就有三个答案:

口径怎么算年化收益率
价格口径(只看净值)10500 ÷ 10000 开 2 次方再减 12.4695%
全收益口径(分红并入末值)(10500 + 500) ÷ 10000 开 2 次方再减 14.8809%
逐笔 IRR(500 元在第 1 年末收到且不再投)解 −10000 + 500 ÷ (1+r) + 10500 ÷ (1+r)² = 05.0000%

边界与口径说明

常见问题

为什么"平均每年 10%"不等于年化 10%?

因为"平均"这个词有两个含义。把 50% 和 −30% 直接相加除以 2 得到算术平均 10.0000%,但它忽略了 10000 元先涨到 15000、再在 15000 的基数上亏 30%(亏 4500 元)这个事实。按连乘算,1.5 × 0.7 = 1.05,年化只有 2.4695%。要按 10% 复利推未来,两年应该涨到 12100 元,实际只有 10500 元,多算了 1600 元。

年化收益率和累计收益率是什么关系?

累计收益率 = 末值 ÷ 初值 − 1,年化 = (1 + 累计收益率)1 ÷ 年数 − 1,两者可以互相换算。示例里累计 5.0000%、2 年,年化 2.4695%;反过来说,只要知道年化和年数,也能反推累计。只有年数等于 1 时,两者数值才相等。

为什么负收益的年化看起来"没那么亏"?

摊薄效应。10000 元两年亏到 5000 元,累计 −50%,但年化是 −29.2893% 而不是 −25%:因为第二年是亏在已经缩水的本金上,同样的百分比亏掉的绝对金额更少。注意年化更"温和"不代表亏损变少,它只是把同一笔总亏损摊到了每一年。

分红算不算进收益里?

要看口径。只填净值(价格口径)时不算,年化会被低估;把「期间累计分红」填上,工具会并入末值算全收益口径。示例里 500 元分红让年化从 2.4695% 升到 4.8809%,差 2.4114 个百分点。如果拿到的是后复权净值,末值里已经含分红,分红框保持 0 即可,别再重复加一次。

年数该按 365 天还是按整年算?

两种都可以,关键是在比较的几组数据里用同一个口径。732 天的例子:按 365 天算 2.005479 年(年化 2.4627%)、按 365.25 天算 2.004107 年(年化 2.4644%)、舍成整 2 年(年化 2.4695%),差不到 0.007 个百分点。短期(几个月)时天数口径的影响会明显放大,这时建议直接用天数 ÷ 365。

逐年收益率留空会怎样?

不影响主计算。「年化收益率」和「累计收益率」只依赖初值、末值、年数,留空照样算;只有「算术平均年收益率」和「波动拖累」这两张卡需要逐年数据,留空时它们会显示"未填逐年序列"。

为什么负数末值算不出来?

因为公式要对"末值 ÷ 初值"开分数次方,负数的偶数次方根在实数范围内不存在,JavaScript 的 Math.pow(-0.5, 0.5) 直接返回 NaN。现实中负净值意味着杠杆穿仓或负债超过资产,它已经不是"投资收益率"这个模型能描述的对象,应该用现金流折现单独处理。

填进去的金额会上传吗?

不会。这个年化收益率计算器的开方、连乘、逐行扫描全部由页面脚本完成,没有任何网络请求,也不写浏览器存储;刷新后输入框回到默认的 10000 / 10500 / 2 / 0 与 50, -30。想自己确认,打开开发者工具的 Network 面板点几次「开始计算」,看不到新请求发出。

相关工具