0基础开始Pine量化 多重时间框架EMA+Supertrend策略(附代码)

0基础开始Pine量化 多重时间框架EMA+Supertrend策略(附代码)

基于金叉动量捕捉策略:多重时间框架指数移动平均线交叉系统
三重超级趋势交叉策略
发明者量化网站上回测试验

啥是EMA(指数移动平均线)

EMA(Exponential Moving Average) 是一种用于金融市场技术分析的趋势跟踪指标。与简单移动平均线(SMA)相比,EMA对近期的价格变化更加敏感,因为它赋予较新的价格数据更高的权重。EMA的目的在于平滑价格波动,从而帮助交易者识别市场的趋势方向。

计算方式:
EMA的计算公式为:

\(EMA=(\frac{2}{N+1})\times(当前价格−前一周期的EMA)+前一周期的EMA\)

其中,N是选定的周期数。与SMA不同,EMA对新数据的反应更加迅速,因为它对最新的价格赋予更大的权重。

应用场景:
趋势确认:EMA可以用于判断价格是处于上涨趋势还是下跌趋势。当价格高于长期EMA(如50、200周期)时,通常表明市场处于上升趋势,反之则表示下跌趋势。
动量策略:交易者经常结合多个不同周期的EMA来判断趋势的变化,例如9周期EMA和26周期EMA交叉。短期EMA上穿长期EMA被称为金叉,代表买入信号,短期EMA下穿长期EMA被称为死叉,代表卖出信号。
风险管理:EMA可以帮助交易者设置动态的止损和止盈位。

啥是Supertrend(超级趋势)

Supertrend 是一种基于市场波动性和价格的趋势跟踪指标。它通过使用ATR(平均真实波动范围)来衡量市场的波动,并根据价格的变化动态生成趋势线,帮助交易者捕捉趋势的反转点。

计算方式:
Supertrend的核心是ATR,它通过以下步骤计算:

ATR:先计算出给定周期的ATR,ATR用于衡量市场的波动性。

  • 步骤1:计算每一天的真实波动范围(True Range, TR)
    \(TR=max(|H-L|,|H-C_prev|,|L-C_prev|)\),其中
    \(H=\)当前交易日的最高价(High)
    \(L=\)当前交易日的最低价(Low)
    \(C_prev=\)前一个交易日的收盘价(Previous Close)
    真实波动范围的三个可能值分别为:

    • 当前交易日的最高价与最低价之间的差值(当天的价格波动)
    • 当前交易日的最高价与前一天收盘价之间的差值
    • 当前交易日的最低价与前一天收盘价之间的差值
  • 步骤2:计算n天的平均真实波动范围(ATR)
    ATR是n天的TR的简单移动平均值,常见的周期为14天:
    \(ATR=\frac{TR_1+TR_2+···+TR_n}{n}\)
    其中,n表示选定的时间周期,通常为14个交易日。ATR值会随着市场波动的增大而上升,随着波动的减弱而下降。

Supertrend线:将当前ATR乘以一个特定的倍数(如2或3),并将其加到价格上方或减到价格下方,生成趋势线。当价格突破上方趋势线时,表明市场进入上涨趋势;当价格跌破下方趋势线时,表明市场进入下跌趋势。

多重时间框架EMA回测

1.多重时间框架分析:

  • 在较高时间框架(如日线或4小时线)上分析EMA 9、EMA 26和EMA 55的走势,确定整体市场趋势。(9、26、55是指这些EMA的周期,即每条EMA的计算基础是过去多少个时间单位的价格数据。这些数字定义了每个EMA的“灵敏度”和“时间跨度”。)
  • 如果EMA 55在高时间框架上呈上升趋势,则视为牛市环境;如果呈下降趋势,则视为熊市环境。

2.低时间框架执行:

  • 在确定高时间框架趋势后,转向较低时间框架(如15分钟或1小时)寻找具体的交易信号。
  • 买入信号:当EMA 9从下方穿过EMA 26,且两者都位于EMA 55上方时,产生买入信号。
  • 卖出信号:当EMA 9从上方穿过EMA 26,且两者都位于EMA 55下方时,产生卖出信号。

3.信号确认:

  • 买入确认:除了EMA交叉外,还需要EMA 9和EMA 26都位于EMA 55上方,并且与高时间框架的牛市趋势一致。
  • 卖出确认:除了EMA交叉外,还需要EMA 9和EMA 26都位于EMA 55下方,并且与高时间框架的熊市趋势一致。

下面是2024-6-30到2024-7-30的回测

可以发现效果还是不错的,年化收益高,但夏普比率低,回撤也还行

下面是2023-6-30到2024-7-30的回测

回撤很高

三重超级趋势交叉回测

该策略使用了三个超级趋势指标,分别是:

  1. 超级趋势1:周期为7,因子为3
  2. 超级趋势2:周期为14,因子为2
  3. 超级趋势3:周期为21,因子为1

周期是用于计算ATR(平均真实波动范围,Average True Range)的时间长度。ATR衡量市场的波动性,周期越长,ATR越平滑。在"周期为7"的情况下,ATR基于最近7个单位的价格数据进行计算。这个单位可以是分钟、小时、日线等,具体取决于你在图表中选择的时间框架。例如,如果你使用的是1小时图,并设置了周期为7,则ATR会基于最近7个小时的市场波动来计算。

因子决定了ATR的放大倍数,用于生成超级趋势线与价格之间的距离。在"因子为3"的情况下,ATR的值会乘以3,得到一个更大的值,这会使超级趋势线在价格图上显得更远离当前价格。因子越大,超级趋势线就越宽松,给出的买卖信号就越少,过滤掉的噪音更多。较小的因子则使得趋势线更贴近价格,产生更多的信号,但噪音也可能增加。

策略的运作原理如下:

  1. 买入信号:当价格向上穿越任意一条超级趋势线时触发
  2. 卖出信号:当价格向下穿越任意一条超级趋势线时触发
  3. 策略在买入信号出现时开仓做多,在卖出信号出现时平仓

下面是2024-6-30到2024-7-30的回测

下面是2023-6-30到2024-7-30的回测,回撤还是不行

(改进版)多重时间框架EMA+Supertrend策略

就是把两个测试组合一下

下面是2024-6-30到2024-7-30的回测

下面是2023-6-30到2024-7-30的回测

回撤下来了,但可惜的是,年化收益也下来了,虽然达到了实习考核要求,但为啥会这样呢?

原因:

降低回撤:当策略通过加入多个过滤器(如Supertrend和多重时间框架EMA)减少了不利的市场波动影响时,回撤率会下降,因为策略更倾向于减少交易次数,避免风险较高的行情。这有效控制了潜在的亏损。

收益减少:然而,减少回撤往往伴随着风险的减少,意味着策略可能会错失一些高风险的交易机会。这些机会虽然带有较大的潜在回撤,但同样也有可能带来高额的收益。因此,降低回撤的同时,减少了高收益的交易机会,导致年化收益率下降。

而且Supertrend与多重时间框架EMA都倾向于追踪大趋势并过滤短期波动。这可能导致在趋势的初期或震荡市中,信号被过滤掉,从而无法抓住市场中的反弹或趋势反转。这些反转点往往是短期内可以带来较高收益的机会,但被过滤掉后,收益率会下降。

Pine源码

/*backtest
start: 2024-06-30 00:00:00
end: 2024-07-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Golden Crossover with Supertrend", overlay=true)

// Define EMA lengths
ema9_length = 9
ema26_length = 26
ema55_length = 55

// Input parameters for different timeframes
timeFrame9 = input.timeframe('', 'Time Frame - EMA 9')
timeFrame26 = input.timeframe('', 'Time Frame - EMA 26')
timeFrame55 = input.timeframe('', 'Time Frame - EMA 55')

// Request EMA data from specified time frames
ema9 = request.security(syminfo.tickerid, timeFrame9, ta.ema(close, ema9_length))
ema26 = request.security(syminfo.tickerid, timeFrame26, ta.ema(close, ema26_length))
ema55 = request.security(syminfo.tickerid, timeFrame55, ta.ema(close, ema55_length))

// Supertrend function
supertrend(length, factor) =>
    [superTrend, direction] = ta.supertrend(factor, length)
    superTrend

// Supertrend parameters
length1 = 7
factor1 = 3
length2 = 14
factor2 = 2
length3 = 21
factor3 = 1

// Supertrend calculations
superTrend1 = supertrend(length1, factor1)
superTrend2 = supertrend(length2, factor2)
superTrend3 = supertrend(length3, factor3)

// Plot EMAs on the chart
plot(ema9, color=color.black, title="EMA 9")
plot(ema26, color=color.green, title="EMA 26")
plot(ema55, color=color.red, title="EMA 55")

// Plot Supertrend lines
plot(superTrend1, color=color.red, title="Supertrend 1")
plot(superTrend2, color=color.green, title="Supertrend 2")
plot(superTrend3, color=color.blue, title="Supertrend 3")

// Define buy and sell conditions combining EMA crossover and Supertrend
buy_condition_ema = ta.crossover(ema9, ema26) and ema26 > ema55
sell_condition_ema = ta.crossunder(ema9, ema26) and ema26 < ema55

buy_condition_supertrend = ta.crossover(close, superTrend1) or ta.crossover(close, superTrend2) or ta.crossover(close, superTrend3)
sell_condition_supertrend = ta.crossunder(close, superTrend1) or ta.crossunder(close, superTrend2) or ta.crossunder(close, superTrend3)

// Combine the conditions
buy_condition = buy_condition_ema and buy_condition_supertrend
sell_condition = sell_condition_ema or sell_condition_supertrend

// Execute buy and sell orders
if (buy_condition)
    strategy.entry("Buy", strategy.long)

if (sell_condition)
    strategy.close("Buy")

// Plot buy and sell signals on the chart
plotshape(series=buy_condition, location=location.belowbar, color=color.green, style=shape.arrowup, title="Buy Signal")
plotshape(series=sell_condition, location=location.abovebar, color=color.red, style=shape.arrowdown, title="Sell Signal")

可能的改进:

调整参数,结合一些其他的动量指标(如RSI、MACD)来增加策略的信号确认,避免过度依赖于趋势信号

posted @ 2024-09-10 19:25  Mephostopheles  阅读(152)  评论(0编辑  收藏  举报