【问题标题】:Try to find Average Standard deviation in python like in excel function avgstd()尝试在 python 中找到平均标准偏差,就像在 excel 函数 avgstd() 中一样
【发布时间】:2021-01-17 22:44:37
【问题描述】:

在尝试查找以下附加数据的 CCI 索引时。我面临一个问题。如果我们在下面使用 查找CCI 9 个周期移动平均线的值的代码,该值在 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"])

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

以下是数据供参考。

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 

【问题讨论】:

    标签: python average standards standard-deviation


    【解决方案1】:

    看来您是新用户。欢迎使用 StackOverflow

    您实际上不需要做任何这些工作,有一个 Python 模块用于计算和返回标准偏差。 numpy has a callable function 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)
    

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

    【讨论】:

    • 您好约翰,谢谢您的回答。当然,我会尝试根据您的建议工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    相关资源
    最近更新 更多