访问UnivariateSpline曲线上的值

时间:2019-07-08 09:40:32

标签: python matplotlib scipy interpolation

我正在研究一个简单的函数以拟合收益率曲线。我正在使用https://storage.googleapis.com/ez2on/1536250853638-NN.jpg来完成任务。该函数应返回特定间隔(到期)的收益率值。

这是我编写的简单函数:

Scipy.interpolate.UnivariateSpline

在下面的示例中作为输入提供的datafrme如下所示:

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)

这是图,表明该函数运行良好。

enter image description here

例如,根据图表,s1(30)和curve_fit(spot_yields_df,30)应该分别返回大约10的值。它返回大约6的值:

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

如何返回与图表显示相对应的值。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题似乎不在于程序,而在于插值方法本身(这也意味着问题更适合cross-validated,但有时您无法事先知道)。 / p>

如果您使用的是平滑因子(在您的情况下,s=0.5是平滑因子,请参见the docs),则曲线不会精确地碰到数据集中的每个点。
如果希望它击中每个点,请尝试设置s=0-在这种情况下,外推到30就是从两个最高点进行线性外推(您可以验证这一点)。
另外,您可以设置s=None(或者不填充它的值,这是默认值),在这种情况下,该函数将为s选择一个合理的值-通过运行代码就我而言,看起来确实很合理(并产生9.87195的值):

enter image description here