import numpy as np
import talib
# 示例数据
high = np.array([48.76, 48.81, 48.95, 48.88, 48.84, 49.09, 49.24, 49.36, 49.98, 50.38, 50.44, 50.12, 50.17, 50.80, 50.92, 50.11, 50.28, 50.42, 50.31, 50.33])
low = np.array([48.42, 48.63, 48.84, 48.78, 48.68, 48.89, 49.10, 49.30, 49.52, 49.75, 49.98, 49.55, 49.17, 49.82, 49.96, 50.11, 50.26, 49.42, 49.31, 49.74])
close = np.array([48.70, 48.72, 48.90, 48.87, 48.82, 49.05, 49.20, 49.35, 49.92, 50.19, 50.12, 49.66, 49.83, 50.26, 50.49, 50.36, 50.26, 49.68, 49.86, 50.17])
# TR : MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
# max(Hi, Ci - 1) - min(Li, Ci - 1)
# 49.24,49.05,49.10
# 49.24-49.05=0.19 第7
# 49.09,48.82,48.89
# 49.09-48.82=0.27 第6
# 48.84, 48.87, 48.68
# 48.87 - 48.68=0.19 第5
# 48.88 , 48.90, 48.78
# 48.90-48.78 = 0.12 第4
# 48.95,48.72,48.84
# 48.95- 48.72 =0.23 第3
# 48.81,48.70,48.63
# 48.81-48.63=0.18 第2
# 0.19+0.27+0.19=0.65 5~7
# 0.19+0.27+0.19 /3=0.2166666666666667
# 0.12+0.19+0.27=0.58 4~6
# 0.12+0.19+0.27 /3=0.1933333333333333
# 0.23+0.12+0.19=0.54 3~5
# 0.23+0.12+0.19 /3= 0.18
# 0.18+0.23+0.12=0.53 2~4
# (0.18+0.23+0.12)/3=0.17666666666666667
# 计算ATR
# EMA的计算公式为:
# 在ATR的计算公式中,采用了一种称为“指数平滑移动平均数”的计算方法,这种方法使用一个加权系数来决定每个数据点的权重,系数越大,对应数据点的权重越高。
# 具体来说,在计算第n个数据点的ATR时,需要用到前n-1个数据点的ATR值作为移动平均数的输入,因此使用n-1作为移动平均数的窗口大小。
# 这种计算方法比传统的简单移动平均数更加灵活,能够更好地反映市场波动性的变化。
# 第一个数据点的ATR值为0,因为无法计算前一个数据点的TR。
# 对于第二个数据点,ATR的计算公式是:
# ATR2 = (TR1 + TR2 + TR3) / 3
# = (0.18 + 0.23 + 0.12) / 3
# = 0.53 / 3
# = 0.17666666666666667
# ATR3 = (ATR2 * (n-1) + TR4) / n
# = (0.17666666666666667 * 2 + 0.19) / 3
# = (0.35333334 + 0.19) / 3
# = 0.54333334 / 3
# = 0.1811111133333333
# 对于第四个数据点,ATR的计算公式是:
# ATR = (ATR3 * (n-1) + TR5) / n
# = (0.181111113 * 2 + 0.27) / 3
# = (0.3622222266666667 + 0.27) / 3
# = 0.63222222 / 3
# = 0.2107407422222222
atr = talib.ATR(high, low, close, timeperiod=3)
print("全量ATR:", atr)
# 全量ATR: [ nan nan nan 0.17666667 0.18111111 0.21074074
# 0.20382716 0.18921811 0.3361454 0.43409694 0.44273129 0.48515419
# 0.65676946 0.76451298 0.82967532 0.67978354 0.48652236 0.65768158
# 0.77178772 0.71119181]
for index in range(0, len(high)):
if index > 3:
res = talib.ATR(high[index - 4:index], low[index - 4:index], close[index - 4:index], timeperiod=3)
print('循环',res)
# 循环 [ nan nan nan 0.17666667]
# 循环 [ nan nan nan 0.18]
# 循环 [ nan nan nan 0.19333333]
# 循环 [ nan nan nan 0.21666667]
# 循环 [ nan nan nan 0.20666667]
# 循环 [ nan nan nan 0.32666667]
# 循环 [ nan nan nan 0.47333333]
# 循环 [ nan nan nan 0.57333333]
# 循环 [ nan nan nan 0.55333333]
# 循环 [ nan nan nan 0.67666667]
# 循环 [ nan nan nan 0.85]
# 循环 [ nan nan nan 0.98]
# 循环 [ nan nan nan 0.77333333]
# 循环 [ nan nan nan 0.48]
# 循环 [ nan nan nan 0.49333333]
# 循环 [nan nan nan 0.7]
talib atr 函数 相同数据、相同周期。不同数据长度结果不一样原因
于 2023-09-04 11:14:33 首次发布