基于滚动方式比较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格式,大概长这样:
| date | yield |
|---|---|
| 01/01/2017 | 2.40 |
| 07/01/2017 | 2.70 |
| 01/01/2018 | 2.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




