访问 UnivariateSpline 曲线上的值
Accessing value on a UnivariateSpline curve
我正在研究一个简单的函数来拟合收益率曲线。我正在使用 Scipy.interpolate.UnivariateSpline
来完成任务。该函数应 return 特定时间间隔(到期日)的收益率值。
这是我写的简单函数:
def curve_fit(spot_yields_df, a):
x = spot_yields_df['INTERVAL']
y = spot_yields_df['SPOT']
s1 = inter.UnivariateSpline(x, y, s=0.5)
plt.plot(x, y, marker="o", markerfacecolor='None', markersize=5, linestyle='None')
plt.plot(x, s1(x))
plt.show()
return s1(a)
在下面的示例中作为输入提供的数据帧如下所示:
spot_yields_df
Out[53]:
CURVE_ID ISIN REL_DATE SPOT INTERVAL
0 crv_sagb AU316223 2019-05-31 6.84543548187739 0.263014
1 crv_sagb ED957814 2019-05-31 7.41912841796875 0.627397
2 crv_sagb EF656651 2019-05-31 7.01629638671875 1.835616
3 crv_sagb EJ235944 2019-05-31 7.58026123046875 3.750685
4 crv_sagb CP507394 2019-05-31 9.12445068359375 7.564384
5 crv_sagb EJ750004 2019-05-31 9.56756591796875 10.679452
6 crv_sagb EI258596 2019-05-31 9.56085205078125 11.756164
7 crv_sagb EJ750009 2019-05-31 10.1046752929688 12.843836
8 crv_sagb EK773288 2019-05-31 10.2053833007813 15.758904
9 crv_sagb EF556585 2019-05-31 10.2926635742188 16.846575
10 crv_sagb EJ750019 2019-05-31 10.7022094726562 17.684932
11 crv_sagb EK773306 2019-05-31 10.8700561523437 20.684932
12 crv_sagb EI258592 2019-05-31 10.2859497070313 21.764384
13 crv_sagb EJ749864 2019-05-31 10.8834838867188 24.687671
14 crv_sagb EJ235914 2019-05-31 10.0711059570313 28.767123
这是绘图,表明函数运行良好。
例如,根据图表,s1(30) 和 curve_fit(spot_yields_df, 30) 分别应该 return 10 左右的值。它是 return取一个大约 6 的值:
curve_fit(spot_yields_df, 30)
Out[52]: array(6.84325277)
我怎样才能 return 与图表显示的内容相对应的值。非常感谢任何帮助。
貌似不是程序的问题,而是插值方法本身的问题(也说明这道题比较适合cross-validated,但有时候不能提前知道) .
如果您使用的是平滑因子(s=0.5
在您的情况下是一个平滑因子,请参阅 the docs),曲线不会准确地命中数据集中的每个点。
如果您希望它命中每个点,请尝试设置 s=0
- 在这种情况下,外推到 30 将是从两个最高点的线性外推(您可以验证这一点)。
或者,您可以设置 s=None
(或者不为其填充值,这是默认值),在这种情况下,函数将为 s
选择一个合理的值 - 从 运行 我这边的代码,看起来确实合理(并产生 9.87195 的值):
我正在研究一个简单的函数来拟合收益率曲线。我正在使用 Scipy.interpolate.UnivariateSpline
来完成任务。该函数应 return 特定时间间隔(到期日)的收益率值。
这是我写的简单函数:
def curve_fit(spot_yields_df, a):
x = spot_yields_df['INTERVAL']
y = spot_yields_df['SPOT']
s1 = inter.UnivariateSpline(x, y, s=0.5)
plt.plot(x, y, marker="o", markerfacecolor='None', markersize=5, linestyle='None')
plt.plot(x, s1(x))
plt.show()
return s1(a)
在下面的示例中作为输入提供的数据帧如下所示:
spot_yields_df
Out[53]:
CURVE_ID ISIN REL_DATE SPOT INTERVAL
0 crv_sagb AU316223 2019-05-31 6.84543548187739 0.263014
1 crv_sagb ED957814 2019-05-31 7.41912841796875 0.627397
2 crv_sagb EF656651 2019-05-31 7.01629638671875 1.835616
3 crv_sagb EJ235944 2019-05-31 7.58026123046875 3.750685
4 crv_sagb CP507394 2019-05-31 9.12445068359375 7.564384
5 crv_sagb EJ750004 2019-05-31 9.56756591796875 10.679452
6 crv_sagb EI258596 2019-05-31 9.56085205078125 11.756164
7 crv_sagb EJ750009 2019-05-31 10.1046752929688 12.843836
8 crv_sagb EK773288 2019-05-31 10.2053833007813 15.758904
9 crv_sagb EF556585 2019-05-31 10.2926635742188 16.846575
10 crv_sagb EJ750019 2019-05-31 10.7022094726562 17.684932
11 crv_sagb EK773306 2019-05-31 10.8700561523437 20.684932
12 crv_sagb EI258592 2019-05-31 10.2859497070313 21.764384
13 crv_sagb EJ749864 2019-05-31 10.8834838867188 24.687671
14 crv_sagb EJ235914 2019-05-31 10.0711059570313 28.767123
这是绘图,表明函数运行良好。
例如,根据图表,s1(30) 和 curve_fit(spot_yields_df, 30) 分别应该 return 10 左右的值。它是 return取一个大约 6 的值:
curve_fit(spot_yields_df, 30)
Out[52]: array(6.84325277)
我怎样才能 return 与图表显示的内容相对应的值。非常感谢任何帮助。
貌似不是程序的问题,而是插值方法本身的问题(也说明这道题比较适合cross-validated,但有时候不能提前知道) .
如果您使用的是平滑因子(s=0.5
在您的情况下是一个平滑因子,请参阅 the docs),曲线不会准确地命中数据集中的每个点。
如果您希望它命中每个点,请尝试设置 s=0
- 在这种情况下,外推到 30 将是从两个最高点的线性外推(您可以验证这一点)。
或者,您可以设置 s=None
(或者不为其填充值,这是默认值),在这种情况下,函数将为 s
选择一个合理的值 - 从 运行 我这边的代码,看起来确实合理(并产生 9.87195 的值):