为什么连胜会终止?

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

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

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

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

用Python做一个Mean Rerversion策略相关推荐

  1. 绝对干货3000字,手把手带你用Python实现一个量化炒股策略,小白也能看得懂!...

    我一直都知道我会变得富有. 我认为自己从来没对此产生过一丝怀疑.    --巴菲特 "菜鸟学Python",第"520"篇原创 玩Python这么久了,菜鸟哥写 ...

  2. 用 Python 做一个 H5 游戏机器人

    原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...

  3. 黑客很酷?手把手教你用Python做一个

    前言 随着信息化时代的到来,人们对互联网接触越来越广泛,这样就使得很多人对于黑客充满向往,企图通过网络虚拟世界来做一些有趣的事情. 所以今天我们要说的工具就是:怎样利用Python做一个黑客软件. 众 ...

  4. 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  5. 在哪里能收到python实例代码-用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  6. python恶搞-python—做一个恶搞程序

    python-做一个恶搞程序 very easy print("You can't win this game") #你不可能赢这个游戏 n = int(input("B ...

  7. 【Python】如何用python做一个简单的输入输出交互界面?

    看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...

  8. python写520_用Python做一个520表白神器,值得收藏

    本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用. 先来看一下具体的效果. 运行程序. 用Python做一个520表白神器,值得收藏 点击「 ...

  9. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  10. python实战扫码下载_实例:用 Python 做一个扫码工具

    原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...

最新文章

  1. python opencv 得到图片路径image_path的宽wide、高heigh和深度deep
  2. asp.net core 教程(七)-异常处理、静态文件
  3. stp:spanning tree protocol 生成树基本原理
  4. python中输入提示_Python-Tkinter Text输入内容在界面显示的实例
  5. CopyOnWriteArrayList源码解析
  6. Java JUC工具类--ForkJoin
  7. Transformer太深不行?NUS字节发现注意力坍缩,提出重注意机制!
  8. 手把手教你搭建开发环境之Java开发
  9. VS2010连接MySql数据库时无法选择mysql database数据源
  10. 亚马逊机器学习工程师面试怎么过?
  11. testng 组_TestNG组
  12. Server.ScriptTimeOut,Response.IsClientConnected
  13. 数据结构算法实践-Python——序章
  14. mysql药品管理_药品管理系统(药库管理)+数据库连接代码
  15. php kingeditor 相对路径,kindeditor上传图片生成绝对地址
  16. 苹果手机能写代码html,这些隐藏在苹果iPhone当中的内置代码你是否知道?
  17. JS设计模式 - 工厂模式
  18. Redis源码解读(二十一)——命令传播
  19. 软考高级 真题 2011年下半年 信息系统项目管理师 综合知识
  20. 计算机专业背景的大学,不要求专业背景的计算机专业!

热门文章

  1. Ubuntu16.04下xbrowser远程图形化桌面配置(简单几步完成~)
  2. mysql identity属性_Mysql中Identity 详细介绍
  3. 16s测序 | 如何轻松发表文章
  4. 超神学院暗质计算机,超神学院之拳皇
  5. 变分法证明两点之间线段最短
  6. idea无法下载源代码
  7. Android组件化开发实践和案例分享
  8. 闪付卡(QuickPass)隐私泄露原理(重要文章)
  9. “二清”是电商行业在支付清算领域中普遍存在的现实状况?
  10. MSP430F149的TIMERA定时中断理解