You need to enable JavaScript to run this app. pandas下计算前252个交易日Optionvalue对数日收益率的报错排查与实现
优惠活动
大模型
产品
解决方案
定价
更多

pandas下计算前252个交易日Optionvalue对数日收益率的报错排查与实现

第一个疑问:用固定初始值做减数的逻辑是否正确

这个逻辑完全不符合日度对数收益率的计算要求。你写法里的减数是固定的log(Optionvalue.iloc[0]),也就是整个序列第一个交易日的对数值,算出来的是从首日到对应日期的累计对数差,根本不是相邻交易日的日度收益率。日度对数收益率要求的减数是前一个交易日的Optionvalue对数值,不是固定不变的初始值。

第二个疑问:调整代码实现限定范围的日度对数收益率计算

你之前踩了两个典型的pandas使用坑,分别对应报错和范围失效问题:

  1. 触发KeyError: 'log return'的原因:给不存在的新列赋值时,不能用链式索引EUR['log return'].iloc[xxx] = ...的写法,这种写法在目标列不存在时会直接抛错,也容易因为pandas链式索引的赋值规则出现数据写入失效。
  2. 切片范围失效的原因:你没有把参与计算的源数据先限定在前252个交易日的范围内,直接全量计算后再切片赋值,会出现序列长度不匹配、取数越界的问题,达不到仅计算前252个交易日收益率的目标。

正确的实现代码

import numpy as np

# 先确保merge后的表按Date升序排列,避免时间顺序混乱导致收益率计算错位
EUR = EUR.sort_values("Date").reset_index(drop=True)

# 1. 提取最早252个交易日的Optionvalue序列(位置0到251共252条记录)
first_252_ov = EUR.loc[:251, "Optionvalue"]

# 2. 计算对数日收益率:对序列取对数后用diff()做相邻差,完全匹配log(y_t)-log(y_{t-1})的公式
# diff()自动生成当前行减上一行的差值,第一行因为没有上一行值会返回NaN,符合日度收益率的计算逻辑
daily_log_return = np.log(first_252_ov).diff()

# 3. 直接对DataFrame的新列整体赋值,避免KeyError
EUR["log return"] = daily_log_return

代码效果说明

  • 不会出现固定初始值相减的错误逻辑:.diff()自动取前一行的值做减数,完全匹配相邻对数差的要求
  • 计算范围严格限定在最早252个交易日内,不会用到252个交易日之后的任何数据
  • 直接整体赋值新列,不会触发链式索引导致的KeyError和赋值失效问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 21:45:04