Python实现TradingView SMMA(平滑移动平均线)结果不符,求错误排查
问题排查与修复方案
核心错误原因
你代码的问题出在SMMA计算的时间顺序完全颠倒:
- 正确逻辑:用序列最早的
length个数据计算初始SMA,再顺着时间从旧到新迭代后续所有数据计算SMMA - 你的逻辑:用序列末尾的
length个数据计算初始SMA,再重复用末尾的后续数据迭代,等于已经计入初始SMA的数值被重复代入公式计算,结果自然和TradingView不一致。
修正后的代码
import pandas as pd import logging as log def smma(src, length): data_length = len(src) if data_length < length: raise ValueError("数据源长度不能小于计算周期") # 取最早的length个数据计算初始SMA,对应第一个有效SMMA值 initial_sma = pd.Series(src[:length]).mean() current_smma = initial_smma log.info(f"First smma value = {current_smma}") # 从初始SMA之后的第一个新数据开始迭代计算 for i in range(length, data_length): current_smma = (current_smma * (length - 1) + float(src[i])) / length log.info(f"索引 = {i} src[i] = {src[i]} smma = {current_smma}") return current_smma
额外注意事项
请确认你的src列表排序和TradingView一致:索引越小对应时间越早的K线数据,索引越大对应时间越新的K线数据,如果排序颠倒也会导致计算结果偏差。
如果需要返回所有历史SMMA值而非仅最新值,迭代时把每个current_smma存入列表返回即可。
内容的提问来源于stack exchange,提问作者Greggy
相关产品推荐
相关产品推荐

