量化投资实战(三)之配对交易策略--协整模型法

点赞、关注,养成良好习惯
Life is short, U need Python
量化投资实战系列,不断更新中


1. 初识配对交易策略

配对交易(Pairing Trading)是指八十年代中期华尔街著名投行Morgan Stanley的数量交易员Nunzio Tartaglia成立的一个数量分析团队提出的一种市场中性投资策略,其成员主要是物理学家、数学家、以及计算机学家。

Ganapathy Vidyamurthy[1]在《Pairs Trading: Quantitative Methods and Analysis》一书中定义配对交易为两种类型:一是基于统计套利的配对交易,二是基于风险套利(并购套利)的配对交易。

基于风险套利的配对交易策略是一种相当复杂的交易策略,它包括两种基本类型:债务重组和收购兼并。在换股并购中,风险套利者通常做多被收购公司的股票,同时做空收购公司的股票;在现金并购中,风险套利者寻求收购价格与目标公司价格之间的差异。

基于统计套利的配对交易策略是一种市场中性策略,具体的说,是指从市场上找出历史股价走势相近的股票进行配对,当配对的股票价格差偏离历史均值时,则做空股价较高的股票同时买进股价较低的股票,等待他们回归到长期均衡关系,由此赚取两股票价格收敛的报酬。

2. 配对交易的思想

配对交易 的思想最早起源于20世纪20年代,华尔街交易员 Jesse Lauriston Livermore 在投资实战中采用的姐妹对(Sister Stocks)交易策略。他发现两只同行业内业务相似的股票,其价格波动趋势有某种规律,即两者的价差会构成一种均衡关系。若在两只股票价格偏离较大时建仓,价差回复时平仓,便会赚取价差由发散至收敛带来的收益。

随着数理金融学和计算机技术的不断发展,到了20世纪80年代,配对交易策略在华尔街得到巨大关注。1985年,华尔街投资银行摩根士丹利(Morgan Stanley)的天体物理学家 努齐奥·塔塔里亚(Nunzio Tartaglia)组建了一个由著名物理学家、计算机学家和数学家构成的数量化分析团队,该团队以数学模型计算股票买卖组合,并开发计算机自动交易程序,在当时华尔街投资实战中大获成功。该程序运用的买卖组合策略即是配对交易策略,与传统的主观技术分析不同,摩根士丹利的交易程序对于股票对的选择、交易参数的设定与交易规则的制定,都采取量化分析的手段并由计算机程序自动完成,自此以后,这种量化投资策略逐渐广为人知并流传开来。时至今日,配对交易己经衍生出众多模型和交易规则,并为各种避险基金和股票投资者使用。

有关配对交易的学术研究也不胜枚举。Gatev,Goetzmann 和Rouwenhorst[2](1999)采用最小距离法寻找历史价格最近的20组股票对,计算其标准化股票价格差序列,进场交易策略是标准价差超过2倍标准差,运用买低卖高的策略,年化收益率可达11%以上;Vidyamurthy[1](2004)把协整理论运用到配对交易的股票对选择中,并将平稳性作为配对好坏的判别准侧,从股票基本面或历史资料挑选出潜在具有协整关系之配对股票;崔方达和吴亮[3](2011)以上证50指数成分股为样本,运用最小距离法进行配对交易,最终得出配对交易与市场风险无关并可获利。

3. 配对交易的步骤

配对交易策略 的时期分为 形成期(Formation Period)和 交易期(Trading Period)。在形成期挑选历史走势存在规律的股票对,并制定交易策略;在交易期模拟开仓平仓交易,而后计算收益。在整个配对交易策略过程中,具体需要考虑如下问题:

(1)如何挑选进行配对的股票?

(2)挑选好股票对以后,如何制定交易策略?开仓点如何设置?

(3)开仓时,两只股票如何进行多空仓配比?

3.1 协整模型法

协整方法(Cointegration method)是由 Granger(1987)提出的,已成为了分析非平稳经济变量之间数量关系的最主要工具之一。
金融资产的 对数价格 一般可以视为 一阶单整序列

P t X P_t^X PtX 表示 X X X 股票在第 t t t 日的价格,如果 X X X 股票的对数价格 { l o g ( P t X ) } ( t = 1 , 2 , ⋯   , T ) \{log(P_t^X)\}(t=1,2,\cdots,T) {log(PtX)}(t=1,2,,T) 是非平稳时间序列,且
{ l o g ( P t X ) − l o g ( P t − 1 X ) } ( t = 1 , 2 , ⋯   , T ) \{log(P_t^X) - log(P_{t-1}^X)\}(t=1,2,\cdots,T) {log(PtX)log(Pt1X)}(t=1,2,,T)
是平稳的,则称 X X X 股票的对数价格 { l o g ( P t X ) } ( t = 1 , 2 , ⋯   , T ) \{log(P_t^X)\}(t=1,2,\cdots,T) {log(PtX)}(t=1,2,,T)一阶单整序列

股票 X X X 的对数价格的差分序列可表达如下:
log ⁡ ( P t X ) − log ⁡ ( P t − 1 X ) = log ⁡ ( P t X P t − 1 X ) = log ⁡ ( 1 + r t X ) ≈ r t X \log \left(\boldsymbol{P}_{t}^{X}\right)-\log \left(\boldsymbol{P}_{t-1}^{X}\right)=\log \left(\frac{\boldsymbol{P}_{t}^{X}}{\boldsymbol{P}_{t-1}^{X}}\right)=\log \left(1+\boldsymbol{r}_{t}^{X}\right) \approx \boldsymbol{r}_{t}^{X} log(PtX)log(Pt1X)=log(Pt1XPtX)=log(1+rtX)rtX
X X X 股票的简单单期收益率序列 { r t X } \{r_t^X\} {rtX} 是平稳的。

3.2 配对交易策略的制定(协整模型法)

判断两只股票的历史价格是否具有协整关系?即检验两只股票的对数价格序列是否是一阶单整序列,或者检验两只股票的收益率序列是否是平稳时间序列。
首先,以 中国银行浦发银行 的对数价格序列为例进行 一阶单整检验。其中,arch 包的 ADF() 函数可以通过单位根方法对序列的平稳性进行检验。

ADF 单位根检验的原假设是“序列存在单位根”

  • 如果接受原假设(即 P_value 值大于显著水平系数),则被检验的序列存在单位根,即序列是 非平稳的
  • 如果拒绝原假设(即 P_value 值小于显著水平系数),则被检验的序列不存在单位根,即序列是 平稳的

接着,以中国银行和浦发银行的对数价格序列为例进行 协整检验

假设 { l o g ( P t X ) } , t = 1 , 2 , … , T \{log(P_t^X)\},t=1,2,\dots,T {log(PtX)},t=1,2,,T { l o g ( P t Y ) } , t = 1 , 2 , … , T \{log(P_t^Y)\},t=1,2,\dots,T {log(PtY)},t=1,2,,T 分别表示 X X X 股票和 Y Y Y 股票的对数价格序列,则 Engle 和 Granger 两步法可以对时间序列和协整关系进行检验。

{ l o g ( P t X ) } \{log(P_t^X)\} {log(PtX)} { l o g ( P t Y ) } \{log(P_t^Y)\} {log(PtY)}都是一阶单整的前提下,用最小二乘法构造回归方程:
l o g ( P t Y ) = α + β l o g ( P t X ) + ϵ t log(P_t^Y) = \alpha + \beta log(P_t^X) + \epsilon_t log(PtY)=α+βlog(PtX)+ϵt
得到回归系数 α ^ \hat{\alpha} α^ β ^ \hat{\beta} β^,构造残差估计值:
ϵ ^ t = l o g ( P t Y ) − ( α ^ + β ^ l o g ( P t X ) ) \hat{\epsilon}_t = log(P_t^Y) - (\hat{\alpha} +\hat{\beta} log(P_t^X)) ϵ^t=log(PtY)(α^+β^log(PtX))
并检验 { ϵ t ^ } \{\hat{\epsilon_t}\} {ϵt^} 序列的平稳性。如果 { ϵ t ^ } \{\hat{\epsilon_t}\} {ϵt^} 序列是平稳的,则说明 { l o g ( P t X ) } \{log(P_t^X)\} {log(PtX)} { l o g ( P t Y ) } \{log(P_t^Y)\} {log(PtY)} 具有协整关系。

最后,运用 协整理论协整模型 挑选出满足 价格序列 具有 协整关系股票对 进行配对交易。

4. 协整模型法之Python实战

4.1 读取数据

# 安装arch包(当然也可以在prompt下安装)
!pip install arch
# 导入包
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']        # 字体设置
plt.rcParams['axes.unicode_minus']=False           # 负号显示问题

from arch.unitroot import ADF                     # 协整关系检验
import statsmodels.api as sm
# 读取数据
sh = pd.read_csv('sh50.csv',index_col='Trddt')
sh.index = pd.to_datetime(sh.index)
sh.head()

在这里插入图片描述

4.2 协整检验

  • 形成期
# 提取数据
P_zhonghang = sh['601988']   # 中国银行
P_pufa = sh['600000']       # 浦发银行

# 设置形成期
formStart = '2014-01-01'
formEnd = '2015-01-01'

P_zhonghang_f = P_zhonghang[formStart:formEnd]
P_pufa_f = P_pufa[formStart:formEnd]
# 形成期:协整关系检验
# 中国银行(A)一阶单整检验
log_P_zhonghang_f = np.log(P_zhonghang_f)
adf_zhonghang = ADF(log_P_zhonghang_f)
print(adf_zhonghang.summary().as_text())

在这里插入图片描述

结论:原序列没有通过协整检验!(下一步,差分)

# 形成期:差分后的协整检验
adf_zhonghang_diff = ADF(log_P_zhonghang_f.diff()[1:])
print(adf_zhonghang_diff.summary().as_text())

在这里插入图片描述

结论:差分序列通过协整检验!

# 形成期:对数序列可视化
log_P_zhonghang_f.plot()
plt.title('图1 中国银行对数收益率序列趋势(形成期)')
plt.show()

在这里插入图片描述

# 形成期:差分对数序列可视化
log_P_zhonghang_f.diff()[1:].plot()
plt.title('图2 中国银行差分对数收益率序列趋势(形成期)')
plt.show()

在这里插入图片描述

# 同理对浦发银行进行协整检验,详细代码见资源包!

4.3 模型搭建

  • 形成期:股票对的回归方程(协整模型)
代码详见资源包!
  • 形成期:残差单位根检验(残差序列为价格差序列)
代码详见资源包!
  • 构造Pair Trading类(封装协整检验)
代码详见资源包!
# 绘制价差序列图(形成期)
plt.figure(figsize=(10,6))
CoSpreadForm.plot()
plt.title('图5 价差序列(协整配对)(形成期)',loc='center', fontsize=16)
plt.axhline(y=mu,color='black')
plt.axhline(y=mu+0.2*sd,color='blue',ls='-',lw=2)
plt.axhline(y=mu-0.2*sd,color='blue',ls='-',lw=2)
plt.axhline(y=mu+1.5*sd,color='green',ls='--',lw=2.5)
plt.axhline(y=mu-1.5*sd,color='green',ls='--',lw=2.5)
plt.axhline(y=mu+2.5*sd,color='red',ls='-.',lw=3) 
plt.axhline(y=mu-2.5*sd,color='red',ls='-.',lw=3) 
plt.show()

在这里插入图片描述

4.4 模型回测

  • 交易期:回测检验
代码详见资源包!

在这里插入图片描述

代码详见资源包!

在这里插入图片描述

4.5 策略封装

代码详见资源包!

5. 结论

  • 观察交易仓位曲线图,可以看出自2015年1月1日到2015年6月底期间,配对交易信号触发不多(计4次)。

  • 观察现金曲线图,由于开仓可能需要现金,现金曲线有升有降,而第三次平仓之后获利很多,现金曲线大幅上涨,到6月底,现金部位达到了5992.514元。

  • 再观察资产曲线图,配对资产整体呈现上升趋势,资产由2000元转变成5992.514元。

  • 整体而言,对中国银行和浦发银行两只股票进行配对交易的策略绩效表现不错。

6. 参考资料

  • 蔡立耑. 量化投资以Python为工具[M]. 北京:电子工业出版社,2017.
  • PyQuant. 量化投资基础[M]. 北京:科学出版社,2024.

7. 资源包下载

  • 链接:https://pan.baidu.com/s/1-tHqJCTOQx7wMLe509YpfQ
  • 提取码:1234

  • 写作不易,切勿白剽
  • 点赞关注,最大鼓励
  • 持续更新,未完待续…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MQ】消息队列概述

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 定义 消息队列:一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件,很多初学者认为,MQ通过消息的发送…

C++:string的介绍

C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留…

RocketMQ如何保证消息的顺序性?

和Kafka只支持同一个Partition 内的消息的顺序性一样,RocketMQ中的也提供了基于队列(分区)的顺序消费。即同一个队列内的消息可以做到有序,但是不同队列内的消息是无序的! 当我们作为MQ生产者需要发送顺序消息时,需要在send方法中,传入一个MessageQueueSelector。 Mes…

Media-Download-Helper 完整部署说明

Media-Download-Helper 完整部署说明 前排提示:由于使用到了 Telegram、Google 等服务,所以当前方案不建议国内用户使用! 基于 docker 安装 qbittorrent WebUI 使用 docker 安装 qbittorrent 非常简单,教程也非常非常多&#xff…

安卓7原生相机切到视频崩溃

目录 1、查看日志 2、分析日志、提取重点 3、寻找解决方法 author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye_嵌入式,Linux,Qt-CSDN博客daisy.skye擅长嵌入式,Linux,Qt,等方面的知识https://blog.csdn.net/qq_40715266?typeblog 1、查看日志 由于安…

格行随身WiFiVS华为天际通VS飞猫U8真实测评大PK,随身WiFi哪个牌子最好用?随身WiFi怎么选?

如今随身WiFi界格行、华为、飞猫三足鼎立,被称为随身WiFi界的“三国杀”,今天,我这个江湖百晓生就来给大家揭秘,究竟谁才是随身网络之王?你准备好围观了吗? 先说说华为天际通随身WiFi,这位老大哥…

今日arXiv最热大模型论文:北大发布,通过上下文提示,让大模型学习一门新的语言

在人工智能领域,大语言模型(LLMs)的发展已经取得了显著的进步,它们在处理高资源语言方面表现出色。然而,对于资源较少的语言,尤其是极低资源语言,这些模型的支持却显得力不从心。这些语言往往缺…

【C++庖丁解牛】C++内存管理 | new和delete的使用以及使用原理

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1. C/C内存分布2. C语…

方法中单独使用return关键字

一、return关键字的单独使用 二、示例代码 public class ReturnDemo {public static void main(String[] args) {chu(10,0);chu(10,2);}public static void chu(int a,int b){if (b 0) {System.out.println("除法出错,除数不能为零");return;}System.ou…

无处不在的便捷:D咖无人售卖咖啡机在公共场所的应用探索

在繁忙的现代生活中,无人售卖咖啡机作为一项便捷的服务,正逐渐在公共场所得到广泛应用。本文将探讨D咖无人售卖咖啡机在公共场所的应用场景和优势。 一、无人售卖咖啡机的应用场景 写字楼:写字楼内工作人员需要在繁忙的工作中寻找便捷的饮品解…

【center-loss 中心损失函数】 参数与应用

文章目录 前言简单总结一下参数对比解释参数权重衰减(L2正则化)动量其他参数运行 前言 之前我们已经完全弄明白了中心损失函数里的代码是什么意思,并且怎么用的了,现在我们来运行它。 论文:https://ydwen.github.io/…

【数学+前缀和】第十四届蓝桥杯省赛C++ A组《平方差》(c++)

【问题描述】 给定 L,R,问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 xy的平方−z的平方。 【输入格式】 输入一行包含两个整数 L,R,用一个空格分隔。 【输出格式】 输出一行包含一个整数满足题目给定条件的 x 的数量。 【数据范围】 对于 40% 的…

创建RAID0,RAID5并管理,热备盘,模拟故障

目录 1. RAID介绍以及mdadm安装 1.1 安装mdadm工具 2. 创建raid0 2.1 环境准备 2.2 使用两个磁盘创建RAID0 2.3 查看RAID0信息 2.4 对创建的RAID0进行格式化并挂载 2.5 设置成开机挂载 2.6 删除RAID0 3. 创建raid5 3.1 环境准备 3.2 用3个磁盘来模拟R…

【C++杂货铺】详解string

目录 🌈前言🌈 📁 为什么学习string 📁 认识string(了解) 📁 string的常用接口 📂 构造函数 📂 string类对象的容量操作 📂 string类对象的访问以及遍历操…

(MATLAB)应用实例13-时域信号的频谱分析

采用傅里叶变换来计算存在噪声的适于信号频谱。 假设数据采样频率为1000Hz,一个信号包含两个正弦波,频率50Hz、120Hz,振幅0.7、1,噪声为零平均值的随机噪声,采用FFT方法分析其频谱。 clearFs 1000; …

分享axios+signalr简单封装示例

Ajax Axios Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 从浏览器创建 XMLHttpReque…

kafka 可视化工具

kafka可视化工具 随着科技发展,中间件也百花齐放。平时我们用的redis,我就会通过redisInsight-v2 来查询数据,mysql就会使用goland-ide插件来查询,都挺方便。但是kafka可视化工具就找了半天,最后还是觉得redpandadata…

一招教你优化TCP提高大文件传输效率

在当今企业的数据传输实践中,传统的传输控制协议(TCP)在处理大型文件传输时,其固有的可靠性和复杂性有时会导致效率不足。为了提升大文件传输的效率,对TCP进行优化成为了一个关键任务。 TCP传输的可靠性是其核心优势&a…

Kubernetes-2

Kubernetes学习第二天 k8s-21、Kubernetes的核心组件2、pod2.1、什么是pod 3、3种启动pod的方式3.1、命令行启动pod3.1.1、执行下面命令,背后发生了什么? 3.2、启动一个pod背后发生了什么3.3、使用yml文件3.3.1、标准的pod3.3.2、使用部署控制器启动pod3…

windows部署腾讯tmagic-editor01-Hello world

之前写过一篇使用yarn实现的https://blog.csdn.net/qq_36437991/article/details/133644558,后面的两个没有写,这次准备重新实现 环境 pnpm 8.15.1 node 18.19.0 创建vue项目 pnpm create vitecd hello-world pnpm install执行pnpm dev启动项目 安…