首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >小收益率累加也有精度坑:用 log1p 和 expm1 保住有效位

小收益率累加也有精度坑:用 log1p 和 expm1 保住有效位

原创
作者头像
量化行业新引擎
发布于 2026-10-20 10:00:13
发布于 2026-10-20 10:00:13
260
举报
文章被收录于专栏:AI量化视界AI量化视界

做高频收益统计或蒙特卡洛模拟时,单个收益率可能很小。常见写法是先算 np.log(1 + r),把对数收益相加,再用 np.exp(x) - 1 还原累计收益。公式没有问题,但在浮点数里,1 + r 可能先发生舍入;当 r 足够小时,有效位会在取对数之前就丢掉。

NumPy 专门提供了 log1p 和 expm1。前者计算 log(1+x),后者计算 exp(x)-1,针对接近零的输入做了精度处理。写成代码并不复杂:

代码语言:python
复制
import numpy as np
log_ret = np.log1p(simple_ret)
total_ret = np.expm1(log_ret.sum())

这里不是说普通的 log、exp 不能用。日频股票收益通常远没有小到让误差立刻可见;但如果要累计大量微小变动、比较两个非常接近的参数结果,或者把这段函数作为公共回测组件,使用语义更准确的接口成本很低,也省得以后排查尾数漂移。

我会顺手补三类测试。第一类用普通收益率,确认结果与连乘 (1+r).prod()-1 接近;第二类用非常小的正负值,比较 log1p 与 log(1+r) 的差别;第三类放入 -1、缺失值和非有限值,明确函数究竟报错、返回 -inf,还是在进入计算前过滤。尤其是 r=-1 代表本金归零,之后不能靠对数变换“恢复”。

另外,对数收益可加不等于可以忽略业务顺序。手续费、滑点和现金流必须先按策略口径进入每期净收益,再做转换;不同资产的收益也不能不加权就直接相加。log1p 解决的是数值精度问题,不会替我们修正回测定义。把数学公式、异常输入和交易口径分开测试,结果才更容易复现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档