问题描述
在尝试为以下附加数据找到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"])
为此,我必须使用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
解决方法
您好像是新用户。欢迎使用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)
尽管如此,我个人还是建议不要这样做。从头开始构建所有内容只会浪费您的时间。如果您需要使用连续添加的数据来计算随时间变化的标准偏差,我认为有两种简单的方法可以做到这一点:
-
只需继续从整个数据集中重新计算它。这样会比较慢,但是您的代码将更易于查看和调整。
-
第一次计算标准偏差,然后对于要添加的每个新数据,计算将对标准偏差进行更改多少,然后更新道路。可能看起来像这样:
# 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)
然后,您只需要使用类似的方法更新均值即可。