
震荡的定义与程序化交易的困境
震荡行情,是指价格在一定区间内反复波动,缺乏明确趋势。在震荡中,趋势跟踪型程序化交易模型容易遭受连续亏损,因为模型在趋势启动时入场,但震荡中价格很快反转,导致止损出场,反复止损产生较大回撤。
程序化交易模型的本质是执行既定规则,无法预知未来,因此任何模型都无法彻底避免震荡。但通过优化规则,模型可以减少震荡期的不利交易,提高整体稳定性。
使用趋势过滤器并处理噪音
市场在大部分时间处于震荡,明确趋势时间较少,所以模型必须设定过滤条件。常用方法之一是计算移动平均线斜率或ADX指标。当ADX低于阈值(如20),表明市场无趋势,此时模型暂停新开仓,只平仓已有头寸。

另一方法是价格通道突破,如唐奇安通道。只有当收盘价突破通道上轨或下轨一定幅度时,才触发信号,减少假突破。
噪音处理方面,可引入价格压缩率或ATR比例。若近期K线实体较小,且ATR下降,说明波动收窄,模型应减少仓位或停止开仓。
多周期信号共振
单一周期信号易被震荡误导,使用多周期过滤能提升有效性。例如,在日线级别确认趋势方向,在小时级别寻找入场点。若日线趋势向上,但小时线震荡,模型可等待小时线回调至移动平均线附近且出现反转K线形态时做多。
多周期同步要求较高,但可以减少震荡期间的无谓交易。实现时需定义周期权重,如长周期信号权重为2,短周期为1,当综合得分超过阈值才执行。
波动率自适应参数
震荡中波动率下降,趋势中波动率上升。模型参数随ATR动态调整,可以适应不同市况。例如,止损距离设定为2倍ATR,ATR缩小时止损变小,能快速止损避免深亏,ATR增大时止损放宽,不易被甩出趋势。
仓位管理同样动态化:当ATR处于历史低位,可能预示变盘,降低仓位或空仓;当ATR突破阈值,逐步加仓。
状态切换机制
为更好应对震荡,模型可内置市场状态识别,区分震荡与趋势,采用不同策略参数。识别方法包括均线交叉角度、价格突破成功率统计。例如,最近20次突破中,成功创新高或新低的次数少于30%,则判定为震荡。
震荡状态中,模型切换为逆势策略,如均值回归,在区间高位做空、低位做多,并严格设置止盈止损。但需注意,市场状态可能突变,状态切换不可过度频繁,否则会加剧震荡期亏损。
风险与资金管理
即使模型过滤能力增强,震荡期仍可能连续亏损,因此风险控制至关重要。设置每日最大亏损限制,如总资金回撤3%即停止交易当日。每个品种或策略分配固定风险比例,例如每笔交易风险为账户的1%。
使用凯利公式或固定比例仓位,避免在不利时期重仓。还可设置时间止损,若开仓后一段时间(如K线数>10)价格未向有利方向移动,则平仓离场。
实践测试与优化
对模型进行历史回测时,需分年段考察,特别是包含长期震荡的区间,如2015年下半年A股。观察模型在震荡段的最大回撤和连续亏损次数,若回撤超过30%,应调整过滤条件或参数。
优化时避免过拟合,可使用样本外数据验证。参数范围不宜过大,可先以ATR倍数、ADX阈值、均线周期为主要变量,用遗传算法或网格搜索寻找稳健组合。
量化代码示例(Python伪代码)
# 定义震荡过滤函数
def is_trend(data):
adx = compute_adx(data, period=14)
return adx > 25 # 若ADX>25则判定有趋势
def strategy_long(data):
trend = is_trend(data)
if not trend:
return "no signal"
# 以唐奇安通道突破为入场条件
if data['close'] > donchian_high(data, 20):
return "buy"
def strategy_short(data):
trend = is_trend(data)
if not trend:
return "no signal"
if data['close'] < donchian_low(data, 20):
return "sell"
# 震动期关闭新交易
def should_trade(data):
atr = compute_atr(data, period=14)
if atr < atr_lower_threshold:
return False
return True
程序化交易模型不能保证完全避免震荡,但通过多维度过滤机制和动态风险管理,可显著降低震荡期的负面表现。交易者需明确,模型的目标不是每次都对,而是长期期望为正。震荡是市场固有属性,重要的是在震荡中保存实力,在趋势中获取利润。