exp 用于计算连续复利终值与折现(fv = pv × exp(r×t),pv = fv × exp(−r×t)),ln 用于反推年化连续收益率(ln(fv/pv)/t)及验证复利一致性。

EXP 和 LN 在金融计算中到底起什么作用
EXP 和 LN 不是金融专用函数,但它们是连续复利模型的数学基础。银行或量化系统里说的“连续折现率”,本质就是假设利息每时每刻都在累积,而不是按年/月离散计息——这时终值公式变成 FV = PV * EXP(r * t),而折现则用 PV = FV * EXP(-r * t);LN 则用于反推隐含连续收益率:LN(FV / PV) / t 就是年化连续回报率。
用 EXP 实现连续复利终值与折现(注意符号和单位)
SQL 中 EXP() 接收一个数值,返回 e 的该次幂。关键点在于:利率必须是小数形式(比如 5% 写成 0.05),时间单位要和利率周期一致(若 r 是年化连续率,t 就得是年,不能直接填 365)。常见错误是把名义年利率直接代入,忘了先转换为连续等价利率。
示例(PostgreSQL / MySQL 8.0+ / SQL Server):
SELECT 10000 AS principal, EXP(0.045 * 3.5) AS growth_factor, -- 年化连续利率 4.5%,持有 3.5 年 10000 * EXP(0.045 * 3.5) AS fv; -- 终值 ≈ 11727.39
折现同理,只需让指数为负:
SELECT 12000 * EXP(-0.045 * 2.2) AS pv; -- 2.2 年后 12000 元,按 4.5% 连续折现
用 LN 反算连续收益率或验证复利一致性
LN() 常被用来从已知的期初/期末值倒推实际实现的连续年化回报。它不依赖计息频次,比用 POWER() 算离散复利更干净。但要注意:输入必须为正数,否则报错 LN(0) 或 LN(negative);另外,如果数据来自四舍五入后的金额(如报表中只显示两位小数),LN(pv/fv) 可能因精度损失产生微小偏差。
常见用途:
- 计算某资产 5 年间从 8500 元涨到 12300 元的连续年化收益:
LN(12300.0 / 8500.0) / 5 - 校验一笔现金流是否满足给定连续折现率:
ABS(LN(pv / fv) + r * t) - 在窗口函数中对比不同时间段的连续回报稳定性:
LN(value / LAG(value) OVER (ORDER BY date)) AS log_return
不同数据库对 EXP/LN 的兼容性与精度差异
绝大多数主流 SQL 引擎都支持 EXP() 和 LN(),但行为略有区别:
- MySQL:函数名全小写,
LN(x)等价于LOG(x)(不是以 10 为底) - PostgreSQL:支持
EXP()、LN(),也支持LOG()(以 10 为底),别混用 - SQL Server:用
EXP()和LOG()(自然对数),没有LN()别名 - SQLite:默认不带,需加载 math 扩展或用
exp()+log()(大小写敏感,且需启用扩展)
精度方面,所有引擎在 double 浮点范围内误差极小(EXP(LN(123.45)) 结果通常与原值差在 1e-15 量级),但若参与后续多步乘除或聚合(如累计 EXP(SUM(LN(...)))),建议中间保留足够小数位,避免浮点传播误差放大。
连续复利模型本身是理想化假设,真正麻烦的从来不是函数调用,而是确认你手里的“利率”是不是已经过连续化处理——很多接口文档写的 “r = 4.5%” 实际给的是名义年利率,需要先经 r_cont = LN(1 + r_nominal) 转换才能喂给 EXP()。











