python - 尝试在 python 中找到平均标准偏差,就像在 excel 函数 avgstd() 中一样
问题描述
在尝试查找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
解决方案
看起来你是一个新用户。欢迎来到 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)
不过,就个人而言,我建议不要这样做;从头开始构建一切只会浪费你的时间。如果您需要使用不断添加的数据计算随时间变化的标准偏差,我认为有两种简单的方法可以做到这一点:
只需继续从整个数据集中重新计算它。这会更慢,但你的代码会更容易查看和调整。
第一次计算标准偏差,然后对于您要添加的每条新数据,计算它将改变标准偏差多少,并以这种方式更新值。这可能看起来像这样:
# 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)
然后你只需要使用类似的东西来更新平均值。
推荐阅读
- react-native - 世博会:无法解析模块 './debugger
- reactjs - Reducer 不会在触发动作时更新状态,因此不会更新 redux 存储/状态
- javascript - 从 config.js AngularJS 中提取基本 url
- mysql - 需要解决一个MYSQL选择查询
- laravel - 如何在控制器方法中传递模型时使用 where 子句在 Laravel 中获取结果
- ios - 在 UIScrollViewDelegate 方法中获取 UIScrollView 的类型
- javascript - 尝试导入错误:“PrivateRoute”未从“react-router-dom”导出
- c# - 创建 XML 子节点,省略父节点
- powershell - 将人员添加到人员字段共享点
- javascript - 使用 javascript 的带有 reactjs 的图像模式