尝试像在excel函数avgstd中一样在python中找到平均标准偏差

问题描述

在尝试为以下附加数据找到CCI索引时。我面临一个问题。如果我们在下面使用 代码以找到9个周期移动平均值的CCI值,该值大约为89。但是实际的CCI值为105。问题是std偏差的计算方式。对于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"])

Wrong CCI values image

为此,我必须使用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"])

Correct CCI Values

以下是参考数据。

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 

解决方法

您好像是新用户。欢迎使用StackOverflow

您实际上不需要执行任何工作,这里有一个用于计算和返回标准偏差的Python模块。 numpy has a callable function std,在这里非常有用。

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

import math

data = [2,2,5,7,1,3,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)

然后,您只需要使用类似的方法更新均值即可。