用Python做一个Mean Rerversion策略
为什么连胜会终止?
为什么明星基金终归于平凡?
几乎所有事物都逃不过均值回归。股价也一样,无论高于还是低于均值,都将大概率回归到均值。
这就是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策略相关推荐
- 绝对干货3000字,手把手带你用Python实现一个量化炒股策略,小白也能看得懂!...
我一直都知道我会变得富有. 我认为自己从来没对此产生过一丝怀疑. --巴菲特 "菜鸟学Python",第"520"篇原创 玩Python这么久了,菜鸟哥写 ...
- 用 Python 做一个 H5 游戏机器人
原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...
- 黑客很酷?手把手教你用Python做一个
前言 随着信息化时代的到来,人们对互联网接触越来越广泛,这样就使得很多人对于黑客充满向往,企图通过网络虚拟世界来做一些有趣的事情. 所以今天我们要说的工具就是:怎样利用Python做一个黑客软件. 众 ...
- 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码
1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...
- 在哪里能收到python实例代码-用python做一个搜索引擎(Pylucene)的实例代码
1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...
- python恶搞-python—做一个恶搞程序
python-做一个恶搞程序 very easy print("You can't win this game") #你不可能赢这个游戏 n = int(input("B ...
- 【Python】如何用python做一个简单的输入输出交互界面?
看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...
- python写520_用Python做一个520表白神器,值得收藏
本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用. 先来看一下具体的效果. 运行程序. 用Python做一个520表白神器,值得收藏 点击「 ...
- python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?
原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...
- python实战扫码下载_实例:用 Python 做一个扫码工具
原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...
最新文章
- python opencv 得到图片路径image_path的宽wide、高heigh和深度deep
- asp.net core 教程(七)-异常处理、静态文件
- stp:spanning tree protocol 生成树基本原理
- python中输入提示_Python-Tkinter Text输入内容在界面显示的实例
- CopyOnWriteArrayList源码解析
- Java JUC工具类--ForkJoin
- Transformer太深不行?NUS字节发现注意力坍缩,提出重注意机制!
- 手把手教你搭建开发环境之Java开发
- VS2010连接MySql数据库时无法选择mysql database数据源
- 亚马逊机器学习工程师面试怎么过?
- testng 组_TestNG组
- Server.ScriptTimeOut,Response.IsClientConnected
- 数据结构算法实践-Python——序章
- mysql药品管理_药品管理系统(药库管理)+数据库连接代码
- php kingeditor 相对路径,kindeditor上传图片生成绝对地址
- 苹果手机能写代码html,这些隐藏在苹果iPhone当中的内置代码你是否知道?
- JS设计模式 - 工厂模式
- Redis源码解读(二十一)——命令传播
- 软考高级 真题 2011年下半年 信息系统项目管理师 综合知识
- 计算机专业背景的大学,不要求专业背景的计算机专业!