一种基于移动平均线交叉交易策略

Author: ChaoZhang, Date: 2024-01-24 14:59:44
Tags:

一种基于移动平均线交叉交易策略

概述

移动平均线交叉交易策略是一种较为常见的量化交易策略。该策略通过计算不同周期的移动平均线,并根据它们的交叉情况来产生交易信号。具体来说,是计算4周期、8周期和20周期的指数移动平均线(EMA),当短期EMA上穿长期EMA时,做多;当短期EMA下破长期EMA时,做空。

策略原理

该策略的核心逻辑是:

  1. 计算4周期、8周期和20周期的EMA线。
  2. 判断4周期EMA线和8周期EMA线的关系:
    1. 当4周期EMA线上穿8周期EMA线时,说明价格走势变强,属于多头信号。
    2. 当4周期EMA下破8周期EMA时,说明价格走势变弱,属于空头信号。
  3. 同时判断20周期EMA线的方向:
    1. 如果20周期EMA线上升,则Enter Long。
    2. 如果20周期EMA线下降,则Enter Short。
  4. 当4周期EMA线和8周期EMA线关系发生反转时, Prepare Exit。
  5. 当20周期EMA线方向发生反转时,Exit Now。

通过这个方法,我们利用了不同周期均线之间的交叉来判断市场Signals,同时利用了最长周期均线的方向来过滤误信号,构建一个稳定的交易策略。

策略优势

该策略主要具有以下几点优势:

  1. 策略逻辑简单清晰,容易理解和实现。
  2. 利用双重条件过滤,可以减少误信号。
  3. 20周期EMA的加持,可以识别大趋势,增强稳定性。
  4. 可自定义参数,调整交易频率。
  5. 容易和其他指标或模型组合,构建复合策略。

策略风险

该策略也存在一些风险:

  1. 双重均线策略容易产生假信号。
  2. 固定周期无法适应市场变化。
  3. 大盘震荡时容易产生亏损。

主要的解决方法是:

  1. 适当缩短持仓周期,及时止损。
  2. 动态优化参数,调整均线周期。
  3. 结合其它指标或模型创建复合策略。

策略优化

该策略可以从以下几个方面进行优化:

  1. 周期优化:根据不同品种确定最佳的MA周期组合 2.止损优化:合理设置止损点,控制单笔损失 3.参数优化:采用遗传算法、马尔可夫链等方法动态优化参数

4.模型融合:与LSTM、RNN等深度学习模型整合,提取更多Alpha

5.组合优化:与其它指标策略组合,构建策略组合

总结

移动平均线交叉策略整体来说是一种较为经典和常用的量化交易策略。该策略逻辑简单,容易理解和实现,具有一定的稳定性。但也存在一些问题,如产生假信号、无法适应市场变化等。这些问题可以通过参数优化、止损优化、模型融合等方法加以改进。总的来说,移动平均线策略可以作为策略工具箱中的一个基础模块,与其他更复杂的策略组合,构建稳健的复合策略。


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//future strategy
//strategy(title = "stub", default_qty_type = strategy.fixed, default_qty_value = 1,  overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2.05)
//stock strategy
strategy(title = "stub",   overlay = true)
//forex strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true)
//crypto strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true, commission_type=strategy.commission.percent,commission_value=.0,default_qty_value=10000)


testStartYear = input(1900, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testEndYear = input(2018, "Backtest Start Year")
testEndMonth = input(12, "Backtest Start Month")
testEndDay = input(1, "Backtest Start Day")
testPeriodEnd = timestamp(testStartYear,testStartMonth,testStartDay,0,0)


testPeriod() => true

ema1 = ema(close,4)
ema2 = ema(close,8)
ema3 = ema(close,20)

go_long = ema1[0] > ema2[0] and ema3[0] > ema3[1]
exit_long = ema1[0] < ema2[0] or ema3[0] < ema3[1]

go_short = ema1[0] < ema2[0] and ema3[0] < ema3[1]
exit_short = ema1[0] > ema2[0] or ema3[0] > ema3[1]

 
if testPeriod()
    strategy.entry("simpleBuy", strategy.long, when=go_long)
    strategy.exit("simpleBuy", "simpleSell",when=exit_long)
    
    strategy.entry("simpleSell", strategy.short,when=go_short)
    strategy.exit("simpleSell", "simpleSell",when=exit_short)
        
    


更多内容