You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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是包含highlowclose列的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

火山引擎 最新活动