【Python】均值回归策略回测(日内高频数据)

文章采用均值为SMA(close, time_period = 3日),利用(收盘价 - 三日均线)计算偏离程度。

如果大于阈值(首个收盘价的2%)则开仓买入(卖出)

如果收盘价穿过均线说明均值偏离情况消失平仓。

文章采用Tick高频数据、也可以切换日收盘价数据进行改写。

话不多说上代码:

导出必要包和数据

import pandas as pd
import numpy as np
import datetime
import talib as tl
import warnings
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Kline,Line, Bar, Grid,Scatterwarnings.filterwarnings("ignore")data = pd.read_csv('你的数据路径')

使用Ta-Lib库计算SMA均线(本文采用Tick数据,如果换成日数据请注意修改参数)  

查看一下偏离度与阈值的变化情况

data = x
data['month'] = data.index.map(lambda x: x.strftime('%Y.%m'))
data['time'] = data.index.map(lambda x: x.time())# 选取 阈值
threshold = data.close[0]*0.02
data['SMA'] = tl.SMA(data.close, len(data[(data.index.date==data.index.date[0])])*3)
data['distance'] = data['close'] - data['SMA']
data['threshold'] = thresholddf = data[['threshold', 'distance']].resample('1D').last().round(2)
df = df.dropna()
L_ = (Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width='900px', height='500px')).add_xaxis(df.index.tolist()).add_yaxis("距离",df['distance'].tolist()).add_yaxis("下轨",(df['threshold']*-1).tolist()).add_yaxis("上轨",df['threshold'].tolist()).set_global_opts(yaxis_opts=opts.AxisOpts(is_scale=True),xaxis_opts=opts.AxisOpts(is_scale=True),title_opts=opts.TitleOpts(title="收盘价到均值的距离&阈值情况"),datazoom_opts=[opts.DataZoomOpts(type_='inside')]))L_.render_notebook()

目测来看交易次数不多

遍历所有单元格查看买卖情况,文章使用tick级数据,预设实时计算均值、查看举止和收盘价之间的偏离度,一旦出现开仓信号则以买一(卖一)价格报单,在下一个3秒内成交。此处为了简化暂时没有考虑报单成交的情况,假设以下一个tick的收盘价成交。(如果使用日级别数据、可以将s_init, s 删除)

# 记录当前位置
position = 1# 记录当日可出售股票持仓
s_init = 5
# 记录整体股票持仓
s = s_init# 记录买单卖单
buy = []
sell = []
for i in range(0, len(data)-2):# 开仓判断# 偏离距离大于阈值,卖出if ((data['distance'][i] > threshold) & (data['distance'][i-1] < threshold) & (position==1) & (s_init>0)):sell.append([data.index[i+1], data['close'][i+1],200])position -= 1s_init -= 1s -= 1# 向下偏离且偏离距离大于阈值,买入elif ((data['distance'][i] < (-threshold)) & (data['distance'][i-1] > (-threshold))  & (position==1)):buy.append([data.index[i+1], data['close'][i+1],200])position += 1s += 1# 止盈平仓判断# 收盘价下穿均值,买入平仓elif ((position == 2) & (data['distance'][i]<= 0) & (data['distance'][i-1]>0) & (s_init>0)):sell.append([data.index[i+1], data['close'][i+1],200])position -= 1s_init -= 1s -= 1# 收盘价上穿均值,买入平仓elif ((position == 0) & (data['distance'][i]>= 0) & (data['distance'][i-1]<0)):buy.append([data.index[i+1], data['close'][i+1],200])position += 1s += 1if data.index[i].time() == datetime.time(15, 0):s_init = s# 最后收盘时平仓
if len(sell)< len(buy):sell.append([data.index[-1],data['close'][-1], 200])
elif len(sell)> len(buy):buy.append([data.index[-1],data['close'][-1], 200])

数据处理及盈亏计算

sell = pd.DataFrame(sell, columns = ['卖出时间', '卖出价格', '卖出数量'])
buy = pd.DataFrame(buy, columns = ['买入时间', '买入价格', '买入数量'])
sell.index = sell['卖出时间']
buy.index = buy['买入时间']
data = data.join(sell[['卖出价格','卖出数量']])
data = data.join(buy[['买入价格', '买入数量']])
data = data.round(2)
net_profit = (sell['卖出价格']*sell['卖出数量']*0.998).sum()-(buy['买入价格']*buy['买入数量']).sum()

画图查看部分买入卖出情况,确保策略代码正常

data_plot = data[(data.month == data.month.unique()[3])]L_ = (Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width='900px', height='500px')).add_xaxis(data_plot.index.tolist()).add_yaxis("收盘价",data_plot['close'].tolist()).add_yaxis("均线上轨",(data_plot['SMA']+data_plot.threshold).round(2).tolist()).add_yaxis("均线",data_plot['SMA'].tolist()).add_yaxis("均线下轨",(data_plot['SMA']-data_plot.threshold).round(2).tolist()).set_global_opts(yaxis_opts=opts.AxisOpts(is_scale=True),xaxis_opts=opts.AxisOpts(is_scale=True),title_opts=opts.TitleOpts(title="均线&收盘价情况"),datazoom_opts=[opts.DataZoomOpts(type_='inside')]))S_ = (Scatter().add_xaxis(data_plot.index.tolist()).add_yaxis("卖出",data_plot['卖出价格'].tolist()).add_yaxis("买入",data_plot['买入价格'].tolist()).set_global_opts(yaxis_opts=opts.AxisOpts(is_scale=True),xaxis_opts=opts.AxisOpts(is_scale=True),datazoom_opts=[opts.DataZoomOpts(type_='inside')]))
L_.overlap(S_)
L_.render_notebook()

抽取的部分数据看出:不考虑配对情况的话,大部分买点是在买点上方。

画图查看股价变动和净盈亏之间的波动关系

data = data.fillna(0)
data['敞口'] = (data['买入数量'].cumsum()-data['卖出数量'].cumsum())
data['实现盈利'] = (data['卖出数量']*data['卖出价格']).cumsum()*0.998-(data['买入数量']*data['买入价格']).cumsum()
data['净盈亏'] = (data['敞口'])*data['close']+(data['实现盈利'])
data['净盈亏'] = data['净盈亏'].round(2)df = data[['close','净盈亏']].resample('1D').last()
df = df.dropna()L_ = (Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width='900px', height='500px')).add_xaxis(df.index.tolist()).add_yaxis("收盘价",df['close'].tolist(),yaxis_index=1).add_yaxis("盈亏",df['净盈亏'].tolist()).extend_axis(yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}元")))  # 添加一条蓝色的y轴.set_global_opts(yaxis_opts=opts.AxisOpts(is_scale=True),xaxis_opts=opts.AxisOpts(is_scale=True),title_opts=opts.TitleOpts(title="均值回归交易策略--盈亏、股价变化情况)"),datazoom_opts=[opts.DataZoomOpts(type_='inside')]))L_.render_notebook()

均值回归策略在震荡市表现优异,单边行情时表现较差,文章选取标的震荡行情较多,获得正向盈利且跑赢单纯持有。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用EXCEL函数LINEST进行统计学中的回归分析

文章来源&#xff1a;实战统计学 作者&#xff1a;梁斌炜 本文介绍统计学中的一元和多元线性回归&#xff0c;并通过EXCEL自带的统计函数LINEST、INDEX进行手工计算&#xff0c;再通过EXCEL数据分析工具包进行自动计算。 由于很多复杂的EXCEL自动化程序&#xff0c;需要用到自动…

Linear Regression 线性回归

Linear Regression 线性回归 问题描述构建模型损失函数&#xff08;Loss Function&#xff09;梯度下降&#xff08;Gradient Descent&#xff09;Learning Rate的选择求取损失函数最小值正则项总结代码实现一次模型二次模型二次模型 Adamgrad五次模型五次模型 (With Regulariz…

回归分析beta值的标准_线性回归分析其中“β、 T 、F”分别是什么含义?

展开全部 β也就是beta&#xff0c;代表回归系数&#xff0c;标准化的回归系数代表自变量也就是预测变量和因变量的636f70793231313335323631343130323136353331333366306561相关&#xff0c;为什么要标准化&#xff0c;因为标准化的时候各个自变量以及因变量的单位才能统一&am…

多元统计分析 多元线性回归 python代码实现 简单线性回归

因变量Y(或Y1 , …,Yp )与x1 ,x2 ,…,xm的回归方程&#xff1a; 数据导入与清洗 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegressionpd_data…

线性回归数据分析

进入机器学习阶段后第一次接触线性回归&#xff0c;感觉线性回归其实就是通过有限的离散型数据&#xff0c;找到一条直线&#xff0c;使得尽可能多的离散点&#xff0c;分布在线附近的区域&#xff08;理想状态是所有的点都在线上&#xff0c;但是一般是无法满足的&#xff09;…

多元线性回归方差分析表理解

1.单因素一元方差分析的方法和案例&#xff1a; 例子&#xff1a; 案例的代码&#xff1a; X[533 580 525 600 570 650 500; %因数I [A,F]实验组CK标准 565 600 500 615 575 661 510; 525 575 510 590 565 643 513]; group{‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘CK’}; [p…

[转] R 逐步回归分析 AIC信息统计量

由于原作者写得太好了&#xff0c;所以直接转载的&#xff0c;不得不佩服 逐步回归分析是以AIC信息统计量为准则&#xff0c;通过选择最小的AIC信息统计量&#xff0c;来达到删除或增加变量的目的。 R语言中用于逐步回归分析的函数 step() drop1() add1() add1()函数…

数据分析02-线性回归

可分为线性回归分析和非线性回归分析。如果在回归分析中&#xff0c;只包括一个自变量和一个因变量&#xff0c;且二者的关系可用一条直线近似表示&#xff0c;这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量&#xff0c;且因变量和自变量之间是…

线性回归t检验

原理 数据 以下是部分数据展示&#xff0c;蒸发为因变量&#xff0c;其它为自变量&#xff0c;求自变量与因变量相关系数及t值。 年份蒸发湿度温度降雨1990848.3672.4914.60839.261991810.6673.4913.601348.761992914.2669.4914.00626.761993665.6674.4913.601212.061994848…

多元线性回归中的F-test和T-test

1 举个例子 模型输出的p值检验为F检验 模型输入的p值检验为T检验 原理: 后续补充 先上代码2: import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression

多元线性回归超详细详解(一步一步手推公式)

上一篇我们详细的讲解了一元一次线性回归算法&#xff0c;今天我们接着上一篇&#xff0c;为大家讲解多元线性回归是怎么一回事。 何为多元&#xff1f;当我们的输入x只有一维属性时&#xff0c;我们称之为一元。就像我们判断人胖瘦&#xff0c;只需了解体重这一个属性&#x…

线性回归模型详解(Linear Regression)

目录 线性与非线性 线性回归 多重共线性 常用的回归模型评估指标 算法优缺点 算法实现 回归分析的主要算法包括&#xff1a; 线性回归(Linear Regression)逻辑回归&#xff08;Logistic regressions&#xff09;多项式回归(Polynomial Regression)逐步回归(Step Regress…

数据线性回归分析

目录 一、利用WPS进行线性回归分析 二、利用jupyter编程&#xff08;不借助第三方库&#xff09; 对数据进行线性回归分析 1、将数据文件上传&#xff08;方便后续打开数据文件&#xff09; 2、添加代码 ​编辑 3 、输出200组数据 4、输出2000组数据 5、利用pandas打开ex…

用ggplot2进行直线回归并添加回归方程和方差分析表

library(ggplot2) #加载ggplot2包 library(dplyr) #加载dplyr包 library(ggpmisc) #加载ggpmisc包mpg %>% ggplot(aes(x displ, y hwy)) geom_point(aes(color drv)) #以drv为分组设置点的颜色geom_smooth(method lm, formula y ~ x) #绘制回归直线stat_poly_eq(aes…

多元线性回归分析(Stata)

目录 一、回归分析的介绍与分类 二、多元线性回归模型的条件 1. 线性理解与内生性问题研究 2. 异方差问题 3. 多重共线性问题 一、回归分析的介绍与分类 回归分析的任务是&#xff1a;通过研究自变量X和因变量Y的关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进而达…

一文轻松看懂线性回归分析的交互作用!

作者&#xff1a;丁点helper 来源&#xff1a;丁点帮你 前几天的文章&#xff0c;我们聚焦在回归分析&#xff0c;今天来看看在回归分析中常常要研究的一类难点问题——交互作用的探究。 交互&#xff08;interaction&#xff09;&#xff0c;字面上不太好理解&#xff0c;但…

多元线性回归模型及stata实现:总论

多元线性回归模型及stata实现&#xff1a;总论 一、模型 Yβ0β1X1β2X2⋯βnXne Y: Dependent variable&#xff08;因变量、应变量、反应变量、响应变量、被解释变量等&#xff09;X1、X2⋯Xn&#xff1a;Independent variable&#xff08;自变量、解释变量、控制变量&…

Linux 系统使用 git 提交代码-- git 的安装及使用(简明教学指南)

序 2023/02/09 晚 鉴于本篇文章收藏量比较多&#xff0c;那就给大家分享点在实际工作中使用频率最高的工作流命令吧。 场景如下(多人共同开发一个项目)&#xff1a;我叫小明&#xff0c;参与了一个名为 chatGPT 的项目&#xff0c;这个 AI 最近很火&#xff0c;就以此作为例…

慕课前端售1299元的面试题【第二阶段】汇总 day05

上一篇链接 如果有看不懂的&#xff0c;别硬看&#xff0c;直接chatgpt&#xff0c;让它回答。 - 我的博客需要缩宽页面观看&#xff0c;图片无法均放&#xff0c;很抱歉。 1. 请说明 Ajax Fetch Axios 三者的区别&#xff1f; 1. 用 XMLHttpRequest 实现 Ajax function aja…

Javaweb复习之HTTPTomcatServelet

1.Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 JavaWeb就是用Java技术来解决相关web互联网领域的技术栈 1.2 JavaWeb技术栈 B/S 架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器 架构模…