概述
均值回归是一种逆势交易,交易者预估价格将返回到某种形式的均衡点位,通常依据均值或其它向心趋势统计值来衡量。 本文讨论一个非常简单的均值回归交易策略。
均值回归快速介绍
行情通常以无规律的周期波动。 这意味着,当我们查看图表时,我们往往会看到上升、下降和相对平坦的阶段。 交易和投资的关键是能够判定这些阶段的变化,这些阶段也称为行情制度。
均值回归可以采用移动平均线的形式,如果行情离它太远,它可能会回退到其区域附近。
什么是均值回归?
均值回归是一个金融术语,即假设资产价格随时间推移,趋向聚拢到平均价格。
使用均值回归作为时机策略涉及辨别证券的交易范围,以及利用量化方法计算平均价格。 均值回归是一种现象,在大量的金融时序数据中均有所表现,来自价格数据、收益数据、和账面数值。
当现行价格低于过去的平均价格时,可认为该证对买方具有吸引力,并预估价格会上涨。 当现行价格高于过去的平均价格时,则预估行情价格会下跌。 换言之,预计自平均价格的偏差将退回至平均值。 这些知识可当作多交易策略的基石。
股票报告服务通常提供周期为 50 天和 100 天的移动平均线。 虽然报告服务提供了平均值,但仍然需要辨别所研究期间的最高价和最低价。
与图表相比,均值回归似乎是一种更科学地选择股票买卖点的方法,因为精确的数值衍生自历史数据,可识别买入/卖出价位,而非试图使用图表(图表,也称为技术分析)来解释价格走势,尽管新兴的尝试是利用 RSI 指标和平均真实范围(ATR)来捕捉这种系统形态。
许多资产类型,甚至汇率,都观测到均值回归;不过,这个过程也许会持续数年,因此对短线投资者并无价值。
均值回归应当展现出一种对称形式,因为一只股票高于或低于其历史平均水平的频率大致相仿。
历史均值回归模型不会收容证券价格的全部实际行为。 例如,也许会出现新信息,永久性影响标的股票的长期估值。 在破产的情况下,它也许会完全停止交易,永远无法恢复到曾经的历史平均水平。
在金融领域中,“均值回归”一词与统计学中的“回归或回归均值”的含义略有不同。杰里米·西格尔(Jeremy Siegel)使用“均值回报率”一词来描述一般原则,即一个金融时序,其中“在短期内回报可能非常不稳定,但从长期来看非常稳定”。按量化来讲,平均年回报率的标准差下降速度快于持有期的倒数,这意味着该过程不是随机游走,而是在低回报率区间之后迎来高回报的补偿期,例如季节性商业。
设计策略
现在,我们取行情与其 200-周期移动平均线的间距,据其得到一个 50-周期的常规化均值,我们准备遵照以下交易信号编码:
每当常规化指数自等于 100 后回落,而当前收盘价低于 5-周期前的收盘价,且低于 200-周期移动平均线时,就会生成做多(买入)信号。
每当常规化指数自等于 100 后回落,而当前收盘价高于 5-周期前的收盘价,且高于 200-周期移动平均线时,就会生成做空(卖出)信号。
如此,在给定条件下,或许这并非最简单的策略,但尽管如此,它还是非常直观和直接的。 信号功能如下:
自上一章节,我们已有明确的目标来开始设计策略:
每当行情远低于其移动平均线时,就会生成做多(买入)信号,寄希望于它回退到较高的均值。
每当行情远高于其移动平均线时,就会生成做空(卖出)信号,寄希望于它回退到较低的均值。
我将对策略进行一些修改,尝试在策略作用不佳时(当净值走低)获得更好的结果。 我将修改这个策略:
- 取代查看最后的收盘价,我会查看最高价和最低价的走高,以便尝试筛选更好的开单。
开单不会太频繁。
修改后的代码如下:
if(previousValue==100)
{
if(Normalizado<100 && array_ma[0]>tick.bid && rates[5].high < rates[1].low )
{
Print("Open Order Buy");
Alert(" Buying");
Orden="Buy";
sl=NormalizeDouble(tick.ask - ptsl*_Point,_Digits);
tp=NormalizeDouble(tick.bid + pttp*_Point,_Digits);
//trade.Buy(get_lot(tick.bid),_Symbol,tick.bid,sl,tp);
trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,get_lot(tick.bid),tick.bid,sl,tp,"Buy");
}
if(Normalizado<100 && array_ma[0]<tick.ask && rates[5].low > rates[1].high )
{
Print("Open Order Sell");
Alert(" Selling");
Orden="Sell";
sl=NormalizeDouble(tick.bid + ptsl*_Point,_Digits);
tp=NormalizeDouble(tick.ask - pttp*_Point,_Digits);
//trade.Sell(get_lot_s(tick.ask),_Symbol,tick.ask,sl,tp);
trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,get_lot(tick.ask),tick.ask,sl,tp,"Sell");
}
}