# 移动均线 (Moving Average, MA) 是将一段时间 (也叫窗口) 内资产收盘价的平均价格连成曲线,用以显示价格趋势的一种技术指标。
# 在下面是数据中我们假设第二列的数据就是收盘价
# i 是从0 开始计数的
data = [
[2320.26, 2320.26, 2287.3, 2362.94],
[2300, 2291.3, 2288.26, 2308.38],
[2295.35, 2346.5, 2295.35, 2345.92],
[2347.22, 2358.98, 2337.35, 2363.8],
[2360.75, 2382.48, 2347.89, 2383.76],
]
print(len(data))
def calculate_ma(day_count: int, d): # day_count 就是每一次滑动的窗口 d是输入的数据
result: List[Union[float, str]] = []
for i in range(len(d)):
if i < day_count: #小于滑动的窗口时用“-”来代替值
result.append("-")
print('我这是第{}次窗口里面数据不足落空了'.format(i))
continue
sum_total = 0.0
for j in range(day_count): #在每一个对应的窗口大小里面
print('即将加上的数字【{},1】是:'.format(i - j),float(d[i - j][1]))
sum_total += float(d[i - j][1])
print('这一个窗口的总和',sum_total) #到此计算了一个窗口下的平均价格,下一个循环中i+1,也就是窗口向后面一栋一格
print('上面这个除以窗口长度{}后就是 MA:'.format(day_count),abs(float("%.3f" % (sum_total / day_count))))
result.append(abs(float("%.3f" % (sum_total / day_count))))
return result
y=calculate_ma(day_count=2, d=data)
print(y)
输出结果是:
5 我这是第0次窗口里面数据不足落空了 我这是第1次窗口里面数据不足落空了 即将加上的数字【2,1】是: 2346.5 即将加上的数字【1,1】是: 2291.3 这一个窗口的总和 4637.8 上面这个除以窗口长度2后就是 MA: 2318.9 即将加上的数字【3,1】是: 2358.98 即将加上的数字【2,1】是: 2346.5 这一个窗口的总和 4705.48 上面这个除以窗口长度2后就是 MA: 2352.74 即将加上的数字【4,1】是: 2382.48 即将加上的数字【3,1】是: 2358.98 这一个窗口的总和 4741.46 上面这个除以窗口长度2后就是 MA: 2370.73 ['-', '-', 2318.9, 2352.74, 2370.73]
算法取自官方文档
值得注意的是for循环的第一个i是0开始的
对于为什么一开始是两个空而不是一个空,
按照官方文档的计算方法,当前的MA的值是它和n(n=前面圈口大小)个数字求和后除以窗口大小,那么其实第二个应该也是有值的啊
「更新」:官网已经反馈,将尽快更新。