我发现这个问题是用vnpy策略回测时ArrayManager类里是每次获取100个数据计算的atr与在回测结果时候画线时候,全量获取atr。数据不一致。
为了易于理解,我写了一个简单的示例,以及运行结果
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.12+0.19+0.27=0.58 4~6
# 0.23+0.12+0.19=0.54 3~5
# 0.18+0.23+0.12=0.53 2~4
# (0.18+0.23+0.12)/3=0.17666666666666667
# 计算ATR
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]