You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现ZLEMA移动平均 滞后取值与TradingView结果不符

ZLEMA指标实现结果不匹配问题

我已完成**ZLEMA Moving Average(ZLEMA移动平均)**的公式转换
ZLEMA公式参考

但在实现“Data(Lag Days Ago,滞后多日历史数据)”逻辑时存在问题,无法正确回溯获取对应历史值。当前编写的函数可正常运行,但输出结果与TradingView平台的计算结果不匹配,现有实现代码如下:

def fzlema(source,period):
  zxLag     = period / 2 if (period / 2) == np.round(period / 2) else (period - 1) / 2
  zxLag     = int(zxLag) 
  zxEMAData = source + (source - source.iloc[zxLag])  # Probably error is in this line
  zlema     = zxEMAData.ewm(span=period, adjust=False).mean()
  zlema     = np.round(zlema,2)
  return zlema

zlema =  fzlema(dataframe['close'], 50)

已尝试使用iloc[..]和tail(..)方法取值,均无法得到准确结果,开发仅可使用pandas和numpy库,求问题排查思路。


问题排查与修正方案

核心错误就在你标注的那行:source.iloc[zxLag]取的是整个序列固定位置第zxLag行的单个静态值,所有行都减了同一个常数,完全不符合ZLEMA“每个时点价格减去该时点往前zxLag期对应价格”的逻辑,结果自然和TradingView对不上。

  • 滞后取值不要用固定位置的iloc,pandas处理时序数据回溯N期值的标准方法是shift(N),会逐行对齐取对应N期前的数值。
  • 你的zxLag计算逻辑也和TradingView官方实现不一致,官方ZLEMA的滞后周期统一用int((period - 1)/2),不需要额外做奇偶判断。

修正后可直接对齐TradingView结果的代码如下:

import numpy as np
import pandas as pd

def fzlema(source, period):
    # 对齐TradingView官方滞后周期规则
    zxLag = int((period - 1) / 2)
    # 逐行偏移取zxLag期前的历史值
    zxEMAData = source + (source - source.shift(zxLag))
    # ewm参数保持adjust=False即可和TradingView的EMA计算逻辑对齐
    zlema = zxEMAData.ewm(span=period, adjust=False).mean()
    zlema = np.round(zlema, 2)
    return zlema

zlema = fzlema(dataframe['close'], 50)
  • 校验注意点:计算前先确认收盘价序列是按时间从早到晚升序排列的,时序乱序的话shift()取到的滞后值会完全错误;前zxLag行因为没有足够历史数据会返回NaN,和TradingView初始阶段无输出的表现一致,不需要额外填充。

内容的提问来源于stack exchange,提问作者Turi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:22:04