Python实现ZLEMA移动平均 滞后取值与TradingView结果不符
ZLEMA指标实现结果不匹配问题
我已完成**ZLEMA Moving Average(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
相关产品推荐
相关产品推荐

