【问题标题】:Accessing value on a UnivariateSpline curve访问 UnivariateSpline 曲线上的值
【发布时间】:2019-11-17 19:21:30
【问题描述】:

我正在研究一个简单的函数来拟合收益率曲线。我正在使用Scipy.interpolate.UnivariateSpline 来完成这项任务。该函数应返回特定间隔(成熟度)的收益率值。

这是我写的简单函数:

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)

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

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) 应该分别返回大约 10 的值。它返回的值大约是 6:

curve_fit(spot_yields_df, 30)
Out[52]: array(6.84325277)

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

【问题讨论】:

  • 图表未显示 10 在 x=30 左右。对于 x=28,它大约显示 10。可能是插值曲线急剧下降超过 x=28 并在 x=30 处接近 6。试试curve_fit(spot_yields_df, 28),看看它是否仍然给你带来价值,而不是大约。 10
  • 您好,您可以将输入的 DataFrame (spot_yields_df) 复制到问题中吗?
  • @Sheldore 我说了一个值大约 10 来说明这一点。当函数返回时,图表肯定不会显示 6.84。
  • @Sheldore s1(28) Out[59]: array(11.06701489) - 现在太高了,根据图表它应该返回10.25

标签: python matplotlib scipy interpolation


【解决方案1】:

看来问题不在于程序,而在于插值方法本身(这也意味着问题更适合cross-validated,但有时你无法提前知道)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多