SuperTrend与ADX量化交易策略Python实现

发布时间:2026/11/14 21:59:30

SuperTrend与ADX量化交易策略Python实现 1. 量化趋势策略的核心指标解析在量化交易领域SuperTrend和ADX这对组合被许多专业交易员称为趋势黄金搭档。我从业内多位资深量化分析师的实际操作经验中发现这两个指标的组合使用能够有效识别市场趋势强度并过滤虚假信号。SuperTrend作为一种自适应趋势跟踪指标其核心优势在于能够根据市场波动率自动调整参数而ADX平均趋向指数则是判断趋势强度的经典工具。1.1 SuperTrend指标的工作原理SuperTrend的计算基于两个核心参数周期长度通常为10和乘数因子常用3。其算法本质上是ATR平均真实波幅的变体通过动态调整上下轨来捕捉趋势。具体计算公式如下上轨 (最高价 最低价)/2 乘数 × ATR(周期) 下轨 (最高价 最低价)/2 - 乘数 × ATR(周期)实际应用中当价格突破上轨时产生买入信号跌破下轨时产生卖出信号。我在多个品种的回测中发现将周期设为7-14、乘数设为2-3的范围通常能获得较好的效果。重要提示SuperTrend参数对结果影响显著需根据不同品种的波动特性进行调整。外汇市场通常需要较小的乘数1.5-2.5而加密货币则需要更大的乘数3-5。1.2 ADX指标的实战意义ADX由Welles Wilder开发用于量化趋势强度而非方向。其计算过程较为复杂主要包含以下步骤计算DI和-DI方向指标计算DX |(DI) - (-DI)| / ((DI) (-DI)) × 100对DX进行平滑得到ADX业内普遍将ADX值25作为趋势强弱的分界线。我在实盘中发现结合SuperTrend使用时ADX阈值设为20-30之间效果最佳。当ADX低于阈值时即使SuperTrend发出信号也应谨慎对待因为这可能意味着市场处于震荡状态。2. Python实现完整代码解析2.1 环境准备与数据获取首先需要安装必要的Python库pip install pandas numpy ta-lib matplotlib如果ta-lib安装失败可以使用替代方案pip install ta获取历史数据示例以yfinance为例import yfinance as yf data yf.download(AAPL, start2020-01-01, end2023-12-31) data data[[Open, High, Low, Close, Volume]]2.2 SuperTrend指标实现完整实现代码如下import numpy as np import pandas as pd def super_trend(df, period10, multiplier3): hl2 (df[High] df[Low]) / 2 atr df[High] - df[Low] atr atr.rolling(period).mean() upper_band hl2 multiplier * atr lower_band hl2 - multiplier * atr super_trend [True] * len(df) for i in range(1, len(df)): if df[Close][i] upper_band[i-1]: super_trend[i] True elif df[Close][i] lower_band[i-1]: super_trend[i] False else: super_trend[i] super_trend[i-1] if super_trend[i] and lower_band[i] lower_band[i-1]: lower_band[i] lower_band[i-1] if not super_trend[i] and upper_band[i] upper_band[i-1]: upper_band[i] upper_band[i-1] df[SuperTrend] super_trend df[UpperBand] upper_band df[LowerBand] lower_band return df2.3 ADX指标实现使用TA-Lib库实现from talib import ADX def add_adx(df, period14): df[ADX] ADX(df[High], df[Low], df[Close], timeperiodperiod) return df如果没有TA-Lib可以使用以下替代实现def calculate_adx(df, period14): df[TR] df[High] - df[Low] df[DMplus] np.where( (df[High] - df[High].shift(1)) (df[Low].shift(1) - df[Low]), df[High] - df[High].shift(1), 0 ) df[DMminus] np.where( (df[Low].shift(1) - df[Low]) (df[High] - df[High].shift(1)), df[Low].shift(1) - df[Low], 0 ) # 平滑处理 df[TR_smooth] df[TR].rolling(period).mean() df[DMplus_smooth] df[DMplus].rolling(period).mean() df[DMminus_smooth] df[DMminus].rolling(period).mean() # 计算DI指标 df[DIplus] (df[DMplus_smooth] / df[TR_smooth]) * 100 df[DIminus] (df[DMminus_smooth] / df[TR_smooth]) * 100 # 计算DX和ADX df[DX] (abs(df[DIplus] - df[DIminus]) / (df[DIplus] df[DIminus])) * 100 df[ADX] df[DX].rolling(period).mean() return df3. 策略组合与回测实现3.1 交易信号生成逻辑结合两个指标的交易规则def generate_signals(df, adx_threshold25): df[Signal] 0 # 0表示无信号1表示买入-1表示卖出 # SuperTrend信号 df.loc[df[SuperTrend] (df[SuperTrend].shift(1) False), Signal] 1 df.loc[~df[SuperTrend] (df[SuperTrend].shift(1) True), Signal] -1 # ADX过滤 df.loc[df[ADX] adx_threshold, Signal] 0 return df3.2 回测框架实现简单回测示例def backtest(df, initial_capital10000): position 0 portfolio initial_capital trades [] for i, row in df.iterrows(): if row[Signal] 1 and position 0: # 买入 position portfolio / row[Close] portfolio 0 trades.append({date: i, action: buy, price: row[Close]}) elif row[Signal] -1 and position 0: # 卖出 portfolio position * row[Close] position 0 trades.append({date: i, action: sell, price: row[Close]}) # 计算最终价值 final_value portfolio position * df.iloc[-1][Close] return final_value, trades3.3 参数优化方法网格搜索优化示例from itertools import product def optimize_parameters(df): best_params {} best_performance -float(inf) periods range(7, 15) multipliers [x/10 for x in range(15, 35, 5)] adx_thresholds range(20, 35, 5) for period, multiplier, adx_thresh in product(periods, multipliers, adx_thresholds): df_temp df.copy() df_temp super_trend(df_temp, period, multiplier) df_temp add_adx(df_temp) df_temp generate_signals(df_temp, adx_thresh) final_value, _ backtest(df_temp) if final_value best_performance: best_performance final_value best_params { period: period, multiplier: multiplier, adx_thresh: adx_thresh } return best_params, best_performance4. 实战应用与注意事项4.1 不同市场的参数调整经验根据我在多个市场的实测经验股票市场如标普500成分股周期10-14乘数2.5-3.5ADX阈值22-28外汇市场如EUR/USD周期12-16乘数1.8-2.5ADX阈值20-25加密货币如BTC/USD周期8-12乘数3.5-5ADX阈值25-304.2 常见问题与解决方案问题1指标滞后导致入场过晚解决方案结合短期均线如5EMA作为确认当SuperTrend和短期均线同向时再入场问题2震荡市频繁交易解决方案增加ADX阈值如提高到30或结合波动率指标如布林带宽进行过滤问题3参数过拟合解决方案使用Walk-Forward优化方法将数据分为多段进行滚动优化4.3 策略增强建议仓位管理根据ADX值动态调整仓位趋势强时加大仓位弱时减小仓位多时间框架确认在日线信号基础上增加4小时或1小时级别的确认止损策略使用ATR倍数作为动态止损位如1.5倍ATR# 动态仓位计算示例 def dynamic_position_size(adx_value, base_size0.1): if adx_value 20: return 0 elif 20 adx_value 25: return base_size * 0.5 elif 25 adx_value 30: return base_size else: return base_size * 1.54.4 可视化分析使用Matplotlib绘制指标和交易信号import matplotlib.pyplot as plt def plot_strategy(df): plt.figure(figsize(15,10)) # 价格和SuperTrend plt.subplot(3,1,1) plt.plot(df[Close], labelPrice) plt.plot(df[UpperBand], g--, alpha0.5) plt.plot(df[LowerBand], r--, alpha0.5) plt.scatter(df.index, df[Close].where(df[Signal] 1), colorg, marker^, labelBuy) plt.scatter(df.index, df[Close].where(df[Signal] -1), colorr, markerv, labelSell) plt.title(Price with SuperTrend Signals) plt.legend() # ADX plt.subplot(3,1,2) plt.plot(df[ADX], labelADX) plt.axhline(25, colorgray, linestyle--) plt.title(ADX Indicator) # 资金曲线 plt.subplot(3,1,3) portfolio_values [] position 0 portfolio 10000 for i, row in df.iterrows(): if row[Signal] 1 and position 0: position portfolio / row[Close] portfolio 0 elif row[Signal] -1 and position 0: portfolio position * row[Close] position 0 portfolio_values.append(portfolio position * row[Close]) plt.plot(df.index, portfolio_values, labelPortfolio Value) plt.title(Portfolio Performance) plt.tight_layout() plt.show()5. 策略优化进阶方向5.1 机器学习增强使用随机森林判断信号有效性from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split def ml_enhancement(df): # 特征工程 df[Return_5] df[Close].pct_change(5) df[Volatility_10] df[Close].pct_change().rolling(10).std() # 标记有效信号信号后5日收益2%为有效买入-2%为有效卖出 df[Target] 0 df.loc[df[Signal].shift(-5) 1 (df[Close].pct_change(5).shift(-5) 0.02), Target] 1 df.loc[df[Signal].shift(-5) -1 (df[Close].pct_change(5).shift(-5) -0.02), Target] -1 # 训练模型 features [ADX, Return_5, Volatility_10, SuperTrend] X df[features].dropna() y df[Target].loc[X.index] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2) model RandomForestClassifier(n_estimators100) model.fit(X_train, y_train) # 预测信号质量 df[Signal_Quality] model.predict_proba(df[features])[:,1] - model.predict_proba(df[features])[:,2] return df5.2 多品种组合策略构建多品种组合的示例def multi_asset_strategy(symbols, start_date, end_date): portfolio {} for symbol in symbols: data yf.download(symbol, startstart_date, endend_date) data super_trend(data) data add_adx(data) data generate_signals(data) portfolio[symbol] data # 等权重分配 capital_per_symbol 10000 / len(symbols) total_value 0 for symbol in symbols: final_value, _ backtest(portfolio[symbol], capital_per_symbol) total_value final_value return total_value5.3 实时交易集成连接交易API的示例以Alpaca为例import alpaca_trade_api as tradeapi api tradeapi.REST(API_KEY, SECRET_KEY, base_urlhttps://paper-api.alpaca.markets) def execute_trade(symbol): data api.get_bars(symbol, 1D, limit100).df data super_trend(data) data add_adx(data) data generate_signals(data) current_signal data.iloc[-1][Signal] position api.get_position(symbol) if api.get_position(symbol) else None if current_signal 1 and (not position or position.side short): api.submit_order( symbolsymbol, qty100, sidebuy, typemarket, time_in_forcegtc ) elif current_signal -1 and (not position or position.side long): api.submit_order( symbolsymbol, qty100, sidesell, typemarket, time_in_forcegtc )在实际应用中我发现这套策略组合在趋势明显的市场中表现优异但在震荡市中需要谨慎使用。建议新手先从模拟盘开始充分理解指标特性后再投入实盘。参数优化时要注意避免过拟合最好使用Walk-Forward方法进行验证。
延伸阅读

更多相关文章

2026/11/14 17:06:14

SpringBoot接口性能调优:6个优化手段,轻松突破系统 QPS瓶颈

做Java后端开发的小伙伴,基本都遇到过线上QPS瓶颈问题:测试环境接口跑得飞快,一到线上流量高峰,接口响应变慢、吞吐量上不去、偶尔超时告警。很多人第一反应是加服务器扩容,但其实大部分场景根本不是机器配置不够&…

2026/11/14 22:55:55

2025年安卓最佳FC模拟器推荐

谈到FC也就是红白机, 不少人的首个反应或许是: 像素, 简单, 年代久远。然而当真正再次去玩一回的时候你会发觉,这些游戏反倒格外适配手机, 操作并非复杂, 节奏较快, 能够随时去玩, 随时停下, 相较于许多现代手游而言更具耐玩性。问题只有一个:选哪个模拟…

2026/11/10 18:57:39

别再傻傻分不清!int和Integer这7个坑,坑惨多少Java程序员

引言一、基本概念是, 原始类型跟包装类, 1.1 当中的 int 属于原始数据类型。int属于Java里的原始数据类型(Type), 此类型用于显示整数, 于Java之中, 原始数据类型属于最基础的数据类型, 它们直接存放数据的值, int类型占据32位(4个字节&#…

2026/11/15 1:32:55

台山报考电工证千万别踩坑,怕考不过白交培训费

台山报考电工证千万别踩坑,怕考不过白交培训费 你是不是也担心,报名台山报考电工证,花了钱却考不过?怕交了培训费白搭?别急,听我给你道道实情。在台山,报考电工证的流程看似简单,但一不小心就掉进坑里。比如,有些培训机构打着“包过”“快速取证”的…

2026/11/15 1:32:54

临沧学电工证怎么样到期换证流程揭秘 电工证含金量到底高不高

临沧学电工证怎么样到期换证流程揭秘 电工证含金量到底高不高 证书过期了不知道怎么复审延期,这事儿我见过太多人犯,尤其是干了几年的电工,一不留神就把证给弄丢了,结果找工作、换岗位、甚至项目现场管理都成了问题。今天就以一个 临沧学电工证怎么样…

2026/11/15 1:32:54

重体力特种工怎么报名才能避免被中介坑?南阳工友实操指南

重体力特种工怎么报名才能避免被中介坑?南阳工友实操指南 你是不是也经常听到身边的朋友说:“特种作业证好考吗?去哪报名才靠谱?”特别是像你这种在南阳卧龙区工地干活的建筑工人,天天干的是重体力活,又想往上走,就得有个“硬通货”——特种作业证。但…

2026/11/15 1:32:54

河北考电工证考几天怎么报名学历不高也能考

河北考电工证考几天怎么报名学历不高也能考 你是不是也担心学历不高报不了电工证?别急,今天我就从一个老电工的角度,给你讲讲 河北考电工证考几天 、 怎么报名 、还有你关心的考试安排、报名条件和后续流程,全是干货,看完就能上手。…

2026/11/15 1:27:54

榄核考电工证过期了怎么复审?郑州报考避坑指南全解析

榄核考电工证过期了怎么复审?郑州报考避坑指南全解析 证书过期了不知道怎么复审延期,这事儿我太懂了。前两天还有个老哥们儿,电工证都快黄了,慌得不行,跑来找我问流程,结果一查发现他根本不符合复审条件。这种事情在咱们这个圈儿里太常见了,…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑