量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来继续说说A股平均趋向指数实现。

平均趋向指数(ADX,Average Directional Index)是一种衡量市场趋势强度的技术指标,广泛用于判断 A 股市场的趋势强弱,而不判断趋势方向。ADX 是基于正向趋向指标 (+DI) 和负向趋向指标 (-DI) 计算得出的一个趋势强度指标,通常用于确认趋势是否强劲。以下是通过 Python 和 Tushare 实现 A 股市场的 ADX 指标的代码示例。

1. ADX 的基本组成
  • +DI(Positive Directional Indicator):衡量价格上升的强度。

  • -DI(Negative Directional Indicator):衡量价格下降的强度。

  • ADX:基于 +DI 和 -DI 计算的指数,用于衡量趋势的强度,而非方向。

2. 获取 A 股数据

使用 Tushare 获取 A 股的股票数据,确保你有 Tushare 的 API token。

复制代码
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt

# 设置 Tushare token
ts.set_token('your_tushare_token')
pro = ts.pro_api()

# 获取 A 股的日线数据(以贵州茅台为例)
def get_a_stock_data(stock_code, start_date, end_date):
    df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)
    df = df[['trade_date', 'high', 'low', 'close']]
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    df.set_index('trade_date', inplace=True)
    df = df.sort_index()
    return df

# 获取贵州茅台(600519.SH)的日线数据
stock_code = '600519.SH'
start_date = '20200101'
end_date = '20221231'
stock_data = get_a_stock_data(stock_code, start_date, end_date)
3. 计算 ADX 指标
复制代码
# 计算 ADX 指标
def calculate_adx(data, window=14):
    """
    计算平均趋向指数 (ADX) 指标。

    :param data: 股票数据的 pandas DataFrame,必须包含 'high', 'low', 'close' 列
    :param window: ADX 的窗口大小,通常为 14
    :return: 包含 ADX 指标的 DataFrame
    """
    # 计算 True Range (TR)
    data['tr1'] = data['high'] - data['low']
    data['tr2'] = abs(data['high'] - data['close'].shift(1))
    data['tr3'] = abs(data['low'] - data['close'].shift(1))
    data['TR'] = data[['tr1', 'tr2', 'tr3']].max(axis=1)

    # 计算 +DM 和 -DM
    data['+DM'] = np.where((data['high'] - data['high'].shift(1)) > (data['low'].shift(1) - data['low']), 
                           data['high'] - data['high'].shift(1), 0)
    data['+DM'] = np.where(data['+DM'] < 0, 0, data['+DM'])
    data['-DM'] = np.where((data['low'].shift(1) - data['low']) > (data['high'] - data['high'].shift(1)), 
                           data['low'].shift(1) - data['low'], 0)
    data['-DM'] = np.where(data['-DM'] < 0, 0, data['-DM'])

    # 计算平滑的 TR, +DM, -DM
    data['TR_smooth'] = data['TR'].rolling(window=window).sum()
    data['+DM_smooth'] = data['+DM'].rolling(window=window).sum()
    data['-DM_smooth'] = data['-DM'].rolling(window=window).sum()

    # 计算 +DI 和 -DI
    data['+DI'] = 100 * (data['+DM_smooth'] / data['TR_smooth'])
    data['-DI'] = 100 * (data['-DM_smooth'] / data['TR_smooth'])

    # 计算 DX 和 ADX
    data['DX'] = 100 * abs(data['+DI'] - data['-DI']) / (data['+DI'] + data['-DI'])
    data['ADX'] = data['DX'].rolling(window=window).mean()

    return data

# 计算贵州茅台的 ADX 指标
stock_data = calculate_adx(stock_data)

# 打印结果
data[['high', 'low', 'close', '+DI', '-DI', 'ADX']]

# 绘制 ADX 图表
plt.figure(figsize=(12, 8))
plt.subplot(2, 1, 1)
plt.plot(stock_data.index, stock_data['close'], label='Close Price', color='blue')
plt.title(f'{stock_code} Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(stock_data.index, stock_data['+DI'], label='+DI', color='green')
plt.plot(stock_data.index, stock_data['-DI'], label='-DI', color='red')
plt.plot(stock_data.index, stock_data['ADX'], label='ADX', color='blue')
plt.title('ADX Indicator')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid()

plt.tight_layout()
plt.show()
4. 代码解释
  • 获取数据 :我们使用 Tushare 的 pro.daily 接口获取贵州茅台的日线数据,数据包括最高价、最低价和收盘价。

  • 计算 True Range (TR):TR 是衡量市场波动的真实范围,计算方式为最高价与最低价的差值、前一日收盘价与最高价的差值、前一日收盘价与最低价的差值三者中的最大值。

  • +DM 和 -DM:+DM 和 -DM 分别表示向上和向下的价格动向,用于衡量价格上涨和下跌的强度。

  • +DI 和 -DI:+DI 和 -DI 分别表示正向和负向的趋向指标,表示价格上涨或下跌的强度相对于真实范围的百分比。

  • DX 和 ADX:DX 是 +DI 和 -DI 的差值的绝对值除以其和的百分比,用于衡量趋势的强弱。ADX 是 DX 的移动平均值,表示趋势强度的平滑值。

5. 使用 ADX 的交易信号
  • 趋势强度判断:当 ADX 高于 25 时,通常表示市场处于强趋势状态,无论是上升趋势还是下降趋势;当 ADX 低于 20 时,表示市场处于无趋势状态或震荡阶段。

  • 结合 +DI 和 -DI:当 +DI 高于 -DI 且 ADX 上升时,表明上升趋势强烈,可以考虑买入;当 -DI 高于 +DI 且 ADX 上升时,表明下跌趋势强烈,可以考虑卖出。

6. 总结

平均趋向指数(ADX)是 A 股市场中衡量趋势强度的重要工具,通过分析 +DI、-DI 和 ADX 的变化,交易者可以判断当前市场是否具有明确的趋势,以及趋势的强度。ADX 常与其他技术指标结合使用,以便更好地识别市场的交易机会和风险。

相关推荐
流水落花春去也5 分钟前
用yolov8 训练,最后形成训练好的文件。 并且能在后续项目使用
python
Coding茶水间5 分钟前
基于深度学习的水果检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
Serendipity_Carl6 分钟前
数据可视化实战之链家
python·数据可视化·数据清洗
檐下翻书1738 分钟前
算法透明度审核:AI 决策的 “黑箱” 如何被打开?
人工智能
undsky_10 分钟前
【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力
人工智能·spring boot·后端·ai·ruoyi
网易伏羲21 分钟前
网易伏羲受邀出席2025具身智能人形机器人年度盛会,并荣获“偃师·场景应用灵智奖
人工智能·群体智能·具身智能·游戏ai·网易伏羲·网易灵动·网易有灵智能体
搬砖者(视觉算法工程师)25 分钟前
什么是无监督学习?理解人工智能中无监督学习的机制、各类算法的类型与应用
人工智能
西格电力科技31 分钟前
面向工业用户的绿电直连架构适配技术:高可靠与高弹性的双重设计
大数据·服务器·人工智能·架构·能源
小裴(碎碎念版)31 分钟前
文件读写常用操作
开发语言·爬虫·python
TextIn智能文档云平台35 分钟前
图片转文字后怎么输入大模型处理
前端·人工智能·python