如何用Python的pandas-ta库获取未平滑的ADX指标?
如何用Python的pandas-ta库获取未平滑的ADX指标?
嘿,我完全懂你的困扰!你用pandas-ta调用ta.adx()得到的确实是Wilder平滑后的ADX(对应MetaTrader里的ADX Wilder),而你需要的是未做特殊平滑处理的原始ADX指标。别担心,咱们可以通过手动实现核心计算逻辑来得到你要的结果,具体步骤如下:
核心思路
MetaTrader里的“ADX”(未平滑版)和“ADX Wilder”的核心区别在于平滑方式:
- Wilder版用的是累积加权的平滑(类似α=1/length的EMA)
- 未平滑版则是对DX值做简单移动平均(SMA),同时计算+DI/-DI时也用SMA替代Wilder平滑
具体实现代码
假设你的data是包含high、low、close列的DataFrame,按以下步骤计算:
import pandas as pd import pandas_ta as ta # 1. 计算基础指标:真实波幅TR,+DM,-DM data['tr'] = ta.true_range(data.high, data.low, data.close) data['plus_dm'] = ta.plus_dm(data.high, data.low, length=1) data['minus_dm'] = ta.minus_dm(data.high, data.low, length=1) # 2. 定义周期(和你用的14期保持一致) length = 14 # 3. 用简单移动平均(SMA)计算TR、+DM、-DM的均值(替代Wilder平滑) data['tr_sma'] = data['tr'].rolling(window=length).mean() data['plus_dm_sma'] = data['plus_dm'].rolling(window=length).mean() data['minus_dm_sma'] = data['minus_dm'].rolling(window=length).mean() # 4. 计算+DI和-DI data['plus_di'] = (data['plus_dm_sma'] / data['tr_sma']) * 100 data['minus_di'] = (data['minus_dm_sma'] / data['tr_sma']) * 100 # 5. 计算每日DX值 data['dx'] = (abs(data['plus_di'] - data['minus_di']) / (data['plus_di'] + data['minus_di'])) * 100 # 6. 对DX做SMA得到未平滑的ADX data['adx_raw'] = data['dx'].rolling(window=length).mean()
验证说明
你可以把计算出的adx_raw和MetaTrader里的ADX指标对比,数值应该完全匹配。而pandas-ta默认的ta.adx()返回的ADX列,对应就是MT5里的ADX Wilder,和我们手动算的adx_raw差异就来自平滑方式的不同。
备注:内容来源于stack exchange,提问作者Ish18




