海龟交易三日反转策略是基于拉里·康诺斯和塞萨尔·阿尔瓦雷斯的《高概率ETF交易》一书中“三日均值回归策略”修改而来。书中作者讨论了一种高概率的ETF均值回归策略,其简单规则是:
通过实践和回测,我发现如果使用EMA而不是SMA计算趋势线,这个策略的效果会更好。所以,这个脚本使用EMA来计算趋势线。我还使退出EMA的长度可调。
该策略的工作原理如下:
其中,退出EMA默认是5日EMA,可调整长度。
该策略的主要思想是利用短期反转效应。当股价连续下跌后表现疲软,很可能会出现短期反弹。该策略通过判断价格是否连续三日收窄且低于短期均线来判断是否存在反转机会。一旦发生反转,通过突破退出EMA来及时止损。
相较于传统的移动均线交叉策略,该策略有以下优势:
利用三日连续收窄判断反转机会,提高了交易信号的质量。
结合长短均线过滤,避免在趋势市场中交易。只在盘整区域捕捉反转。
采用EMA而不是SMA计算趋势线,更加灵敏,捕捉反转更及时。
退出EMA的长度可调,可以根据市场调整止损策略。
交易频率较低,每次只持仓1-2天,避免多头持仓的风险。
该策略也存在以下风险:
反转失败的风险。反转信号发生后,价格可能失败突破,继续下跌而不是反弹。
频繁止损的风险。在震荡行情中,价格可能频繁触发止损。
参数优化风险。退出EMA和其他参数需要根据市场不断测试和优化,如果不调整可能导致效果变差。
过度优化风险。优化时要注意避免过拟合,参数设置要稳健。
可以通过以下方法降低风险:
严格遵守止损规则,控制单笔损失。
优化时采取稳健参数设置,做到风险和收益平衡。
调整仓位大小,降低单笔仓位,分散风险。
该策略可以从以下方面进行优化:
测试不同长度的EMA作为入市和出市指标,找到更合适的参数。
增加其他过滤条件,例如量能指标,确保反转信号更可靠。
优化止损策略,例如采用ATR止损、追踪止损等方式,让止损更灵活。
结合趋势判断,避免反转信号发生在趋势中的错误交易。
进行组合优化,与其他策略组合,利用非相关性分散风险。
采用机器学习等方法进行参数自适应优化,让参数动态调整。
海龟交易三日反转策略通过判断价格连续三日收窄并低于短期EMA的形态,寻找短期反转机会。与传统移动均线策略相比,它入场信号更可靠,通过调整退出EMA参数优化止损。该策略适用于盘整震荡市,能捕捉短期反弹。但在参数优化、止损策略等方面还有优化空间。若与趋势判断和其他策略组合,可以进一步提高效果。
/*backtest start: 2023-10-05 00:00:00 end: 2023-10-12 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // @version = 5 // Author = TradeAutomation strategy(title="ETF 3-Day Reversion Strategy", shorttitle="ETF 3-Day Reversion Strategy", process_orders_on_close=true, overlay=true, commission_type=strategy.commission.cash_per_order, commission_value=1, initial_capital = 10000000, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Backtest Date Range Inputs // StartTime = input(defval=timestamp('01 Jan 2012 05:00 +0000'), title='Start Time') EndTime = input(defval=timestamp('01 Jan 2099 00:00 +0000'), title='End Time') InDateRange = true // Strategy Rules // DayEMA5 = ta.ema(close, 5) Rule1 = close>ta.ema(close, 200) Rule2 = close<DayEMA5 Rule3 = high<high[1] and low<low[1] and high[1]<high[2] and low[1]<low[2] and high[2]<high[3] and low[2]<low[3] ExitEMA = ta.ema(close, input.int(5, "EMA Length For Exit Strategy", tooltip = "The strategy will sell when the price crosses over this EMA")) plot(DayEMA5) plot(ExitEMA, color=color.green) // Entry & Exit Functions // if (InDateRange) strategy.entry("Long", strategy.long, when = Rule1 and Rule2 and Rule3) // strategy.close("Long", when = ta.crossunder(close, ATRTrailingStop)) strategy.close("Long", when = ta.crossover(close, ExitEMA)) if (not InDateRange) strategy.close_all()