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):
"""ATRAverage True Range),与回测 calc_factors 的 atr_pct 同口径。
klines: [{high, low, close, ...}]"""
"""ATRAverage True Range),EMA 平滑——与 backtest_framework.calc_atr 完全一致
2026-08-12 统一口径:原 SMA 与回测 EMA 差 3.59%,回测实盘口径分裂)。
klines: [{high, low, close, ...}]。返回最新 ATR 值(单值)。"""
if len(klines) < n + 1:
return None
trs = []
for i in range(1, len(klines)):
h, l, pc = klines[i]["high"], klines[i]["low"], klines[i - 1]["close"]
tr = max(h - l, abs(h - pc), abs(l - pc))
trs.append(tr)
atr = sum(trs[-n:]) / n
return atr
highs = [k["high"] for k in klines]
lows = [k["low"] for k in klines]
closes = [k["close"] for k in klines]
# True Range(与 backtest_framework.calc_tr 一致)
tr = [highs[0] - lows[0]]
for i in range(1, len(highs)):
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):