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

基于Pandas计算S&P1500指定日期前后区间累计收益率问题咨询

实现方案

现存代码问题梳理

  • 日期列被转换为字符串格式设置索引,无法直接按时间范围筛选数据,是核心逻辑阻塞点
  • 从Indexes取子集生成SP1500DailyReturns时未使用.copy(),触发了链式赋值的SettingWithCopyWarning
  • 原for循环逻辑不完整,既没有按日期范围截取收益率序列,也没有逐行赋值,直接给整列赋值会覆盖所有行数据
  • 列名存在笔误,目标列是SP150030after而非SP50030after

完整可运行代码

import pandas as pd
import numpy as np

# 1. 读取主表数据,日期保留datetime类型
Main_set = pd.read_excel('...')
# 直接转换为datetime,不要转成字符串
Main_set['European short date'] = pd.to_datetime(Main_set['European short date'], format='%d.%m.%y', errors='coerce')

# 2. 读取指数数据,计算日收益率+1
Indexes = pd.read_excel('...')
Indexes['Date'] = pd.to_datetime(Indexes['Date'], format='%d.%m.%y', errors='coerce')
# 设置datetime类型为索引,按日期升序排序(非常重要,保证时间序列顺序正确)
Indexes = Indexes.set_index('Date').sort_index()

# 加.copy()避免链式赋值警告
SP1500DailyReturns = Indexes[['S&P 1500 SUPER COMPOSITE - PRICE INDEX']].copy()
# 计算日收益率+1,第一个缺失值填充为1(无收益时乘积不变)
SP1500DailyReturns['S&P 1500_return'] = (SP1500DailyReturns['S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns['S&P 1500 SUPER COMPOSITE - PRICE INDEX'].shift(1)).fillna(1)

# 3. 自定义计算函数:输入目标日期,返回前365天、后30天累计收益率
def calc_return(target_date):
    # 计算前365天累计收益率:目标日期前365天到目标日期前1天
    before_start = target_date - pd.Timedelta(days=365)
    before_end = target_date - pd.Timedelta(days=1)
    before_return = SP1500DailyReturns.loc[before_start:before_end, 'S&P 1500_return'].prod()
    
    # 计算后30天累计收益率:目标日期后1天到目标日期后30天
    after_start = target_date + pd.Timedelta(days=1)
    after_end = target_date + pd.Timedelta(days=30)
    after_return = SP1500DailyReturns.loc[after_start:after_end, 'S&P 1500_return'].prod()
    
    return pd.Series([before_return, after_return])

# 4. 批量计算填充两列
Main_set[['SP1500365before', 'SP150030after']] = Main_set['European short date'].apply(calc_return)

# 输出结果检查
print(Main_set.head())

代码说明

  1. 日期全程保留datetime64类型,作为时间序列索引时可以直接用start:end的语法截取任意时间区间的数据
  2. 提取DataFrame子集时添加.copy(),彻底解决SettingWithCopyWarning告警
  3. 用apply替代手动for循环,代码更简洁,也避免了逐行赋值的索引匹配错误
  4. 如果遇到区间内无数据的情况,prod会返回1(对应收益率为0),如果需要标记为空,可以额外加判断逻辑替换为np.nan

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:00