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

同时填充数据集并计算对数收益率的长度匹配问题求助

解决计算对数收益率时的DataFrame列长度不匹配问题

这个问题我之前处理金融时间序列时也碰到过,确实是np.diff的特性导致的——它会生成比原数据少一个元素的结果,因为计算的是相邻元素的差值。下面给你两种简单的解决办法,都能完美匹配原DataFrame的长度:

方法1:用Pandas的shift()手动计算(最直观)

既然对数收益率的公式是ln(price_t) - ln(price_{t-1}),我们可以用shift(1)把价格列向下偏移一行,再做减法。这样首行会自动填充NaN(因为第一天没有前一天的价格数据),正好符合逻辑:

import numpy as np
import pandas as pd

# 假设你的DataFrame是df
ret_names =['FTSEMIB_Index_ret', 'FCA_IM_Equity_ret', 'UCG_IM_Equity_ret', 'ISP_IM_Equity_ret', 'ENI_IM_Equity_ret', 'LUX_IM_Equity_ret']

for index, name in enumerate(ret_names):
    price_col = df.iloc[:, index]
    # 计算对数收益率:当前对数价格 - 上一行对数价格
    df[name] = np.log(price_col) - np.log(price_col.shift(1))

方法2:用np.insert()给np.diff结果补全缺失值

如果你坚持想用np.diff,可以在计算结果的开头插入一个NaN,让数组长度和原DataFrame一致:

for index,name in enumerate(ret_names):
    log_diff = np.diff(np.log(df.iloc[:,index]))
    # 在结果开头插入NaN,补全长度
    df[name] = np.insert(log_diff, 0, np.nan)

方法3:用Pandas的diff()简化代码(最简洁)

Pandas的Series.diff()方法本身就是计算相邻元素的差值,结合对数转换可以一行搞定:

for index,name in enumerate(ret_names):
    df[name] = np.log(df.iloc[:,index]).diff()

结果说明

三种方法最终得到的收益率列都会和原DataFrame长度一致,首行为NaN(这是合理的,因为没有前一日数据无法计算首日收益率)。后续行的数值完全相同,推荐用方法3,代码最简洁且符合Pandas的惯用写法。

内容的提问来源于stack exchange,提问作者Ares Bertelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:27:43