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

基于SPX日度数据计算多周期(年/季/月)收益率的技术需求

S&P 500 周期收益率计算方案

第一步:确保日期索引格式正确

先确认你的DataFrame日期索引是datetime类型,否则后续周期计算会出错。如果还未转换,执行:

import pandas as pd

# 假设你的原始DataFrame名为spx_df
spx_df.index = pd.to_datetime(spx_df.index)

第二步:通用周期收益率计算函数

利用Pandas的resample和shift方法,无需手动处理日期匹配,就能灵活计算年/月/季度收益率:

def calculate_period_returns(df, period='Y'):
    # 按指定周期提取每个周期最后一个交易日的收盘价
    period_end_prices = df['收盘价'].resample(period).last()
    # 获取上一个周期的收盘价(用于计算当前周期收益率)
    period_start_prices = period_end_prices.shift(1)
    # 按公式计算收益率,保留2位小数
    returns = ((period_end_prices / period_start_prices - 1) * 100).round(2)
    # 生成收益率专属DataFrame
    returns_df = pd.DataFrame({'周期收益率(%)': returns})
    # 将收益率合并回原DataFrame(仅周期最后一天有值,其余为NaN)
    df_with_returns = df.merge(returns_df, left_index=True, right_index=True, how='left')
    return returns_df, df_with_returns

周期参数说明

  • period='Y':计算年度收益率(每年最后一个交易日收盘价对比上一年年末)
  • period='M':计算月度收益率(每月最后一个交易日收盘价对比上月月末)
  • period='Q':计算季度收益率(每季度最后一个交易日收盘价对比上季度末)

第三步:使用示例

计算年度收益率

annual_returns, spx_with_annual = calculate_period_returns(spx_df, period='Y')
# 查看年度收益率结果
print(annual_returns.head())

annual_returns是仅包含年度收益率的DataFrame,索引为每年最后一个交易日;spx_with_annual是原DataFrame新增了收益率列,方便后续关联原始数据。

计算月度收益率

monthly_returns, spx_with_monthly = calculate_period_returns(spx_df, period='M')

第四步:绘制收益率折线图

用Matplotlib绘制连续收益率曲线:

import matplotlib.pyplot as plt

# 绘制年度收益率折线图
plt.figure(figsize=(12, 6))
annual_returns['周期收益率(%)'].plot(color='blue', linewidth=2)
plt.title('S&P 500 年度收益率(1993-2023)')
plt.ylabel('收益率(%)')
plt.xlabel('年份')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

# 绘制月度收益率折线图
plt.figure(figsize=(12, 6))
monthly_returns['周期收益率(%)'].plot(color='green', linewidth=1)
plt.title('S&P 500 月度收益率(1993-2023)')
plt.ylabel('收益率(%)')
plt.xlabel('日期')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

新手避坑提示

  • 必须确保日期索引为datetime类型,否则resample方法无法识别周期。
  • resample(period).last()会自动取周期内最后一个交易日的收盘价,无需手动查找交易日,避免日期匹配错误。
  • shift(1)方法完美解决了“上一周期收盘价”的跨行匹配问题,无需编写复杂的日期逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:10:22