量化策略开发02:海龟三重EMA趋势策略 - 从设计思路到回测验证

发布时间:2026/8/5 13:24:41
量化策略开发02:海龟三重EMA趋势策略 - 从设计思路到回测验证 本文是《量化策略开发》系列的第2篇。上一篇让AI全权做交易决策这篇回到传统策略的设计基本功。从三重EMA排列为什么用三条不用两条到严格入场和宽松入场到底差在哪再到ATR动态止损止盈怎么设计最后用7个品种的回测数据说话。看完你会理解传统策略的设计思路一点都不传统。写在前面上一篇我们聊了AI全权做交易决策的完整链路——从提示词设计到决策执行。说实话那套东西跑起来之后我挺兴奋的AI确实能处理很多传统策略覆盖不了的场景。但我们依然要回过头来研究如何开发一个传统量化策略。为什么因为AI策略再花哨它的判断基础还是技术指标。你得先理解这些指标组合在一起为什么能赚钱才能告诉AI什么是有价值的信号什么是噪音。这就好比做菜。AI是那个帮你看火候、调调料的助手但如果你连大火爆炒和小火慢炖的区别都不知道助手再聪明也帮不了你。所以这篇文章我想老老实实讲一个传统趋势策略的设计思路。不依赖AI纯靠指标组合和规则逻辑。这个策略叫海龟三重EMA趋势策略——用三条EMA判断趋势方向用ADX过滤假信号用ATR动态设止损止盈。这篇专注在策略的设计逻辑上——为什么这样设计为什么不那样设计。三重EMA排列为什么是三条不是两条先从单条EMA说起EMA指数移动平均线大家都不陌生。它比SMA更重视最近的价格反应更快。一条EMA能告诉你大方向——价格在EMA上方偏多下方偏空。但单条EMA的问题是**太平滑了。**价格在EMA附近反复穿越你不知道哪次是真的突破哪次只是噪音。两条EMA呢经典的金叉死叉双EMA交叉是最经典的趋势策略之一——快线上穿慢线做多金叉快线下穿慢线做空死叉。效果有但问题也很明显**震荡市里反复打脸。**快线和慢线频繁交叉每次交叉都触发一次交易结果就是来回止损。三条EMA的排列逻辑加一条中线试试快线(EMA9)、中线(EMA20)、慢线(EMA60)。多头趋势的判断条件变成了快线 中线 慢线三条线按顺序排列像楼梯一样。这跟双EMA有什么区别区别在于——排列是一个状态不是一次穿越。金叉是一个事件发生在某根K线上下一根K线可能就又叉回来了。但三线排列是一个状态要打破这个状态需要快线先穿过中线这本身就比单次穿越更有韧性。换句话说三条EMA排列给了趋势一个缓冲带。快线可能短暂回落但只要中线还在慢线上方排列状态就没被破坏。# 三重EMA排列判断严格模式long_alignment(ema_fastema_midandema_midema_slow)short_alignment(ema_fastema_midandema_midema_slow)不过光排列还不够。还得加一个确认条件收盘价必须站在快线的正确方向。什么意思做多的时候不仅要三线多头排列收盘价还得高于快线。这保证了价格确实在趋势方向上运行而不是排列形成了但价格已经开始掉头。# 完整做多条件排列 收盘价确认long_condition(ema_fastema_midema_slow# 三线排列andcloseema_fast# 收盘价在快线上方)这一层确认看起来简单但在实战中能有效过滤掉很多假信号。说到这里有人会问为什么不用MACD金叉做入场非要用EMA排列其实两个思路本质是一样的——都是用快慢线的相对位置判断趋势。但MACD看的是DIF和DEA两条衍生线的交叉而EMA排列直接看价格和均线的关系。我个人觉得后者更直观而且三线排列的状态感比MACD交叉的事件感更适合趋势跟踪。当然这只是我的偏好不代表MACD不好。不过话说回来EMA排列只是第一步。接下来要解决的问题是排列形成了怎么入场多入场模式严格、宽松和ADX过滤策略设计到这一步我遇到一个选择入场条件到底该严格还是宽松严格条件信号少但准宽松条件信号多但杂。两种各有道理所以我干脆把两种都实现了让策略自己选。你可能会问为什么不直接选一种因为不同品种、不同行情阶段适合的入场严格程度不一样。有些品种趋势性很强比如棕榈油严格模式就能抓住足够的信号有些品种趋势比较弱比如尿素严格模式下几乎没信号需要宽松模式才能捕捉到趋势早期的机会。把两种模式做成参数回测的时候可以对比看哪个品种更适合哪种。严格模式就是上面说的三线完全排列。三条线必须严格按顺序排列一条都不能错位。这种模式下入场机会比较少。但每次入场趋势确立的把握更大。为什么因为三线完全排列意味着短、中、长三个时间维度的趋势方向完全一致——这不是可能在趋势里而是确定性很高地在趋势里。代价是你会错过趋势早期的入场机会等到三线排好队的时候趋势可能已经走了一半。宽松模式放宽一点。不要求三条线完全排列只要求快线在中线的正确方向上同时慢线在上升或下降。# 宽松模式快线方向 慢线趋势long_condition(ema_fastema_mid# 快线在中线上方andema_slow_rising# 慢线在上升斜率确认andcloseema_fast# 收盘价确认)注意这里用了一个慢线斜率的概念。不要求慢线在中线的下方三线排列而是看慢线是不是在往上走。如果慢线在上升说明长期趋势在转好即使三线还没完全排列也可以考虑入场。宽松模式的信号更多能捕捉趋势早期的机会但也更容易被假突破骗进去。这就是设计上的取舍——用信号质量换信号数量。在趋势明确的品种上不值得但在趋势较弱的品种上可能这是唯一能参与的方式。ADX过滤不管严格还是宽松趋势得够强不管是严格模式还是宽松模式我都加了一层ADX过滤。ADX平均趋向指数衡量的是趋势的强度不区分方向。ADX越高趋势越明确。默认阈值设为20-30之间不同品种不一样只有ADX高于阈值时才允许入场。**为什么需要ADX**因为EMA排列可能出现在两种场景一种是真正的趋势行情另一种是震荡市里EMA偶然排好队了。没有ADX过滤后者会反复触发假信号。# ADX趋势强度过滤ifadx_enabledandadx_valueadx_threshold:return# 趋势不够强放弃这次入场机会三种机制组合起来——EMA排列看方向、收盘价确认看强度、ADX过滤看质量——构成了一个分层的入场信号体系。每一层都在过滤噪音留下来的信号质量就相对高了。等等这里有个细节要注意。三种过滤不是独立的而是叠加的。也就是说ADX过滤在严格模式和宽松模式前面都会执行。所以实际的入场门槛是先过ADX趋势够不够强再过EMA排列方向对不对最后收盘价确认价格真的在动吗。三道门都过了才入场。这就是为什么最后真正触发的信号不多但每一个的可靠性都比较高。止损止盈设计让波动率来决定入场说完了接下来是出场。说实话出场比入场重要得多。ATR倍数 vs 固定百分比止损止盈有两种主流做法固定百分比和ATR倍数。固定百分比就是入场价上下2%止损、3%止盈。简单直接但问题是——不同品种的波动率差异很大。棕榈油日内波动可能就1%铁矿日内波动可能3%。用同样的2%止损对棕榈油来说可能太宽了对铁矿来说可能太紧了。ATR倍数解决了这个问题。ATR真实波动幅度衡量的是品种自身的波动水平。用ATR的倍数来设止损止盈等于让止损距离自适应品种的波动特征。ifsl_tp_modeatrandatr_value0:sl_distsl_atr_mult*atr_value# 止损距离 1.8倍ATRtp_disttp_atr_mult*atr_value# 止盈距离 3.3倍ATRelse:sl_distsl_pct/100*close# 备用固定百分比tp_disttp_pct/100*close默认用的止损ATR倍数是1.8止盈是3.3。止盈大约是止损的1.8倍保证了盈亏比大于1。这个数字不是拍脑袋的——回测下来1.5-2.0倍ATR的止损距离在大多数品种上效果最好太小了容易被正常波动扫出去太大了单笔亏损承受不了。移动止损利润跑了就别回头还有一个可选功能移动止损。入场之后跟踪持仓期间的最高价多头或最低价空头止损线只往有利方向移动不往回退。# 移动止损跟踪最高价止损只上不下ifclosehighest_since_entry:highest_since_entryclose trail_stophighest_since_entry*(1-trailing_pct/100)iftrail_stopstop_loss_price:stop_loss_pricetrail_stop这个功能适合趋势行情——价格不断新高止损跟着上移锁定已有利润。但在震荡市里容易过早被扫出去。所以默认是关闭的只有趋势特别明确的品种才考虑开启。EMA排列破坏出场最后一个出场机制如果持仓期间快线下穿中线多头或上穿中线空头直接平仓。不管止损止盈有没有触发。逻辑是当初因为EMA排列入场排列被破坏了入场的理由就不存在了该走就走。这个也是可选功能默认关闭。四种出场机制——固定止损、固定止盈、移动止损、EMA排列破坏——不是全都要用而是根据品种特性灵活组合。7个品种回测用数据说话策略设计得再漂亮跑不出正收益都是白搭。我在7个期货品种上做了回测每个品种用优化后的参数跨多个历史合约验证稳定性。说白了就是看看这个策略到底是看着好听还是真的能用。回测参数所有品种统一使用EMA 9/20/60ADX周期14。不同的是止损止盈参数、ADX阈值和K线周期——这些是按品种特性分别调的。回测结果品种Sharpe平均收益率胜率盈利合约覆盖K线周期P 棕榈油2.271.16%69.4%3/3 (100%)30分钟M 豆粕1.040.12%60.6%8/8 (100%)30分钟L 塑料0.970.30%-8/8 (100%)15分钟I 铁矿0.850.18%-6/7 (86%)15分钟EB 苯乙烯0.750.15%-7/8 (88%)15分钟A 豆一0.650.08%-5/7 (71%)30分钟UR 尿素0.550.05%-5/7 (71%)15分钟几个有意思的发现棕榈油遥遥领先。Sharpe 2.27胜率接近70%合约覆盖率100%。棕榈油的趋势性比较强波幅适中三重EMA策略在这种品种上天然有优势。不过只有3个历史合约的数据样本量偏小这个结果还得继续观察。看下棕榈油的回测K线图三重EMA排列和入场信号一目了然棕榈油30分钟K线EMA 9/20/60排列清晰ADX阈值30止损3%/止盈3%。多头排列形成后入场信号明确假信号少。豆粕很稳。Sharpe超过1胜率60%以上8个合约全部盈利。豆粕也是趋势性不错的品种而且流动性好滑点影响小。塑料和铁矿居中。Sharpe在0.85-0.97之间合约覆盖率也不错。铁矿的趋势性强但波动大所以止损需要设得宽一点。尿素垫底。Sharpe只有0.55合约覆盖率71%。尿素这个品种波动规律性不太好把握三重EMA这种趋势策略在它身上不太占优势。这其实也说明了一件事没有万能策略策略跟品种之间存在适配关系。从周期来看也有规律表现好的品种P、M、A适合30分钟周期波动大的品种L、I、EB、UR适合15分钟周期。周期越短信号越灵敏但也更容易被噪音干扰。对了有人可能会问为什么EMA周期都是9/20/60不按品种单独调说实话我一开始也想每个品种用不同的EMA周期。但回测下来发现9/20/60这个组合在所有品种上都能用差异主要在止损止盈和ADX阈值上。EMA周期的通用性比我想象的要好。可能是因为这三条线的作用是定方向快中慢排列而不是精确找入场点所以对参数不像MACD那么敏感。实战经验与避坑指南说几个实际用的时候遇到的坑。第一ADX阈值不是越高越好。一开始我把ADX阈值设到了40觉得趋势越强越好。结果发现信号少得可怜好多明明不错的趋势行情因为ADX差一点就没入场。后来降到20-30之间信号质量没降多少但机会多了不少。不同品种的合适阈值也不一样——波动大的品种铁矿用20就够了波动小的品种棕榈油可以设到30。第二止损止盈的比例比绝对值重要。回测下来盈亏比止盈距离/止损距离控制在1.5-2.0之间效果最好。不是止盈越大越好——止盈设得太远价格根本到不了最后变成了永远持仓。第三多合约验证比单合约高分重要。一个合约上Sharpe到3.0不说明任何问题。8个历史合约中有7-8个盈利才说明策略的稳定性不错。这也是为什么表格里列了合约覆盖率这一列。就这几个。不多但都是实打实踩过的坑。写在最后回到开头那个问题为什么回到传统策略因为传统策略的设计过程本身就是理解市场的过程。三重EMA为什么用三条、ADX为什么过滤、ATR为什么动态——每一个为什么背后都是对市场规律的认知。AI策略可以帮你做决策但它不能帮你建立这种认知。这种认知只能从自己设计、自己验证、自己踩坑的过程中长出来。三重EMA策略的核心思路就一句话**用多层过滤对抗噪音用自适应参数对抗差异用多合约验证对抗运气。**这不是什么高深的东西但确实管用。后面我会继续分享参数优化的方法论——7个品种的参数是怎么一步步调出来的以及为什么同样的策略在不同品种上参数差异这么大。先写到这有问题欢迎留言交流。本文基于ATMQuant量化交易系统框架代码已开源至GitHubhttps://github.com/seasonstar/atmquant海龟三重EMA策略为付费会员专享完整源码和参数配置教程已发布至知识星球「量策堂」。本文内容仅供学习交流不构成任何投资建议。交易有风险投资需谨慎。往期文章回顾《量化策略开发》系列量化策略开发01我让AI全权做交易决策从提示词设计到决策执行《以AI量化为生》系列以AI量化为生24.回测结果存储与策略参数管理以AI量化为生23.打造AI全驱动量化策略引擎以AI量化为生22.指标计算引擎重构 - 让策略直接复用图表指标以AI量化为生21.交易图表AI分析功能集成以AI量化为生20.实时图表交易系统开发以AI量化为生19.半小时K线合成与多周期系统优化《量化指标解码》系列量化指标解码20谐波形态识别 - 用斐波那契找到精准反转点量化指标解码19K线形态识别 - 价格行为不会说谎量化指标解码18SMC市场结构与流动性量化指标解码17SMC聪明钱概念之公允价值缺口量化指标解码16SMC聪明钱概念之订单块量化指标解码15Adaptive MACD Deluxe - 会自己调参的智能MACD