基于信噪比和均线的量化交易策略


创建日期: 2024-01-02 12:24:35 最后修改: 2024-01-02 12:24:35
复制: 1 点击次数: 586
avatar of ChaoZhang ChaoZhang
1
关注
1251
关注者

基于信噪比和均线的量化交易策略

一、策略名称

信噪比均线交易策略(Signal-to-Noise Moving Average Trading Strategy)

二、策略概述

该策略通过计算一定周期内的信噪比,再结合均线交易信号,实现量化交易。其基本思路是:

  1. 计算一定周期(可设定)的信噪比
  2. 对信噪比应用均线平滑
  3. 比较当前信噪比与均线值,产生交易信号
  4. 根据交易信号做多头或空头

三、策略原理

  1. 信噪比(Signal to Noise Ratio)的计算公式为:StN = -10*log(Σ(1/close)/n) 其中n为周期长度
  2. 对信噪比应用简单移动平均(SMA)得到平滑信噪比
  3. 比较当前信噪比StN与平滑信噪比SMAStN: (1) 如果SMAStN > StN,做空 (2) 如果SMAStN < StN,做多 (3) 否则清仓

四、策略优势分析

该策略主要有以下优势: 1. 信噪比能判断市场波动和风险,SMA有去噪功能 2. 结合信噪比判断市场风险与SMA产生交易信号,运用不同指标优势 3. 可设定参数调整策略,适应不同市场情况 4. 可Stdout信号指示做多做空,直观判断市场特征

五、策略风险分析

该策略也存在一些风险:
1. 信噪比与均线交叉判断存在错位风险 2. 周期设定不当可能导致虚假信号 3. 做空机会相对少,可通过参数调整优化 4. 突发事件导致剧烈波动,可能触发止损

风险解决: 1. 调整均线参数,避免平滑过度 2. 优化周期参数,测试不同市场适应性 3. 调整做空条件,提供更多做空机会 4. 设置止损以控制最大损失

六、策略优化方向

该策略可以从以下方面进行优化: 1. 测试更多类型均线的搭配使用 2. 增加止损机制控制风险 3. 增加仓位管理,根据波动调整仓位 4. 结合更多因子判断,提高策略稳定性 5. 使用机器学习方法自动优化参数

七、总结

本策略通过信噪比判断市场波动风险,并利用均线产生交易信号,实现量化交易。相比单一技术指标,本策略整合信噪比与SMA各自的优势,在控制风险的同时提高稳定性。通过参数优化与机器学习等方式,本策略有很大的改进空间,是一种可靠、有效的量化交易策略。

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

//@version=4
////////////////////////////////////////////////////////////
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HPotter 05/01/2021
// The signal-to-noise (S/N) ratio. 
// And Simple Moving Average.
// Thank you for idea BlockchainYahoo
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors. 
////////////////////////////////////////////////////////////
SignalToNoise(length) =>
    StN = 0.0
    for i = 1 to length-1
        StN := StN + (1/close[i])/length
    StN := -10*log(StN)

strategy(title="Backtest Signal To Noise ", shorttitle="StoN", overlay=false)
length = input(title="Days", type=input.integer, defval=21, minval=2)
Smooth =  input(title="Smooth", type=input.integer, defval=7, minval=2)
reverse = input(false, title="Trade reverse")
StN = SignalToNoise(length)
SMAStN = sma(StN, Smooth)
pos = iff(SMAStN[1] > StN[1] , -1,
	   iff(SMAStN[1] < StN[1], 1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )
plot(StN, title='StN' )
plot(SMAStN, title='Smooth', color=#00ff00)