我有一个值的字典,在这个例子中,键是一个时间间隔,值是一个百分比,目的是查看某个值在一段时间内是否超过了另一个值。这个表是用来决定我们是否出售一个基于时间流逝和获得的回报的投资,随着时间的推移,它变得不那么严格了。
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一起做。优化curve_fit,我不明白如何做的是使用结果曲线作为一个函数,我可以重用。
理想情况下,我会制作一个曲线并得到一个类似于f(t) = curve(t)的结果函数,如果我输入以分钟为单位的经过时间,它将返回一个阈值,我可以简单地将其与当前的盈利点进行比较。
我怎样才能用最简单的方法完成这个?
好吧,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