双MACD量化交易策略


创建日期: 2023-11-13 18:04:07 最后修改: 2023-11-13 18:04:07
复制: 0 点击次数: 786
avatar of ChaoZhang ChaoZhang
1
关注
1259
关注者

双MACD量化交易策略

概述

该策略运用双EMA均线系统与RSI指标的组合,在判断市场趋势的同时辅助发出交易信号,属于趋势跟踪策略。该策略简单易用,适用于多种大盘指数和数字货币,在2013年至今的回测中取得了500%以上的累计收益。

策略原理

该策略使用两个不同参数设置的MACD作为主要交易指标。第一个MACD采用10周期短均线和22周期长均线,辅助线为9周期均线。第二个MACD采用21周期短均线和45周期长均线,辅助线为20周期均线。

当第一个MACD的DIFF线上穿零轴时产生买入信号,下穿零轴时产生卖出信号。第二个MACD的DIFF线发出的信号作用于确认第一个MACD信号。

同时,该策略还采用了计算价格动量的公式,以最新K线的收盘价+最高价除以前一根K线的收盘价+最高价,结果大于1表示当前处于上升趋势,产生买入信号,反之则产生卖出信号。

最后,Stoch RSI的K线大于20也会确认卖出信号。

优势分析

该策略采用双EMA组合判断趋势,可以有效过滤假突破。辅助的动量公式也可避免因震荡产生错误信号。Stoch RSI指标的运用,可在超买超卖区发出卖出信号,避免追顶。

该策略仅仅使用了几个常见指标的简单组合,没有过于复杂的逻辑关系,非常易于理解与修改。参数设置也非常通用,无需针对不同品种做优化,适应性强。

根据回测结果,该策略在多种品种如股票指数、数字货币等上都取得了不错的累计收益,最大回撤控制也较为理想。可以作为一个非常通用的趋势跟踪策略来使用。

风险分析

该策略主要风险在于使用均线进行判定,当价格出现大幅震荡时容易出现 whipsaw,从而亏损。此外,也没有设置止损来控制单笔损失。

Stoch RSI指标对超买超卖判定的效果并不是非常理想,容易发生错过反转信号的情况。

如果遇到价格剧烈下跌但MACD指标尚未形成死叉时,该策略也会持有仓位继续损失。

优化方向

可以考虑设置止损来控制单笔损失。例如设置ATR止损或按收盘价较低的均线进行止损。

可以增加其他指标进行辅助,例如将KD指标或布林带指标与Stoch RSI组合,来更可靠的判断超买超卖。

可以增加成交量的分析,例如大量减仓时调高止损,或量能不足时避免建仓。

可以测试不同的参数组合,优化MACD的周期参数。也可以测试添加不同周期的MACD,组成多重确认。

总结

该双MACD量化交易策略整体思路简单清晰,采用双EMA组合判断趋势,辅以动量指标避免错误信号,可以筛选出较好的交易时机。该策略参数设置通用,实际表现稳定,可以作为基础策略来进行优化调整。下一步可以通过修正止损方式、增加成交量分析、组合其他指标等手段来进一步增强策略的稳定性和收益率。

策略源码
/*backtest
start: 2023-10-13 00:00:00
end: 2023-11-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Multiple MACD RSI simple strategy", overlay=true, initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=80, pyramiding=0, calc_on_order_fills=true)

fastLength = input(10)
slowlength = input(22)
MACDLength = input(9)

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = sma(MACD, MACDLength)
delta = MACD - aMACD

fastLength2 = input(21)
slowlength2 = input(45)
MACDLength2 = input(20)

MACD2 = ema(open, fastLength2) - ema(open, slowlength2)
aMACD2 = sma(MACD2, MACDLength2)
delta2 = MACD2 - aMACD2


uptrend = (close + high)/(close[1] + high[1])
downtrend = (close + low)/(close[1] + low[1])

smoothK = input(2, minval=1, title="K smoothing Stoch RSI")
smoothD = input(3, minval=1, title= "D smoothing for Stoch RSI")
lengthRSI = input(7, minval=1, title="RSI Length")
lengthStoch = input(8, minval=1, title="Stochastic Length")
src = input(close, title="RSI Source")

rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
h0 = hline(80)
h1 = hline(20)

yearin = input(2018, title="Year to start backtesting from")

if (delta > 0) and (year>=yearin) and (delta2 > 0) and (uptrend > 1)
    strategy.entry("buy", strategy.long, comment="buy")

if (delta < 0) and (year>=yearin) and (delta2 < 0) and (downtrend < 1) and (d > 20)
    strategy.entry("sell", strategy.short, comment="sell")

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)