Python:平均方向指数 (ADX) 4 方向移动系统计算

这段文字是关于股票指标教程系列中,如何计算平均方向指数(ADX)的讲解。

教程首先回顾了之前计算出的正向指标(+DI)和负向指标(-DI),这些指标是ADX的一部分。接着,教程开始定义ADX,并使用代码进行计算。

代码中,首先定义了两个变量,分别代表正向指标和负向指标的长度。然后,由于在之前的计算中,只考虑了从第二天开始的价格,因此在计算ADX时,需要考虑从第一个数据点开始的所有数据。

接下来,代码开始计算DX,即方向指标。DX的计算公式为:100 * |(+DI - -DI)| / (+DI + -DI)。代码中使用循环遍历所有数据点,并计算每个数据点的DX值。

最后,为了得到ADX,需要对DX进行14周期指数移动平均(EMA)。教程解释了,对DX进行EMA和对DX计算公式中所有指标进行EMA,然后乘以100的效果是一样的。

总结来说,这段文字详细讲解了如何通过代码计算ADX,包括计算DX和对DX进行EMA的步骤。教程还强调了在进行计算时,需要考虑数据点从第一个数据点开始的情况。

本视频教你如何在 Python 中计算平均方向指数 (ADX),ADX 是 Welles Wilder 开发的方向性移动系统的一部分。 本系列的目的是在 Python 中教授数学知识。 为此,我们将使用技术分析中常用的许多流行的股票指标。 对于大多数指标,我们将首先讨论它们,它们的用途,然后教授如何在 Python 中编程它们,最后将它们实际显示在图表上。基本的图表应用程序来自之前的教程系列,这里:http://www.youtube.com/playlist?list=PLQVvvaa0QuDcR-u9O8LyLR7URiKuW-XZq所需文件:实际图表部分的示例代码:http://sentdex.com/sentiment-analysisbig-data-and-python-tutorials-algorithmic-trading/python-matplotlib-sample-code-charting-stocks-python/Python:http://python.orgNumpy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpyMatplotlib:http://matplotlib.org/downloads.html

### 实现ADX指标的纯Python代码 为了计算ADX平均方向指数),需要先理解其构成部分。ADX由正向和负向方向线(+DI 和 -DI)、真实波动范围(TR)、以及平滑后的True Range (ATR)组成。 #### 正向和负向方向线 (+DI 和-DI) 这些值基于高低价差的变化来衡量上升或下降趋势的力量: \[ +DM = \begin{cases} High_t - High_{t-1}, & \text{if } High_t - High_{t-DM = \begin{cases} Low_{t-1} - Low_t, & \text{if } Low_{t-1} - Low_t > High_t-High_{t-1}\\ 0, & otherwise \end{cases} \] 其中 \( t \) 表示当前周期,\( t-1 \) 是前一周期的数据[^3]。 #### 平均真波幅 (ATR) 这是用来标准化其他变量的一种方法: \[ TR=\max[(H-L),|H-C_{prev}|, |L-C_{prev}|]\] 这里 H 代表最高价 L 最低价 C_prev 昨收价。之后 ATR 就是对一定时期内所有 True Ranges 的简单移动平均数。 以下是完整的 Python 实现,不依赖于 `talib` 库: ```python import numpy as np def calculate_adx(highs, lows, closes, period=14): """Calculate ADX without using Talib.""" # 初始化 DM+, DM-, TR 数组 plus_dm = [] minus_dm = [] tr_values = [] for i in range(1, len(closes)): move_up = highs[i] - highs[i-1] move_down = lows[i-1] - lows[i] if move_up > move_down and move_up > 0: plus_dm.append(move_up) else: plus_di.append(0) if move_down > move_up and move_down > 0: minus_dm.append(move_down) else: minus_dm.append(0) tr_value = max( abs(highs[i]-lows[i]), abs(highs[i]-closes[i-1]), abs(lows[i]-closes[i-1]) ) tr_values.append(tr_value) atr = sum(tr_values[:period]) / float(period) plus_dms_smoothed = smooth_data(plus_dm, period)[period:] minus_dms_smoothed = smooth_data(minus_dm, period)[period:] di_plus = 100 * (np.array(plus_dms_smoothed)/atr) di_minus = 100 * (np.array(minus_dms_smoothed)/atr) dx_series = 100 * abs((di_plus-di_minus)/(di_plus+di_minus)) adx = moving_average(dx_series.tolist(), n=period)[-1] return adx def smooth_data(data_list, window_size): weights = np.repeat(1.0, window_size)/window_size smoothed_data = np.convolve(data_list, weights, 'valid') return smoothed_data def moving_average(values, n): ret = np.cumsum(values, dtype=float) ret[n:] = ret[n:] - ret[:-n] return ret[n - 1:] / n high_prices = [78.95, 79.26, ... ] # 用户需提供具体数据序列 low_prices = [... ] close_prices = [...] print(f"The calculated ADX value is {calculate_adx(high_prices, low_prices, close_prices)}") ``` 此函数实现了ADX的核心逻辑并返回最终的结果。需要注意的是,在实际应用中应当替换掉示例中的价格列表为真实的市场价格数据[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sentdex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值