首页 > 解决方案 > 如何使用 python 将曲线拟合到数据,然后从计算的曲线中获取可重用的函数?

问题描述

我有一个值的字典,在这种情况下,键是时间间隔,值是百分比,目的是查看某个值是否在一段时间内超过了某个值。该表用于确定我们是否根据经过的时间和获得的回报出售投资,随着时间的推移,它变得不那么严格。

    roi = {
        "0": 0.13,
        "10": 0.07,
        "30": 0.04,
        "50": 0.025,
        "75": 0.017,
        "360": 0.01,
        "720": 0.005,
        "1440": 0
    }

例如,在上表中,一项投资将具有以百分比表示的利润值,以及自交易开始以来经过的时间量。

假设当前交易开始时间为 321 分钟,该投资的当前利润为 0.012(或 1.2%)。根据上表,我不会卖出,因为在 75 分钟时阈值为 0.017,直到 360 分钟才下降到 0.01。我想计算上述步骤的“介于”值。

我想做的是拿这张表并为其拟合多项式曲线(或任何形状曲线似乎最有意义)。我想我可以用 scipy.optimize curve_fit 来完成那部分,我不明白该怎么做就是使用生成的曲线作为我可以重用的函数。

理想情况下,我会制作一条曲线并得到一个类似于 f(t) = curve(t) 的结果函数,如果我将经过的时间(以分钟为单位)提供给它,它将返回一个阈值,我可以简单地与我当前的利润点进行比较.

我怎样才能以最简单的方式做到这一点?

标签: python

解决方案


好吧,curve_fit接受一个要使用的函数,所以写一个你想象的函数,它可能会估计你的数据并告诉函数把东西放进去。

例如,这是一个快速工作台,它尝试了几个不同的公式(似乎没有一个对您的数据有好处):

import numpy as np
import scipy.optimize


def poly1(x, a, b):
    return a + (x * b)


def poly2(x, a, b, c):
    return a + (x * b) + (x * c ** 2)


def poly3(x, a, b, c, d):
    return a + (x * b) + (x * c ** 2) + (x * d ** 3)


def poly4(x, a, b, c, d, e):
    return a + (x * b) + (x * c ** 2) + (x * d ** 3) + (x * e ** 4)


def exp(x, a, b, c):
    return a * np.exp(-b * x) + c


def make_estimator(func, data):
    xs, ys = zip(*sorted(data.items()))
    popt, pcov = scipy.optimize.curve_fit(func, xs, ys)
    return lambda x: func(x, *popt)


roi = {0: 0.13, 10: 0.07, 30: 0.04, 50: 0.025, 75: 0.017, 360: 0.01, 720: 0.005, 1440: 0}

for fn in (poly1, poly2, poly3, poly4, exp):
    estimator = make_estimator(fn, roi)
    print(fn.__name__)
    for x, y in roi.items():
        print("  ", x, y, estimator(x))

输出(函数名称,然后是 X / 预期 Y / 估计 Y):

poly1
   0 0.13 0.05327832501447001
   10 0.07 0.0527970341388061
   30 0.04 0.051834452387478275
   50 0.025 0.05087187063615046
   75 0.017 0.04966864344699068
   360 0.01 0.035951853490569216
   720 0.005 0.01862538196666843
   1440 0 -0.01602756108113315
poly2
   0 0.13 0.05327825887535825
   10 0.07 0.05279697258050309
   30 0.04 0.05183439999079287
   50 0.025 0.05087182740108176
   75 0.017 0.04966861166394487
   360 0.01 0.03595195226056802
   720 0.005 0.01862564564576985
   1440 0 -0.01602696758379807
poly3
   0 0.13 0.053278611339440854
   10 0.07 0.05279731865610769
   30 0.04 0.051834733289439286
   50 0.025 0.05087214792277088
   75 0.017 0.049668916214438044
   360 0.01 0.03595207473939817
   720 0.005 0.0186255381393882
   1440 0 -0.01602753506068859
poly4
   0 0.13 0.05327798112102359
   10 0.07 0.05279669504099971
   30 0.04 0.051834122880952016
   50 0.025 0.05087155072090255
   75 0.017 0.04966833552083472
   360 0.01 0.035951682240153104
   720 0.005 0.018625383359278658
   1440 0 -0.016027214402470236
exp
   0 0.13 0.12999999999999978
   10 0.07 0.023857142857142858
   30 0.04 0.023857142857142858
   50 0.025 0.023857142857142858
   75 0.017 0.023857142857142858
   360 0.01 0.023857142857142858
   720 0.005 0.023857142857142858
   1440 0 0.023857142857142858


推荐阅读