资源加载中... loading...

基于MACD柱色和线性回归的高频对冲策略

Author: ChaoZhang, Date: 2023-10-27 10:42:54
Tags:

基于MACD柱色和线性回归的高频对冲策略

概述

本策略融合了MACD柱色和线性回归指标,通过巧妙的组合实现高频的反转交易,特别适合短线套利和对冲,属于典型的市场中性策略。

策略原理

该策略主要由以下几部分组成:

  1. MACD柱色作为趋势判断指标。当MACD柱子颜色是绿色时,说明处于上涨趋势,这时不做空单;当MACD柱子颜色是红色时,说明处于下跌趋势,这时不做多单。

  2. 线性回归作为关键的交易信号指标。当价格从下方上穿线性回归时,做多;当价格从上方下穿线性回归时,做空。

  3. PAC通道由高、低、收盘价的EMA组成,用于判断线性回归的方向。只有当线性回归方向符合通道内趋势时,才产生交易信号。

  4. EMA 89作为止损线,当价格重新回穿该线时,平仓止损。

交易信号的生成逻辑是:

多头信号:线性回归上穿PAC通道下轨 且 线性回归上坡趋势 且 MACD柱子颜色不是红色 空头信号:线性回归下穿PAC通道上轨 且 线性回归下坡趋势 且 MACD柱子颜色不是绿色

止损退出信号:价格下穿EMA 89

该策略结合趋势判断和关键价格水平,实现高频的对冲交易。

优势分析

  1. 使用MACD柱子颜色判断大趋势,避免逆势交易。

  2. 线性回归具有平滑性,可以过滤掉部分噪音。

  3. EMA形成的通道清晰地界定多空方向。

  4. 止损线设置合理,最大限度保证盈利。

  5. 交易频率高,适合借助程序交易的高频策略。

  6. 实现对冲交易,可在震荡行情中获利。

风险分析

  1. 线性回归和通道指标都需要一定参数优化,否则可能出现失效。

  2. 大幅震荡行情中止损可能较频繁被触发。可以适当放宽止损范围。

  3. 交易次数较高,需要注意手续费的影响。

  4. MACD指标具有一定滞后性,可能错过短期趋势反转。

  5. EMA通道也需要不断优化,以适应市场变化。

优化方向

  1. 调整线性回归和通道参数,使指标更符合不同品种特点。

  2. 放宽止损幅度,同时确保止盈比大于1。

  3. 优化MACD参数,使其能捕捉到更多短期信号。

  4. 尝试其他指标替代线性回归,如布林线。

  5. 增加仓位控制,防止单边亏损过大。

  6. 结合RSI等指标过滤部分交易信号。

总结

本策略综合运用多种技术指标,实现高频的对冲交易。其优势在于抓住短期反转,风险控制合理,非常适合市场震荡时期。同时也需要注意一定的参数优化和改进,防止出现过拟合。如果管理得当,可以成为具有很强实战意义的高频策略。


/*backtest
start: 2022-10-20 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy("Sonic R + Linear Reg + Kumo Cloud + Barcolor MACD", overlay=true,default_qty_value=10000,initial_capital=200,currency=currency.USD, pyramiding=1)
EMA = input(defval=89, title="EMA Signal")
HiLoLen     = input(34, minval=2,title="High Low channel Length")
pacC        = ema(close,HiLoLen)
pacL        = ema(low,HiLoLen)
pacH        = ema(high,HiLoLen)
DODGERBLUE = #1E90FFFF
// Plot the Price Action Channel (PAC) base on EMA high,low and close//
L=plot(pacL, color=DODGERBLUE, linewidth=1, title="High PAC EMA",transp=90)
H=plot(pacH, color=DODGERBLUE, linewidth=1, title="Low PAC EMA",transp=90)
C=plot(pacC, color=DODGERBLUE, linewidth=2, title="Close PAC EMA",transp=80)
//Moving Average//
signalMA =ema(close,EMA)
plot(signalMA,title="EMA Signal",color=black,linewidth=3,style=line)
linereg = linreg(close, EMA, 0)
plot(linereg, color = orange, title = "Linear Regression Curve", style = line, linewidth = 1)
//////ICHIMOKU/////////
conversionPeriods = input(9),
basePeriods = input(26, minval=1, title="Base Line")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span"),
displacement = input(26, minval=1)
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = avg(conversionLine, baseLine) 
leadLine2 = donchian(laggingSpan2Periods-1)
p1 = plot(leadLine1, offset = displacement-1, color=gray,title="Senkou span A", transp=90)
p2 = plot(leadLine2, offset = displacement-1, color=gray, title="Senkou span B", transp=90)
fill(p1, p2, color = leadLine1 > leadLine2 ? green : red, title="Kumo Cloud")
///////////////// MACD BARCOLOR /////////////////////
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD
hisup= iff(delta>delta[1] and delta>0, 1,
	     iff(delta<delta[1], -1, nz(hisup[1], 0)))
hisdown = iff(delta<delta[1] and delta<0, 1,
	     iff(delta>delta[1], -1, nz(hisdown[1], 0)))
barcolor(hisup==1 and MACD>0 ? lime: hisdown==1 and MACD<0 ? red : blue )
///////////// SIGNAL ///////////////
conbuy = iff(crossover(linereg,pacL) and rising(linereg,5), 1,
	     iff(crossover(linereg,pacH) or (crossunder(linereg,pacL) and pacL<signalMA), -1, nz(conbuy[1], 0)))
consell = iff(crossunder(linereg,pacH) and falling(linereg,5), 1,
	     iff(crossunder(linereg,pacL) or (crossover(linereg,pacH) and pacH>signalMA), -1, nz(consell[1], 0)))
golong= conbuy==1 and close>open and open<pacH and close>linereg and hisdown!=1
goshort= consell==1 and close<open and open>pacL and close<linereg and hisup!=1
if(golong)
    strategy.entry("Buy",strategy.long)
if(goshort)
    strategy.entry("Sell",strategy.short)
closelong= conbuy==-1
closeshort=consell==-1
if(closelong)
    strategy.close("Buy")
if(closeshort)
    strategy.close("Sell")
 ////////////// TP and SL//.
//SL = input(defval=200.00, title="Stop Loss Point", type=float, step=1)
//rr= input(defval=0.1,title="Reward/Risk",type=float)
//useTPandSL = input(defval = false, title = "Use exit order strategy?")
//Stop = SL
//Take=SL*rr
//Q = 100
//if(useTPandSL)
//    strategy.exit("Out Long", "Buy", qty_percent=Q, profit= Take, loss=Stop)
//    strategy.exit("Out Short", "Sell", qty_percent=Q, profit= Take, loss=Stop) 

更多内容