量化交易系统开发-实时行情自动化交易-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 和 -DMdata['+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, -DMdata['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 和 -DIdata['+DI'] = 100 * (data['+DM_smooth'] / data['TR_smooth'])data['-DI'] = 100 * (data['-DM_smooth'] / data['TR_smooth'])# 计算 DX 和 ADXdata['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 常与其他技术指标结合使用,以便更好地识别市场的交易机会和风险。
相关文章:
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...
机器学习——期末复习 重点题归纳
第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...
MYSQL——数据更新
一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...
Vite 基础理解及应用
文章目录 概要Vite基础知识点1. 快速启动和热更新热更新原理 2. 基于ES模块的构建3. 对不同前端框架的支持 vite.config.js配置实例1. 基本结构2. 服务器相关配置3. 输入输出路径配置4. 打包优化配置 项目构建一、项目初始化二、项目结构理解三、CSS处理四、静态资源处理五、构…...
[JAVA]用MyBatis框架实现一个简单的数据查询操作
基于在前面几章我们已经学习了对MyBatis进行环境配置,并利用SqlSessionFactory核心接口生成了sqlSession对象对数据库进行交互,执行增删改查操作。这里我们就先来学习如何对数据进行查询的操作,具体查询操作有以下几个步骤 创建实体类创建Ma…...
CSS 样式的优先级?
在CSS中,样式的优先级决定了当多个样式规则应用于同一个元素时,哪个样式会被最终使用。以下是一些决定CSS样式优先级的规则: 就近原则: 最后应用在元素上的样式具有最高优先级。这意味着如果两个选择器都应用了相同的样式…...
Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…...
数据结构《栈和队列》
文章目录 一、什么是栈?1.1 栈的模拟实现1.2 关于栈的例题 二、什么是队列?2.2 队列的模拟实现2.2 关于队列的例题 总结 提示:关于栈和队列的实现其实很简单,基本上是对之前的顺序表和链表的一种应用,代码部分也不难。…...
C# 超链接控件LinkLabel无法触发Alt快捷键
在C#中,为控件添加快捷键的方式有两种,其中一种就是Windows中较为常见的Alt快捷键,比如运行对话框,记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中,实现类似的操作…...
JVM类加载过程-Loading
一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…...
2024年11月19日Github流行趋势
项目名称:build-your-own-x 项目维护者:danistefanovic, rohitpaulk, sarupbanskota 等项目介绍:通过从零开始重新创建你最喜欢的技术来掌握编程。项目star数:312,081项目fork数:29,004 项目名称:freqtrad…...
详细描述一下Elasticsearch索引文档的过程?
大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch索引文档的过程? Elasticsearch的索引文档过程是其核心功能之一,涉及将数据存储到…...
基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果
直接上代码,以下代码基于vue2,需要Vue3或者react可以使用国内直连GPT/Claude来帮你转换下 代码如下: // ScrollCardsGrid.vue <template><div class"scroll-cards-container"><!-- 左箭头 --><div v-show"showLef…...
HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户在应用/元服务内的使用行为向HarmonyOS共享,使得HarmonyOS可以基于共享的数据学习用户的行为习惯。 2.在HarmonyOS学习到用户的行为习惯后,会给用户推荐相应功能&#x…...
【AtCoder】Beginner Contest 380-F.Exchange Game
题目链接 Problem Statement Takahashi and Aoki will play a game using cards with numbers written on them. Initially, Takahashi has N N N cards with numbers A 1 , … , A N A_1, \ldots, A_N A1,…,AN in his hand, Aoki has M M M cards with numbers B …...
30. 并发编程
一、什么是多任务 如果一个操作系统上同时运行了多个程序,那么称这个操作系统就是 多任务的操作系统,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一个程序,它可以同时执行多个事情,那么就称为 多任务的程序。…...
【包教包会】CocosCreator3.x框架——带翻页特效的场景切换
一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2、解压,导入cocos creator(版本3.8.2),可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面,无法实现页面特效。…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
