为什么连胜会终止?
为什么明星基金终归于平凡?
几乎所有事物都逃不过均值回归。股价也一样,无论高于还是低于均值,都将大概率回归到均值。
这就是Mean-Reversion均值回归策略的底层逻辑,当股价高于均值时,做空;低于均值时,做多,这是一个震荡市的策略。
我们从一个最基本的均值回归模型入手:以SMA(简单移动平均线)作为交易信号。
SMA的计算方法是将某一段时间的收盘价之和除以该周期,可以看成均值。
那偏离均值多少开仓呢?我们再设定一个阈值,当价格偏离均值的程度大于这个阈值时,执行交易。
也就是说当股价高于SMA,并且高出的部分大于这个阈值,就做空股票;反之当股价低于SMA,低出的部分大于这个阈值,就做多股票。当价格回归到SMA附近1%的范围内,平仓。
第一步,导入要用到的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
第二步:策略的实现
def SMAMeanReversion(ticker, sma, threshold, shorts=False,
start_date='2000-01-01', end_date='2020-12-31'):
yfObj = yf.Ticker(ticker)
data = yfObj.history(start=start_date, end=end_date)
data['SMA'] = data['Close'].rolling(sma).mean()
data['extension'] = (data['Close'] - data['SMA']) / data['SMA']
data['position'] = np.nan
data['position'] = np.where(data['extension']<-threshold,
1, data['position'])
if shorts:
data['position'] = np.where(
data['extension']>threshold, -1, data['position'])
data['position'] = np.where(np.abs(data['extension'])<0.01,
0, data['position'])
data['position'] = data['position'].ffill().fillna(0)
# Calculate returns and statistics
data['returns'] = data['Close'] / data['Close'].shift(1)
data['log_returns'] = np.log(data['returns'])
data['strat_returns'] = data['position'].shift(1) * \
data['returns']
data['strat_log_returns'] = data['position'].shift(1) * \
data['log_returns']
data['cum_returns'] = np.exp(data['log_returns'].cumsum())
data['strat_cum_returns'] =
np.exp(data['strat_log_returns'].cumsum())
data['peak'] = data['cum_returns'].cummax()
data['strat_peak'] = data['strat_cum_returns'].cummax()
return data.dropna()
以美国航空为标的,SMA周期设置为50天,阈值定为10%。回测的结果buy&hold和均值回归比较如下图:
可以看到,大部分时间均值回归策略的表现逊色于一直持有股票,涨的少,跌的都差不多。
原因之一是有些极端情况下,太强的趋势改变了均值回归的性质,震荡市已经切换到了单边行情,策略机械地执行越跌越买,最后成本被摊地很高。
为了降低这种风险,我们再在代码里加入一个保护变量,也就是一个上限阈值。
比方说阈值定为10%,上限阈值定为15%,当价格和SMA的偏离在10%和15%之间时,策略照常执行。但是一旦这个偏离高于了15%,就不再下单,从而降低了单边行情中越做越错的风险。
来瞅瞅加了保护变量后的策略表现:
加了保护变量后,不仅总收益率提高了,而且年化波动降低了,夏普比率也由此提高。
加入保护变量后,成功躲过2020年初的疫情大跌,而没加保护的策略会在下跌趋势中不断开多仓,导致很大的回撤:
总结:
这是一个以SMA简单移动平均线作为指标的均值回归策略,你也可以用其他的indicator作为均值指标,比如布林带、股票平均回报率、RSI等等。
策略也有一些小瑕疵,一是没有把股息和交易费用考虑进来,二是参数的选择(SMA=50,阈值设为10%)比较随意,没有优化过程。
虽然是一个最简单和基础的均值回归策略,但揭示了此类策略的最主要逻辑。其中的参数可以进一步优化,从而提升策略的表现。