【Mquant】7:构建价差套利(三) ——空间误差校正模型

news2024/11/30 10:28:57

文章目录

  • 1. 上节回顾
  • 2. 纯碱价差套利
  • 3. 什么是协整性分析
  • 4. 通过协整性检验
  • 5. 空间误差校正模型(VECM)
  • 6. 构建交易策略
  • 7 总结


1. 上节回顾

【Mquant】6:构建价差套利(二)上节带领大家编写了统计套利均值回归的程序,通过历史回测发现还不能进入实盘交易状态,原因出现在手续费率上,由于加密市场手续费率较高,我们选择国内期货市场,一般期货市场手续费率可以达到万分之一,个别品种手续费率可以达到万分之0.1。这节内容,我们围绕期货产品中的纯碱来做统计套利。纯碱一手交易所收取3.5元手续费,期货公司在这个基础上收取+1分的开户手续费也就是一手3.51元。

2. 纯碱价差套利

纯碱价差套利是一种商品套利策略,涉及到纯碱市场中不同地区或不同时间点的价格差异。纯碱是一种广泛用于工业和化工生产的碱性物质,其价格受到供需关系、运输成本、市场地区等因素的影响。

纯碱价差套利的基本原理是在不同市场或时间点购买低价的纯碱,然后在高价的市场或时间点出售,从价格差异中获得利润。这种套利策略依赖于市场价格的波动以及供需不平衡的情况,因此需要及时准确地识别价格差异和执行交易。建议在实施任何套利策略之前,咨询专业人士或金融顾问,以获得适当的建议和指导。

郑商所仓单交割相关规定:
http://www.czce.com.cn/cn/flfg/zcjywgz/pzxz/webinfo/2023/05/1685047755429516.htm

【Mquant】5:构建价差套利(一) 中:我们描述了价差走势曲线,从图中可以很清晰的看出在某一段时间内,两个合约价差比较平稳,如2023年10月1日到10月10日,在2023年10月22日后,价差走了一波上涨趋势,对于这种非平稳的时间序列,我们就很难去做价差均值回归策略。于是在【Mquant】6:构建价差套利(二)中我们通过价格波动率指标去选择交易品种,并且构建了一个布林带交易策略,但是受到手续费和价差的影响,实际策略并不能赚钱。这节内容我们深入探讨“平稳性”这个概念,带领读者通过协整性分析,找到一组资产的价格在长期内存在稳定的线性关系,来优化交易策略。
在这里插入图片描述

3. 什么是协整性分析

用学术的话讲:协整性分析是一种用于检验非平稳时间序列之间是否存在稳定关系的方法。它可以帮助我们确定变量之间的长期均衡关系,以及是否存在伪回归的情况。

通俗来说:还是以上面比特币的价差图来看,我们期望的价差是时间区域1,整体走势非常平稳,没什么太大振幅,并且不希望出现这种异常数据点,像时间区域2这种上升趋势很明显走势没有一点回归的就被认为是非平稳序列。那有没有一种方式可以将这个走势通过一个数学模型来拟合成类似时间区域1的走势图呢?答案是:可能有!这就需要用到协整性分析了,如果通过这个分析,我们就可以建立VECM(向量误差修正模型)来拟合数据了。
在这里插入图片描述

协整性分析可以帮助我们理解变量之间的因果关系,以及它们之间的长期均衡关系。通过协整性分析,我们可以避免在非平稳序列上进行回归分析时出现伪回归的情况。常用的协整性分析方法包括Engle-Granger方法和Johansen方法。Engle-Granger方法是一种两步法,首先通过单位根检验确定变量是否是非平稳的,然后通过回归分析检验残差是否是平稳的。Johansen方法是一种多步法,它可以同时检验多个变量之间的协整关系。本文就不给大家罗列具体的数学公式了,这些公式在网上也可以查的到,直接给大家上代码。

4. 通过协整性检验

进行协整性测试通常需要以下步骤:

  1. 选择需要进行协整性测试的两个时间序列。
  2. 对两个时间序列进行单位根检验(Unit Root Test),以确定它们是否平稳。常用的单位根检验方法包括ADF检验(Augmented Dickey-Fuller Test)和KPSS检验(Kwiatkowski-Phillips-Schmidt-Shin Test)等。
  3. 如果两个时间序列都不是平稳的,则需要对它们进行差分,直到差分后的序列成为平稳序列。
  4. 对差分后的序列进行协整性检验。常用的协整性检验方法包括Johansen协整性检验(Johansen Cointegration Test)和Engle-Granger协整性检验(Engle-Granger Cointegration Test)等。
  5. 如果两个时间序列之间存在协整性,则可以使用空间误差校正模型(ECM)对其进行建模和分析。
    下面,我们将使用Python的Pandas中的协整性测试方法来进行示范。
import pandas as pd
from statsmodels.tsa.stattools import adfuller, kpss

# 准备数据
data = pd.read_csv('data.csv')  # 从CSV文件中读取数据,确保包含所有相关时间序列
data = data.iloc[:1000,:]	# 选择前1000个数据做拟合适用后续200个数据

result_A_adf = adfuller(data['SA401'])
result_B_adf = adfuller(data['SA405'])
result_A_kpss = kpss(data['SA401'])
result_B_kpss = kpss(data['SA405'])

print('ADF Test - Stock A: p-value =', result_A_adf[1])
print('ADF Test - Stock B: p-value =', result_B_adf[1])
print('KPSS Test - Stock A: p-value =', result_A_kpss[1])
print('KPSS Test - Stock B: p-value =', result_B_kpss[1])

在这里插入图片描述
如果p-value小于0.05,则可以拒绝原假设,即SA401、SA405是平稳的。如果p-value大于等于0.05,则不能拒绝原假设,即SA401、SA405可能是非平稳的。

我们可以看到输出结果中的p-value均小于0.05,因此我们可以认定SA401、SA405均为非平稳序列:

为了使SA401、SA405成为平稳序列,我们需要对它们进行差分。我们可以使用Pandas的diff函数对其进行一阶差分:

df = data[["SA401","SA405"]]
df_diff = df.diff().dropna()

result_diff_A_adf = adfuller(df_diff['SA401'])
result_diff_B_adf = adfuller(df_diff['SA405'])
result_diff_A_kpss = kpss(df_diff['SA401'])
result_diff_B_kpss = kpss(df_diff['SA405'])

print('ADF Test (Diff) - Stock A: p-value =', result_diff_A_adf[1])
print('ADF Test (Diff) - Stock B: p-value =', result_diff_B_adf[1])
print('KPSS Test (Diff) - Stock A: p-value =', result_diff_A_kpss[1])
print('KPSS Test (Diff) - Stock B: p-value =', result_diff_B_kpss[1])

在这里插入图片描述
我们可以看到输出结果中的p-value均小于0.05,因此我们可以认定差分后的SA401、SA405均为平稳序列:

from statsmodels.tsa.stattools import coint

result_coint = coint(df_diff['SA401'], df_diff['SA405'])
print('Cointegration Test - p-value =', result_coint[1])

我们可以得到协整性检验的输出结果如下:

Cointegration Test - p-value = 0.0

由于p-value小于0.05,因此我们可以认为SA401、SA405之间存在协整性。

5. 空间误差校正模型(VECM)

空间误差校正模型(Spatial Error Correction Model, SECM)是一种同时考虑时间和空间依赖性的模型,用于分析具有空间相关性的时间序列数据。SECM可以用来研究时间序列变量之间的协整关系,并纠正由于空间相关性引起的模型偏误。

SECM的基本形式如下:

y_t = α + βx_t + λu_t + ε_t

其中,y_t是因变量的时间序列,x_t是自变量的时间序列,u_t是协整关系的误差项,ε_t是空间相关误差项。α、β和λ是模型的参数。

from statsmodels.tsa.vector_ar.vecm import VECM

# 拟合空间误差校正模型
model = VECM(df_diff, k_ar_diff=1, coint_rank=1)
model_fit = model.fit()

# 获取模型的参数
alpha = model_fit.alpha
beta = model_fit.beta

# 获取误差修正向量(ECV)
ecv = model_fit.resid

# 打印模型参数和误差修正向量
print('Alpha (α):')
print(alpha)
print('Beta (β):')
print(beta)
print('Error Correction Vector (ECV):')
print(ecv)
errors = []
# 根据模型参数和误差修正向量确定交易信号
for i in range(len(df_diff[2:])):
    error = df_diff.iloc[i,0] - alpha[0] - beta[0] * df_diff.iloc[i,0] - beta[1] * df_diff.iloc[i,1] - ecv[i]
    error = error[0]-error[1]
    errors.append(error)
    
import matplotlib.pyplot as plt
plt.plot([i for i in range(len(errors))],errors)

在这里插入图片描述

6. 构建交易策略

统计套利的交易策略一般包括三个信号:当价差偏离均值达到一定标准差幅度时,建仓交易;当其偏离回复到一定程度时平仓获利了结;同时为了防止配对股票原长期均衡关系实际已经破坏的事实,价差将不会回复到均值区间,因此需要进行风险控制,即当偏离超过一定标准差幅度时,止损离场。

对于交易触发信号的确立,有不同的方法。“常用的交易策略如下:当 mspread 的绝对值大于 b 倍标准差时,建仓交易;当 mspread 的绝对值缩小到 a 倍标准差时平仓;当 mspread 的绝对值扩大到 c 倍标准差时强制平仓离场。这里,a<b<c,a,b,c 常用的固定组合值有(0,1,2),(0,0.75,2)和(1,2,3)等。”除此之外,还有比较激进的交易策略,比如海龟交易策略,到了止损位置,不仅不止损还继续加仓。

# 计算目标仓位
target = 0
target_data = []

for ix, spread in enumerate(errors):
    # 没有仓位
    if not target:
        if spread >= np.std(errors)*1:
            target = -1
        elif spread <= -np.std(errors)*1:
            target = 1
    # 多头仓位
    elif target > 0:
        if spread <= np.mean(errors):
            target = 0
    # 空头仓位
    else:
        if spread >= np.mean(errors):
            target = 0
    # 记录目标仓位
    target_data.append(target)
df = pd.DataFrame()
df["spread"] = errors
df["target"] = target_data
# 计算仓位
df["pos"] = df["target"].shift(1)
# 未扣除手续费和滑点
# 计算盈亏
df["change"] = df["spread"].diff()
df["pnl"] = df["change"] * df["pos"]
df["balance"] = df["pnl"].cumsum()
df["balance"].plot()

在这里插入图片描述

7 总结

对于金融时间序列,往往会出现明显的集群现象。因此这类数据利用时变标准差确定交易时机更合理,它可以更好的挖掘价差序列自回归残差的特性,从而使得统计套利的触发信号更加精准。所以统计套利经常选用GARCH 模型进行具体的统计套利策略研究。具体交易策略可以选择,在价差(Spread)较小(由 GARCH 模型提供合理价差)的情况建仓,在价差(Spread)较大的情况下(由
GARCH 模型提供合理价差) 强制平仓止损,在价差(Spread)回归 0 的时候平仓套利。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区&#xff0c;数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色&#xff0c;D分区无法识别&#xff0c;E分区可识别&#xff0c;但是拷贝文件报…

如何通过 wireshark 捕获 C# 上传的图片

一&#xff1a;背景 1. 讲故事 这些天计划好好研究下tcp/ip&#xff0c;以及socket套接字&#xff0c;毕竟工控中设计到各种交互协议&#xff0c;如果只是模模糊糊的了解&#xff0c;对分析此类dump还是非常不利的&#xff0c;而研究协议最好的入手点就是用抓包工具 wireshar…

从哪里下载 Oracle database 11g 软件

登入My Oracle Support&#xff0c;选择Patches & Updates 标签页&#xff0c;点击下方的Latest Patchsets链接&#xff1a; 然后单击Oracle Database&#xff0c;就可以下载11g软件了&#xff1a; 安装单实例数据库需要1和2两个zip文件&#xff0c;安装GI需要第3个zip文…

01.智慧商城——项目介绍与初始化

智慧商城 - 授课大纲 接口文档&#xff1a;https://apifox.com/apidoc/shared-12ab6b18-adc2-444c-ad11-0e60f5693f66/doc-2221080 演示地址&#xff1a;http://cba.itlike.com/public/mweb/#/ 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示移动端面…

关于smartforms 文本乱码问题

运行程序 RSCPSETEDITOR 取消默认的MS word 编辑器后&#xff0c;如出现合同文本、PO文本以及S010文本中文乱码问题的话&#xff0c;需要恢复MS word 编辑器 &#xff0c;使用MS word 维护长文本即可 MS word 使用&#xff0c;弹出MS word 文本编辑器框&#xff0c;贴入需要输…

linux版:TensorRT安装教程

首先安装cuda和cudnn 查看安装的cuda版本 nvidia-smi查看cuda电脑的版本&#xff0c;我的是11.8版本的 nvcc -V查看cudnn版本&#xff0c;在cuda/cuda118/include路径下 cat cudnn_version.h | grep CUDNN_MAJOR -A 2下载TensorRT8.5 GA 下载地址&#xff1a;https://deve…

【部署篇】Docker配置MySQL容器+远程连接

一、前言 上篇文章在部署nestjs时&#xff0c;由于docker访问不了主机的localhost&#xff0c;所以无法连接主机数据库。所以我们只能在docker中额外配置一个数据库&#xff0c;映射到主机上&#xff0c;然后可以通过ip地址访问。 在本篇文章我们会在docker中创建一个mysql&a…

SQLSERVER 遍历循环的两种方式很详细有源码(2)

2.游标循环 Create table WS_Student ( [Id] int primary key not null, [My_Cocode] [int], [My_SCocode] [int], [userId] [bigint], [SetCName] [varchar](50) NULL, [SetEName] [varchar](50) NULL, [SetPcode] [varchar](50) NULL, [Se…

Windows10电脑没有微软商店的解决方法

在Windows10电脑中用户可以打开微软商店&#xff0c;下载自己需要的应用程序。但是&#xff0c;有用户反映自己Windows10电脑上没有微软商店&#xff0c;但是不清楚具体的解决方法&#xff0c;接下来小编给大家详细介绍关于解决Windows10电脑内微软商店不见了的方法&#xff0c…

SimaPro生命周期评估建模与碳足迹分析流程

SimaPro以系统和透明的方式轻松建模和分析复杂的生命周期&#xff0c;通过确定供应链中每个环节的热点&#xff0c;从原材料的提取到制造&#xff0c;分销&#xff0c;使用和处置&#xff0c;衡量所有生命周期阶段的产品和服务对环境的影响。SimaPro是过去25年评估生命周期的最…

2024长三角智能科技产业博览会(简称:世亚智博会)

2024长三角智能科技产业博览会&#xff08;简称:世亚智博会&#xff09;将于2024年3月份在上海跨国采购会展中心盛大开幕&#xff0c;主题为“数字新时代链接新未来”。展会将紧密围绕“一展、一会、一评选及相关活动”的内容形式&#xff0c;全面展示智能科技产业的最新成果和…

C++函数重载及引用

应知学问难&#xff0c;在于点滴勤 C和C语言函数之间最大的的不同是C支持缺省参数&#xff0c;而C语言不支持&#xff0c;这里我使用的编译器为VS2022&#xff0c;创建项目时是依据文件后缀判断该文件为C文件还是C。&#xff08;编译环境VS2022&#xff09; 文章目录 缺省参数…

【 云原生 | K8S 】kubeadm 部署Kubernetes集群

目录 1 环境准备 2 所有节点安装docker 3 所有节点安装kubeadm&#xff0c;kubelet和kubectl 4 部署K8S集群 4.1 查看初始化需要的镜像 4.2 初始化kubeadm 4.3 设定kubectl 4.4 所有节点部署网络插件flannel master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&am…

Stable Diffusion1.5网络结构-超详细原创

目录 1 Unet 1.1整体结构 2 VAE 3 CLIP 绘制软件&#xff1a;ProcessOn&#xff0c;以下图片保存可高清查看 1 Unet 1.1详细整体结构 1.2 缩小版整体结构 1.3 CrossAttnDownBlock2D 2 VAE 3 CLIP

elasticsearch+canal增量、全量同步

目录 一、搭建环境&#xff1a; 1.1 下载软件上传到linux目录/data/soft下 1.2 把所有软件解压到/data/es-cluster 二、单节点&#xff08;多节点同理&#xff09;集群部署elasticsearch 2.1 创建es用户 2.2 准备节点通讯证书 2.3 配置elasticsearch&#xff0c;编辑/d…

[模版总结] - 树的基本算法3 - 结构转化

二叉树结构转化 通常将二叉树根据某些要求进行结构重构&#xff0c;比如线性结构转化(链表&#xff0c;数组)&#xff0c;序列化等。 常见题型 注&#xff1a;这类题目最基本的解题思路是利用递归分治 (也可以使用迭代方法)&#xff0c;在构建树结构的时候&#xff0c;我们通…

餐厅订座预约小程序的效果如何

市场中无论哪种城市&#xff0c;餐厅非常多&#xff0c;一条不长的商业街&#xff0c;汇聚着数家餐饮品牌&#xff0c;且相互间竞争激烈&#xff0c;并且各个商家都希望用成本低高效率的方法引流及转化。 随着互联网深入各个行业&#xff0c;传统餐饮行业经营痛点不少。 传统餐…

c#正则表达式

using System.Text.RegularExpressions; namespace demo1 {/// <summary>/// 正则表达式&#xff08;Regular Expression&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a&#xff5e;z的字母&#xff09;和特殊字符&#xff08;称为“…

【ArcGIS处理】行政区划与流域区划间转化

【ArcGIS处理】行政区划与流域区划间转化 引言数据准备1、行政区划数据2、流域区划数据 ArcGIS详细处理步骤Step1&#xff1a;统计行政区划下子流域面积1、创建批量处理模型2、添加批量裁剪处理3、添加计算面积 Step2&#xff1a;根据子流域面积占比均化得到各行政区固定值 参考…

Nginx反向代理与负载均衡与504错误

Nginx反向代理与负载均衡概念简介 关于代理 什么是代理 类似中介 在没有代理模式的情况下&#xff0c;客户端和Nginx服务端&#xff0c;都是客户端直接请求服务端&#xff0c;服务端直接响应客户端。 那么在互联网请求里面&#xff0c;客户端往往无法直接向服务端发起请求…