fix: 指标口径统一——indicators.calc_atr改EMA平滑(与backtest_framework完全一致),消除回测EMA/实盘SMA的3.59%口径分裂,回测实盘同口径

This commit is contained in:
hmo
2026-08-12 10:44:21 +08:00
parent 52b808381c
commit 7836b5cf75
+19 -9
View File
@@ -47,17 +47,27 @@ def calc_rsi(series, n=14):
def calc_atr(klines, n=14): def calc_atr(klines, n=14):
"""ATRAverage True Range),与回测 calc_factors 的 atr_pct 同口径。 """ATRAverage True Range),EMA 平滑——与 backtest_framework.calc_atr 完全一致
klines: [{high, low, close, ...}]""" 2026-08-12 统一口径:原 SMA 与回测 EMA 差 3.59%,回测实盘口径分裂)。
klines: [{high, low, close, ...}]。返回最新 ATR 值(单值)。"""
if len(klines) < n + 1: if len(klines) < n + 1:
return None return None
trs = [] highs = [k["high"] for k in klines]
for i in range(1, len(klines)): lows = [k["low"] for k in klines]
h, l, pc = klines[i]["high"], klines[i]["low"], klines[i - 1]["close"] closes = [k["close"] for k in klines]
tr = max(h - l, abs(h - pc), abs(l - pc)) # True Range(与 backtest_framework.calc_tr 一致)
trs.append(tr) tr = [highs[0] - lows[0]]
atr = sum(trs[-n:]) / n for i in range(1, len(highs)):
return atr hl = highs[i] - lows[i]
hc = abs(highs[i] - closes[i - 1])
lc = abs(lows[i] - closes[i - 1])
tr.append(max(hl, hc, lc))
# EMA 平滑(与 backtest_framework.calc_atr 一致:calc_ema(tr, n)
k = 2 / (n + 1)
ema = tr[0]
for t in tr[1:]:
ema = t * k + ema * (1 - k)
return ema
def calc_obv(klines): def calc_obv(klines):