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方法进行验证。

相关新闻

OpenStack Glance 完整实战指南:镜像架构、格式、上传与 Swift 后端配置

OpenStack Glance 完整实战指南:镜像架构、格式、上传与 Swift 后端配置

OpenStack管理 摘要:本文全面介绍了OpenStack镜像管理组件Glance的核心概念与实践应用。首先从公有云镜像概念入手,对比了公共镜像、私有镜像、共享镜像和市场镜像的区别。接着详细解析了Glance在OpenStack架构中的作用、组件架构演变(从V1/V…

2026/10/11 9:26:33 阅读更多 →
SpringBoot景区票务系统设计与高并发处理实践

SpringBoot景区票务系统设计与高并发处理实践

1. 项目背景与核心价值这个SpringBoot旅游景区门票销售系统是我去年指导的一个计算机专业毕业设计项目,当时学生面临几个典型痛点:既要体现技术深度,又要在有限时间内完成可演示的系统;既要符合企业级开发规范,又要控制…

2026/10/14 18:55:06 阅读更多 →
从SSL握手失败到OpenSSL密码套件配置实战指南

从SSL握手失败到OpenSSL密码套件配置实战指南

1. 从一次“握手失败”的线上事故说起那天下午,监控系统突然报警,提示我们一个面向海外用户的API服务出现了大量连接失败。错误日志里反复出现一个刺眼的短语:SSL_ERROR_NO_CYPHER_OVERLAP。简单来说,就是客户端和服务器在SSL/TLS…

2026/10/15 5:19:11 阅读更多 →

最新新闻

C++构建器模式实战:从构造函数参数爆炸到链式调用

C++构建器模式实战:从构造函数参数爆炸到链式调用

1. 从“构造函数参数爆炸”说起:构建器模式到底在解决什么如果你写过一段时间的C,大概率遇到过这种场景:一个类有十几个成员变量,构造函数参数列表长得像一条蜈蚣,调用的时候得对着头文件一个一个数位置,稍…

2026/10/15 16:30:43 阅读更多 →
Linux图形栈技术周刊:内核DRM到Mesa驱动与Wayland合成器动态

Linux图形栈技术周刊:内核DRM到Mesa驱动与Wayland合成器动态

1. 为什么我要做一份图形技术周刊 做图形技术这行的人都有个共同的痛点:信息太散了。内核邮件列表、驱动仓库的提交记录、各大图形栈的版本发布说明、厂商的技术博客、标准组织的提案文档,这些东西散落在十几个不同的地方,而且更新节奏完全不…

2026/10/15 16:30:43 阅读更多 →
Python批量提取视频元数据:pymediainfo实战指南

Python批量提取视频元数据:pymediainfo实战指南

1. 从一个让人头疼的素材整理场景说起手里攒了几百个视频文件,来源五花八门——手机拍的、相机录的、从各种渠道收集的,文件名乱七八糟,有的叫VID_20240101_123456.mp4,有的叫output_final_v3.mov,还有一堆连扩展名都被…

2026/10/15 16:30:43 阅读更多 →
安卓手机无法联网?从DNS到网络配置的系统排查指南

安卓手机无法联网?从DNS到网络配置的系统排查指南

简介:Google系列Android手机(如LG Nexus、5X、6P、Pixel 2~6等)在系统更新或网络设置后常出现无法联网的问题,这份PDF教程正是为这类零基础用户准备的排查方案,无需刷机或获取root权限即可操作。资源只有1个PDF文件&am…

2026/10/15 16:30:43 阅读更多 →
MPU6050 DMP姿态解算实战:从寄存器配置到四元数转欧拉角

MPU6050 DMP姿态解算实战:从寄存器配置到四元数转欧拉角

简介:面向嵌入式开发者与物联网学生的MPU6050姿态解算工程资料,利用芯片内置DMP硬件模块直接输出欧拉角,将复杂的滤波与融合运算从主控中分离,显著降低姿态检测开发门槛,适用于平衡车、机器人、航模等场景。压缩包共99…

2026/10/15 16:30:43 阅读更多 →
ARM嵌入式PPP拨号一键编译包:pppd+chat静态构建与AT兼容修复

ARM嵌入式PPP拨号一键编译包:pppd+chat静态构建与AT兼容修复

简介:本资源是面向嵌入式Linux开发者与ARM平台运维人员的pppd与chat自动化编译实践套件,聚焦解决在ARM架构设备(如工业网关、物联网终端)上交叉编译PPP协议栈组件并适配3G模组的典型工程难题。压缩包共12个文件,含3个S…

2026/10/15 16:29:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →