VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 9
声望: 0

我发现这个问题是用vnpy策略回测时ArrayManager类里是每次获取100个数据计算的atr与在回测结果时候画线时候,全量获取atr。数据不一致。

description

description

为了易于理解,我写了一个简单的示例,以及运行结果

description

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]
Member
avatar
加入于:
帖子: 1472
声望: 105

这块需要看下talib的C++源代码内部ATR函数的逻辑实现了,不过猜测原因可能是计算用的缓存长度或者平均值算法有关(比如EMA,导致最终结果和起始点数值相关)

Member
avatar
加入于:
帖子: 9
声望: 0

MTF wrote:

这块需要看下talib的C++源代码内部ATR函数的逻辑实现了,不过猜测原因可能是计算用的缓存长度或者平均值算法有关(比如EMA,导致最终结果和起始点数值相关)
是的,最终确定是因为talib里ATR计算使用了EMA导致,所以在回测图形时候都要按照数组管理器里一致的长度,不能全量计算

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】