pandas下计算前252个交易日Optionvalue对数日收益率的报错排查与实现
第一个疑问:用固定初始值做减数的逻辑是否正确
这个逻辑完全不符合日度对数收益率的计算要求。你写法里的减数是固定的log(Optionvalue.iloc[0]),也就是整个序列第一个交易日的对数值,算出来的是从首日到对应日期的累计对数差,根本不是相邻交易日的日度收益率。日度对数收益率要求的减数是前一个交易日的Optionvalue对数值,不是固定不变的初始值。
第二个疑问:调整代码实现限定范围的日度对数收益率计算
你之前踩了两个典型的pandas使用坑,分别对应报错和范围失效问题:
- 触发
KeyError: 'log return'的原因:给不存在的新列赋值时,不能用链式索引EUR['log return'].iloc[xxx] = ...的写法,这种写法在目标列不存在时会直接抛错,也容易因为pandas链式索引的赋值规则出现数据写入失效。 - 切片范围失效的原因:你没有把参与计算的源数据先限定在前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
相关产品推荐
相关产品推荐

