一句话回答: DMA(Different of Moving Average,平行线差)是「短期均线 − 长期均线」的差值,再对差值取一条 M 日均线得到信号线 AMA。DMA 上穿 AMA 或上穿零轴视为转强、反之转弱。用 AlphaFeed 取回前复权日线后,几行 pandas 就能算出 DMA 与 AMA,完全不需要 TA-Lib。
只看单条均线容易滞后、也难判断趋势强弱变化。DMA 用「快慢两条均线的差」把趋势的加速/减速放大出来:差值扩大说明趋势增强,差值收敛说明趋势走弱。坑在于:一是要用前复权价,否则除权跳空让均线差失真;二是不同软件默认参数(10/50/10)要对齐,否则数值对不上。
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
df = af.klines.get("600519.SH", period="1d", count=250,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)均线差对价格连续性敏感,务必用
adjust="forward"(前复权),避免除权断层。
def dma(close: pd.Series, short: int = 10, long: int = 50, m: int = 10):
ddd = close.rolling(short).mean() - close.rolling(long).mean() # 快慢均线差
ama = ddd.rolling(m).mean() # 信号线
return ddd, ama
df["DMA"], df["AMA"] = dma(df["close"], short=10, long=50, m=10)
print(df[["trade_date", "close", "DMA", "AMA"]].tail(5).to_string(index=False))参数与含义:
参数/字段 | 含义 | 常用值 |
|---|---|---|
| 短期均线周期 | 10 |
| 长期均线周期 | 50 |
| 信号线 AMA 平均周期 | 10 |
| 短期均线 − 长期均线 | 围绕 0 轴波动 |
| DMA 的 m 日均线 | 金叉/死叉参照 |
prev_d, prev_a = df["DMA"].iloc[-2], df["AMA"].iloc[-2]
cur_d, cur_a = df["DMA"].iloc[-1], df["AMA"].iloc[-1]
if prev_d <= prev_a and cur_d > cur_a:
print("DMA 上穿 AMA:金叉(偏多)")
elif prev_d >= prev_a and cur_d < cur_a:
print("DMA 下穿 AMA:死叉(偏空)")
print("趋势方向:", "多头" if cur_d > 0 else "空头") # DMA>0 多头,<0 空头codes = ["600519.SH", "000001.SZ", "601318.SH", "000858.SZ", "300750.SZ"]
data = af.klines.batch(codes, period="1d", count=120,
adjust="forward", to_dataframe=True) # dict{symbol: DataFrame}
hits = []
for sym, k in data.items():
k = k.sort_values("trade_date")
d, a = dma(k["close"])
if d.iloc[-2] <= a.iloc[-2] and d.iloc[-1] > a.iloc[-1]:
hits.append(sym)
print("今日 DMA 金叉:", hits)long + m 需要预热期,count 建议 ≥ long+m+若干,忽略序列最前面若干根。Q:DMA 和 MACD 有什么区别?
A:MACD 用 EMA 差 + DEA 信号线;DMA 用简单均线(SMA)差 + 其均线 AMA。DMA 更直观、偏中长线,MACD 更常用、对短期更敏感。
Q:参数怎么选?
A:默认 10/50/10 适合中线。想更灵敏可缩短周期(如 5/20/5),更平滑则拉长。先用默认值观察。
Q:为什么前面几十行是 NaN?
A:长周期均线(如 50 日)和信号线滚动平均都需要预热期,序列头部 NaN 属正常,样本取足够长即可。
Q:需要付费吗?
A:单只历史日线有免费额度;全市场批量筛 DMA(klines.batch + universes)需 Starter 及以上。详见定价页。
DMA 平行线差的本质是「快慢均线的差值 + 其信号线」,用差值放大趋势的加速与减速。实现只需 pandas 的 rolling,不依赖 TA-Lib。关键是用前复权价、参数与软件对齐。用 AlphaFeed 取回前复权日线,从单股信号到全市场金叉筛选都能几行搞定。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。