三十五、ADX+DMI 组合策略

该Python代码示例展示了如何使用talib库计算ADX和DMI指标,结合双均线策略进行交易决策。ADX用于衡量趋势强度,当ADX和DMI的信号一致时,发出做多或做空的交易提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python# -*- coding: utf-8 -*-import talibimport cross_order as orderimport time# ADX、DMI指标数据周期
adx_period = 14
dmi_period = 14
ma_short_period = 5
ma_long_period = 20'''ADX、DMI指标策略示例[什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋势衡量指标。通常与趋向系统(DMI)一起使用,利用多空趋向之变化差离与总和判定平均趋势,ADX数值不能显示趋势的发展方向。 但是如果趋势存在,ADX可以衡量趋势的强度。[ADX的计算方法(默认区间14天)] Step 1. 计算Directional movement (动向变化值)+DM:当日最高价比昨日最高价高并且当日最低价比昨日最低价高,即为上升动向+DM。上升幅度为:当日最高价减去昨日最高价。-DM:当日最高价比昨日最高价低并且当日最低价比昨日最低价低,即为下降动向-DM。下降幅度为:昨日最低价减去今日最低价。Step 2 . 计算True Range (真实波幅)TR =∣最高价-最低价∣,∣最高价-昨收∣,∣昨收-最低价∣ 三者之中的最高值Step 3: 计算Directional Movment Index (动向指数)+DI(14) = +DM(14)/TR(14)100 -DI(14) = -DM(14)/TR(14)100Step 4: 计算ADXDX是+DI与-DI两者之差的绝对值除以两者之和的百分数。 DX=[(+DI14)-(-DI14)]/[(+DI14)+(-DI14)]*100ADX是DX的14天平滑平均线。 ADX = SMA(DX, 14)[ADX和DMI的一些解读]不论上升趋势或下降趋势,ADX的读数越大,趋势越明显。衡量趋势强度时,需要比较几天的ADX 读数,观察ADX究竟是上升或下降。ADX读数上升,代表趋势转强;如果ADX读数下降,意味着趋势转弱。当+DI14从下向上递增突破-DI14时,显示市场内部有新的多头买家进场,愿意以较高的价格买进,因此入场信号。当-DI14从下向上递增突破+DI14时,显示市场内部有新的空头卖家出货,愿意以较低卖出,为离场信号策略逻辑: 使用ADX的相对上升下降来判断趋势。配合双均线信号一起用。 在这里ADX更多是作为验证趋势是否会增强的信号使用,以避免在横盘中多次交易。'''def main():print("任务开始时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))for symbol in order.symbol_pool:# 设置杠杆倍数 order.set_leverage(symbol=symbol, leverage='18')
df = order.get_candlesticks(symbol=symbol, interval='15m', limit=str(ma_long_period + 1))
adx = talib.ADX(df['high'], df['low'], df['close'], timeperiod=adx_period)
plus_di = talib.PLUS_DI(df['high'], df['low'], df['close'], timeperiod=dmi_period)
minus_di = talib.MINUS_DI(df['high'], df['low'], df['close'], timeperiod=dmi_period)
short_ma = talib.SMA(df['close'], timeperiod=ma_short_period)
long_ma = talib.SMA(df['close'], timeperiod=ma_long_period)if short_ma.values[-1] > long_ma.values[-1] and short_ma.values[-2] < long_ma.values[-2] and adx.values[-1] > \
adx.values[-2] and plus_di.values[-1] > minus_di.values[-1]:
order.up_cross_order(symbol=symbol, ordtype='market', message='ADX+DMI策略提示做多')print('ADX+DMI策略提示做多: ' + symbol)if short_ma.values[-1] < long_ma.values[-1] and short_ma.values[-2] > long_ma.values[-2] and adx.values[-1] < \
adx.values[-2] and plus_di.values[-1] < minus_di.values[-1]:
order.down_cross_order(symbol=symbol, ordtype='market', message='ADX+DMI策略提示做空')print('ADX+DMI策略提示做空: ' + symbol)
time.sleep(2)print("任务结束时间:", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))if __name__ == '__main__':
main()
好的,我可以为您提供一个基于Python的“KDJ+DMI”量化策略的代码实现,可以使用tushare下载数据,可以在PyCharm运行。以下是代码实现: ```python import tushare as ts import pandas as pd import numpy as np # 下载数据 df = ts.get_k_data('600519', start='2010-01-01', end='2021-05-31') # 计算KDJ指标 def cal_KDJ(data, n=9, m1=3, m2=3): high_list = data['high'].rolling(window=n, min_periods=1).max() low_list = data['low'].rolling(window=n, min_periods=1).min() rsv = (data['close'] - low_list) / (high_list - low_list) * 100 data['KDJ_K'] = pd.DataFrame(rsv).ewm(com=m1).mean() data['KDJ_D'] = data['KDJ_K'].ewm(com=m2).mean() data['KDJ_J'] = 3 * data['KDJ_K'] - 2 * data['KDJ_D'] return data # 计算DMI指标 def cal_DMI(data, n=14, m=6): i = 0 UpI = [0] DoI = [0] while i + 1 <= data.index[-1]: UpMove = data.loc[i + 1, 'high'] - data.loc[i, 'high'] DoMove = data.loc[i, 'low'] - data.loc[i + 1, 'low'] if UpMove > DoMove and UpMove > 0: UpD = UpMove else: UpD = 0 UpI.append(UpD) if DoMove > UpMove and DoMove > 0: DoD = DoMove else: DoD = 0 DoI.append(DoD) i = i + 1 UpI = pd.Series(UpI) DoI = pd.Series(DoI) PosDI = pd.Series(UpI.ewm(span=n, min_periods=n - 1).mean()) NegDI = pd.Series(DoI.ewm(span=n, min_periods=n - 1).mean()) data['PosDI'] = PosDI data['NegDI'] = NegDI data['ADX'] = pd.Series((100 * np.abs(PosDI - NegDI) / (PosDI + NegDI)).ewm(span=m, min_periods=m - 1).mean()) data['ADXR'] = ((data['ADX'] + data['ADX'].shift(m - 1)) / 2) return data # 运行策略 df = cal_KDJ(df) df = cal_DMI(df) df = df.dropna() df['signal'] = 0 df.loc[(df['KDJ_K'] < df['KDJ_D']) & (df['KDJ_D'] < df['KDJ_J']) & (df['PosDI'] > df['NegDI']) & (df['ADX'] > df['ADXR']), 'signal'] = 1 df.loc[(df['KDJ_K'] > df['KDJ_D']) & (df['KDJ_D'] > df['KDJ_J']) & (df['PosDI'] < df['NegDI']) & (df['ADX'] > df['ADXR']), 'signal'] = -1 # 计算收益 df['pct_change'] = df['close'].pct_change() df['strategy_return'] = df['pct_change'] * df['signal'].shift(1) df['accumulative_return'] = (1 + df['strategy_return']).cumprod() # 输出结果 print(df.tail()) ``` 该代码首先使用tushare下载股票代码为“600519”的K线数据,时间范围为2010年1月1日到2021年5月31日。接着定义了两个函数分别用于计算KDJ和DMI指标,并在主函数中调用这两个函数计算指标。然后定义了一个简单的策略,根据KDJ和DMI指标产生交易信号,如果KDJ指标出现“金叉”且DMI指标出现多头信号,则产生买入信号,如果KDJ指标出现“死叉”且DMI指标出现空头信号,则产生卖出信号。最后,计算策略的收益率并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值