多因子驱动趋势追踪策略


创建日期: 2024-01-17 14:02:22 最后修改: 2024-01-17 14:02:22
复制: 0 点击次数: 435
avatar of ChaoZhang ChaoZhang
1
关注
1301
关注者

多因子驱动趋势追踪策略

概述

本策略通过结合移动平均聚散指标(MACD)和随机相对强弱指标(Stoch RSI)两个因子来判断行情趋势方向,在趋势向上时做多,趋势向下时做空,属于趋势追踪类型策略。

策略原理

本策略使用了MACD和Stoch RSI两个指标判断市场趋势方向。

MACD指标是由快线(ema快线)和慢线(ema慢线)及其差值组成,其反映了短期和长期平均线的聚合和分离状况。当快线上穿慢线时为买入信号,快线下穿慢线时为卖出信号。

Stoch RSI指标结合了RSI指标和Stoch指标的优点,可以显示市场的超买超卖现象。Stoch RSI大于Stoch RSI信号线时为买入信号,小于信号线时为卖出信号。

本策略在日线和4小时线上使用MACD和Stoch RSI判断市场趋势方向。当日线和4小时线上的两个指标同时发出买入信号时,做多;当两个指标同时发出卖出信号时,做空。这样可以有效过滤假信号,提高信号的可靠性。

策略优势

  1. 结合双重因子判断市场走势,可以有效过滤假信号,提高信号准确率

  2. 在高低时间轴(日线和4小时线)验证信号,避免被套利

  3. 追踪趋势运行,避开震荡市

  4. 策略思路清晰简单,容易理解执行

风险与解决

  1. 无法有效判断趋势转折点,可能原地反转止损
  • 适当调整参数优化,或增加其他指标判断
  1. 单一合约无法分散市场系统性风险
  • 增加其他合约或者股票进行分散投资
  1. 无法判断突发重大事件的影响
  • 结合基本面分析,增强风险防范意识

优化方向

  1. 调整MACD和Stoch RSI的参数,优化买卖点

  2. 增加移动止损策略,锁定盈利

  3. 增加资金管理模块,控制单笔仓位

  4. 结合更多因子判断,增加信号准确率

  5. 采用机器学习方法动态优化参数

总结

本策略通过双因子模型判断行情趋势方向,结合高低时间轴验证信号,是一种较为稳定可靠的趋势追踪策略。具备一定的风险防范能力和容错空间。后期通过参数优化、止损策略、资金管理等模块的加入,可望获得更好的策略表现。

策略源码
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title='[RS]Khizon (UGAZ) Strategy V0', shorttitle='K', overlay=false, pyramiding=0, initial_capital=100000, currency=currency.USD)
//  ||  Inputs:
macd_src = input(title='MACD Source:',  defval=close)
macd_fast = input(title='MACD Fast Length:',  defval=12)
macd_slow = input(title='MACD Slow Length:',  defval=26)
macd_signal_smooth = input(title='MACD Signal Smoothing:',  defval=9)
srsi_src = input(title='SRSI Source:',  defval=close)
srsi_rsi_length = input(title='SRSI RSI Length:',  defval=14)
srsi_stoch_length = input(title='SRSI Stoch Length:',  defval=14)
srsi_smooth = input(title='SRSI Smoothing:',  defval=3)
srsi_signal_smooth = input(title='SRSI Signal Smoothing:',  defval=3)
//  ||  Strategy Inputs:
trade_size = input(title='Trade Size in USD:', type=float, defval=1)
buy_trade = input(title='Perform buy trading?', type=bool, defval=true)
sel_trade = input(title='Perform sell trading?', type=bool, defval=true)
//  ||  MACD(close, 12, 26, 9):     ||---------------------------------------------||
f_macd_trigger(_src, _fast, _slow, _signal_smooth)=>
    _macd = ema(_src, _fast) - ema(_src, _slow)
    _signal = sma(_macd, _signal_smooth)
    _return_trigger = _macd >= _signal ? true : false
//  ||  Stoch RSI(close, 14, 14, 3, 3)  ||-----------------------------------------||
f_srsi_trigger(_src, _rsi_length, _stoch_length, _smooth, _signal_smooth)=>
    _rsi = rsi(_src, _rsi_length)
    _stoch = sma(stoch(_rsi, _rsi, _rsi, _stoch_length), _smooth)
    _signal = sma(_stoch, _signal_smooth)
    _return_trigger = _stoch >= _signal ? true : false
//  ||-----------------------------------------------------------------------------||
//  ||-----------------------------------------------------------------------------||
//  ||  Check Directional Bias from daily timeframe:
daily_trigger = security('NGAS', 'D', f_macd_trigger(macd_src, macd_fast, macd_slow, macd_signal_smooth) and f_srsi_trigger(srsi_src, srsi_rsi_length, srsi_stoch_length, srsi_smooth, srsi_signal_smooth))
h4_trigger = security('NGAS', '240', f_macd_trigger(macd_src, macd_fast, macd_slow, macd_signal_smooth) and f_srsi_trigger(srsi_src, srsi_rsi_length, srsi_stoch_length, srsi_smooth, srsi_signal_smooth))

plot(title='D1T', series=daily_trigger?0:na, style=circles, color=blue, linewidth=4, transp=65)
plot(title='H4T', series=h4_trigger?0:na, style=circles, color=navy, linewidth=2, transp=0)

sel_open = sel_trade and not daily_trigger and not h4_trigger
buy_open = buy_trade and daily_trigger and h4_trigger
sel_close = not buy_trade and daily_trigger and h4_trigger
buy_close = not sel_trade and not daily_trigger and not h4_trigger
strategy.entry('sel', long=false, qty=trade_size, comment='sel', when=sel_open)
strategy.close('sel', when=sel_close)
strategy.entry('buy', long=true, qty=trade_size, comment='buy', when=buy_open)
strategy.close('buy', when=buy_close)