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

发布时间:2026/9/20 2:54:54

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/9/20 2:54:58

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

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

2026/9/20 2:54:58

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

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

2026/9/20 2:55:02

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

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

2026/9/20 23:17:20

腾讯云FDE认证:部署交付工程师的标准化之路

腾讯云最近放出了一个新消息,行业里第一个FDE工程师认证正式上线,FDE合作伙伴招募也同步启动了。FDE这个名字,第一次听的人可能会心里嘀咕,这跟平时念叨的IDE、CDN,还有各种"XXX认证"到底有什么关系。简单说…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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