You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于滚动方式比较10年期国债收益率差值的技术问询

搞定10年期国债收益率滚动差值计算

嘿,针对你需要计算过去10年10年期国债收益率未来6个月与1年后的差值的需求,我来给你捋捋怎么用Python的pandas高效实现——这可是处理时间序列数据的利器!

先理清楚计算逻辑

先看你给的示例:

日期:01/01/2017 2.40;07/01/2017 2.70;01/01/2018 2.90,计算得:07/01/2017 0.30;01/01/2018 0.50

我先把对应关系掰明白:

  • 07/01/2017的差值是当天收益率 - 6个月前的收益率2.70 - 2.40 = 0.30
  • 01/01/2018的差值是当天收益率 - 1年前的收益率2.90 - 2.40 = 0.50

不过你描述的是“未来6个月与1年后的差值”,更准确的理解应该是:对每个日期t,计算t+1年的收益率减去t+6个月的收益率——也就是看从t+6个月到t+1年这半年的收益率变化。按这个逻辑,示例里01/01/2017对应的差值是2.90 - 2.70 = 0.20

下面我会把两种逻辑的代码都给你,你按需选就行。


准备工作

首先得确保你装了pandas,没装的话跑这个命令:

pip install pandas

假设你的数据是CSV格式,大概长这样:

dateyield
01/01/20172.40
07/01/20172.70
01/01/20182.90
......

方式1:计算每个日期与过去6个月/1年的收益率差

这完全匹配你给出的示例结果,代码如下:

import pandas as pd

# 读取数据,替换成你的文件名
df = pd.read_csv('treasury_yields.csv')

# 把日期列转成datetime类型,确保格式正确
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')

# 把日期设为索引,方便时间运算
df.set_index('date', inplace=True)

# 计算与6个月前的收益率差(用'M'表示按月偏移,精确对齐月份)
df['yield_diff_6m'] = df['yield'] - df['yield'].shift(periods=6, freq='M')

# 计算与1年前的收益率差
df['yield_diff_1y'] = df['yield'] - df['yield'].shift(periods=1, freq='Y')

# 重置索引,方便查看结果
df.reset_index(inplace=True)

# 打印结果
print(df)

跑起来之后,你就能得到和示例一致的输出,每个日期对应6个月和1年的收益率差值。


方式2:计算每个日期对应的未来6个月与1年后的收益率差

这对应你描述的“未来6个月与1年后的差值”,也就是看t+6个月到t+1年的变化,代码如下:

import pandas as pd

df = pd.read_csv('treasury_yields.csv')
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')
df.set_index('date', inplace=True)

# 取未来6个月的收益率(负偏移表示往后取)
df['yield_6m_future'] = df['yield'].shift(periods=-6, freq='M')

# 取未来1年的收益率
df['yield_1y_future'] = df['yield'].shift(periods=-1, freq='Y')

# 计算差值:未来1年收益率 - 未来6个月收益率
df['future_diff_1y_minus_6m'] = df['yield_1y_future'] - df['yield_6m_future']

df.reset_index(inplace=True)

print(df)

这样你就能得到每个日期对应的“未来半年到一年”的收益率变化啦。


几个小提醒

  • 如果你的数据日期不是每月固定那天,建议用pd.DateOffset来精确计算,比如shift(periods=1, freq=pd.DateOffset(months=6))
  • 要计算过去10年的数据,得确保你的数据集覆盖了足够的时间范围——比如要算2014年的未来1年差值,就得有2015年的数据
  • 如果数据里有缺失的日期,可以先用df.asfreq('M')填充缺失值,避免计算出错

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

火山引擎 最新活动