使用fsolve在Python中找到两个平均值相交所需的价格



我正试图在Python中创建一个函数,以求解两个不同长度的数据集上的两个移动平均值所需的相等值。例如,数据集

5
2
34
54
5
Average = 14

7
4
11
5
56
7
8
Average = 20

我想求解某个数字X,使它们都等于相同的平均值。我相信scipy中的fsolve函数可以很容易地做到这一点,但问题是我想使用类似于panda的.rolling函数的东西来做到这一步,这样这个公式就可以应用于移动数千行数据的滚动数据集。

所以,我设想了一些像下面这样的功能,尽管它显然不起作用。为了澄清,count_变量的值为+1,因为我设想只查看一个尾随的数据集,它是我要查找的实际平均值集的-1。非常感谢您的帮助,谢谢!

def equations(short_ma, long_ma, p):
sum_short = short_ma.sum()
sum_long = long_ma.sum()
count_short = short_ma.count() + 1
count_long = long_ma.count() + 1
ptv, eq_var = p
return (((sum_short + ptv) / count_short) - eq_var, ((sum_long + ptv) / count_long) - eq_var)
def rolling_equations(ptv, eq_var):
ptv, eq_var = fsolve(equations, (1,1))
return ptv

您不需要数值求解器来求解一个变量的线性方程(此外,如果是线性方程组,则应使用linalg,但它仅从两个方程开始(。如果你想要

(a.sum()+eqVar)/(a.size+1) == (b.sum()+eqVar)/(b.size+1)

然后

eqVar == (b.sum()/(b.size()+1)-a.sum()/(a.size+1))/(1/(a.size+1)-1/(b.size+1)) ==
== (b.sum()/(b.size()+1)-a.sum()/(a.size+1))*((a.size+1)(b.size+1)/(a.size-b.size)) ==
== ((a.size+1)*b.sum()-(b.size+1)*a.sum())/(a.size-b.size)

如果我的数学没有错的话。为了更简单,假设您只想在第一列中添加一个值来将它们相等(如果需要,您可以仔细检查并使用以上内容(:

import numpy  as np
import pandas as pd
def eqVar(df):
a = df[0] 
b = df[1] 
return b.sum()*(a.size+1)/b.size-a.sum()
df = pd.DataFrame(np.random.random(20).reshape(-1,2))
df.rolling(4).apply(eqVar)

你可以选择一条不太清晰的线:

df.rolling(4).apply(lambda d: d[1].sum()*(d[0].size+1)/d[1].size-d[0].sum())

以下是我最终所做的,有效地模仿了@cabanus的建议。注意,我有另一个名为arguments1的模块,它导入变量。

import pandas as pd
import numpy as np
from arguments1 import *
def common_value_solver(range):
short_ma = arguments1.short_ma
long_ma = arguments1.long_ma
sum_short = range.tail(short_ma-1).sum()
sum_long = range.tail(long_ma-1).sum()
count_short = short_ma_arg
count_long = long_ma_arg
ptv = ((count_long * sum_short) - (count_short * sum_long) / (count_short - count_long))
return ptv

最新更新