用Python做一个Mean Rerversion策略

发布于:2022-12-25 ⋅ 阅读:(495) ⋅ 点赞:(0)

为什么连胜会终止?

为什么明星基金终归于平凡?

几乎所有事物都逃不过均值回归。股价也一样,无论高于还是低于均值,都将大概率回归到均值。

这就是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%)比较随意,没有优化过程。

虽然是一个最简单和基础的均值回归策略,但揭示了此类策略的最主要逻辑。其中的参数可以进一步优化,从而提升策略的表现。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到