首页 > 解决方案 > 尝试在 python 中找到平均标准偏差,就像在 excel 函数 avgstd() 中一样

问题描述

在尝试查找CCI以下附加数据的索引时。我面临一个问题。如果我们使用下面的代码来查找CCI9 个周期移动平均线的值,则该值将在 89 左右。但实际CCI值为 105。问题是计算标准偏差的方式。因为CCI我们必须计算平均标准偏差。

df["TP"] = (df['HIGH'] + df['LOW'] + df['CLOSE']) / 3
df["SMATP"]=df["TP"].rolling(n, min_periods=n).mean()
df["AVSTDTP"]=df["TP"].rolling(n, min_periods=n).std()
df["CCI"]=(df["TP"]-df["SMATP"])/(.015*df["AVSTDTP"])

错误的 CCI 值图像

为此,我必须使用for循环来找到正确的CCI值。AVGSTD执行偏差是否有更好的价值。CCI因此可以找到正确的值。下面的代码工作正常,但有没有更好的方法来获得结果。

df["TP"] = (df['HIGH'] + df['LOW'] + df['CLOSE']) / 3
df["SMATP"]=df["TP"].rolling(n, min_periods=n).mean()
df["AVSTDTP"]=None
#df["AVSTDTP"]=df["TP"].rolling(n, min_periods=n).std()
for row in range(len(df)):
    if(row >= n-1):
        variances=0
        for row1 in range(n):
            variances=variances+abs(df["SMATP"].iloc[row] - df["TP"].iloc[row-row1])
        df["AVSTDTP"].iloc[row] = variances/n
df["CCI"]=(df["TP"]-df["SMATP"])/(.015*df["AVSTDTP"])

正确的 CCI 值

以下是供参考的数据。

DATE_TIME       OPEN    HIGH    LOW CLOSE
18-08-2020 09:19    492.2   496.8   491.85  494.5
18-08-2020 09:24    494.5   498 493.25  497.45
18-08-2020 09:29    497.1   497.7   494.85  496.25
18-08-2020 09:34    496.35  496.75  495 495.5
18-08-2020 09:39    495.5   496.35  495 495.35
18-08-2020 09:44    495.3   496.45  495 496.4
18-08-2020 09:49    496.35  501.35  495.65  501.2
18-08-2020 09:54    501.2   502 499.35  501.45
18-08-2020 09:59    501.55  501.85  499.2   500.2
18-08-2020 10:04    500.45  500.65  499.4   500.15
18-08-2020 10:09    500.05  502.8   499.6   501.05
18-08-2020 10:14    501.3   504 501.3   503.5
18-08-2020 10:19    503.8   505.25  503.55  505 

标签: pythonaveragestandardsstandard-deviation

解决方案


看起来你是一个新用户。欢迎来到 StackOverflow

您实际上不需要做任何这些工作,有一个 Python 模块用于计算和返回标准偏差。numpy在这里有一个非常有用的可调用函数std 。

如果您确实想使用自己的函数,则可以将其组织为如下所示。

import math

data = [2, 2, 5, 7, 1, 2, 3, 5, 7]
deviations = [] # this is where we will store the deviations 


# Calculate the mean
mean = 0 
for a in range(0, len(data) ):
    mean = mean + data[a]
mean = mean / len(data)

# Find the deviations 
for a in range(0, len(data) ):
    dev = data[a] - mean 
    deviations.append(dev)
print(deviations)

# Square those values 
for a in range(0, len(data) ):
    dev = deviations[a] * deviations[a] # squared
    deviations[a] = dev 
    
# Take len(data) minus one, and divide the sum(data^2) by that
summation = sum( deviations )
meanmean = summation / ( len(data) - 1)

# Take the square root of that value as our standard deviation 
standard = math.sqrt(meanmean)

不过,就个人而言,我建议不要这样做;从头开始构建一切只会浪费你的时间。如果您需要使用不断添加的数据计算随时间变化的标准偏差,我认为有两种简单的方法可以做到这一点:

  1. 只需继续从整个数据集中重新计算它。这会更慢,但你的代码会更容易查看和调整。

  2. 第一次计算标准偏差,然后对于您要添加的每条新数据,计算它将改变标准偏差多少,并以这种方式更新值。这可能看起来像这样:

# where "add" is the new piece of data we are adding to the set 
deviation = add - mean # how much does this new piece of data deviate from the mean 
devsquare = deviation * deviation 
dev = math.sqrt(devsquare)

offset = dev / len(data)
data.append(add)

然后你只需要使用类似的东西来更新平均值。


推荐阅读