You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NumPy实现时间序列的简单净收益与对数收益计算(等效Matlab逻辑)

嘿,我来帮你把Matlab里的时间序列收益计算转换成NumPy的实现,而且完全不用写循环——NumPy的向量化操作可比手动循环高效多了!

先提个小细节:你的Matlab代码里好像变量名有点笔误,应该是用X来计算对吧?就是returns(i,:) = (X(i,:) - X(i-1,:))/X(i-1,:),我下面就按这个正确的逻辑来写NumPy代码啦。

NumPy实现时间序列收益计算(替代Matlab循环)

1. 简单净收益(Simple Net Returns)

Matlab里你用循环逐行计算,NumPy里直接用向量化切片就能搞定,速度快N倍,尤其是当你的时间序列很长的时候。假设你的数组X是T行N列(和Matlab的T x N结构完全对应,行是时间步,列是不同的标的/资产)。

代码示例:

import numpy as np

# 举个例子,构造一个3行2列的时间序列数组
X = np.array([[100, 200], [105, 210], [110, 205]])

# 计算简单净收益:(当前值 - 前一期值) / 前一期值
simple_returns = (X[1:] - X[:-1]) / X[:-1]

这里的X[1:]是取数组从第2行到最后一行(对应Matlab里的i=2:length(X)),X[:-1]是取第1行到倒数第二行(对应i-1),直接做元素级运算,得到的就是(T-1)xN的收益数组,和你Matlab循环跑出来的结果完全一致。

2. 对数收益(Log Returns)

对数收益是量化分析里常用的另一个指标,计算逻辑是ln(当前值/前一期值),NumPy里用np.log就能轻松实现:

# 两种等价写法,选你习惯的就行
log_returns = np.log(X[1:] / X[:-1])
# 或者:log_returns = np.log(X[1:]) - np.log(X[:-1])

3. 处理特殊情况(零值/NaN)

如果你的数据里存在零或者NaN,不想让计算出inf或者报错,可以用np.divide来做安全除法,或者提前清洗数据:

# 安全除法:把除以零的结果替换成NaN,避免出现inf
simple_returns = np.divide(
    X[1:] - X[:-1], 
    X[:-1], 
    out=np.full_like(X[1:], np.nan), 
    where=X[:-1] != 0
)

# 要是想直接去掉包含NaN的行,得到干净的收益数据
simple_returns_clean = simple_returns[~np.isnan(simple_returns).any(axis=1)]

4. 扩展:和原数组行数对齐(第一行填NaN)

有时候你希望收益数组和原数组的行数保持一致(第一行因为没有前一期数据,填充NaN),这样后续对齐分析更方便,这也很容易实现:

# 初始化一个和X形状完全相同的数组,先填满NaN
simple_returns_full = np.full_like(X, np.nan)
# 从第二行开始赋值计算好的收益
simple_returns_full[1:] = (X[1:] - X[:-1]) / X[:-1]

这样得到的simple_returns_full就是T x N的数组,结构和你Matlab里先初始化returns数组再循环赋值的结果完全匹配。

内容的提问来源于stack exchange,提问作者Emmanuel Murray Leclair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:29:54