访问 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 的值):