金融量化 — 配对交易策略 (Pair Trading)

article/2025/11/5 3:40:22

1. 配对交易策略

1.1、引言

在量化投资领域,既然严格的无风险套利机会少、收益率微薄,实际的执行过程中也不能完全消除风险。那么如果有一种选择,能够稍微放松100%无风险的要求,比如允许有5%的风险,但同时却能够让套利机会增加100%以上,那岂不是一个更好的选择?今天,我们就来介绍这样一种方法——配对交易。

1.2、统计套利

1.2.1 定义

统计套利即主要以对历史数据进行统计分析为基础,估计目标统计量的分布,再结合股票自身基本面数据来指导套利交易。

1.2.2 评价

统计套利相对于无风险套利,它增加了一些风险,但也伴随着诱人的风险溢价,即获得更多套利机会。不过它一个本质上的局限来自于使用的历史数据,其只能反映过去的信息,用之预测未来有时难以讲得通。

1.2.3 例子

统计套利的原理其实用下面这张图就可以解释:

老头小狗走路时随机的,但老头和小狗的中间距离是0到绳子的长度, 具备稳定性

老头小狗走路时随机的,但老头和小狗的中间距离是0到绳子的长度, 具备稳定性

我们现在把这个场景应用到市场上,以股票为例:

股票A、B: 价格——Random Walk;

股票A和B的差价(或者其他的 Linear combination 的时间序列)——具备稳定性。

假设我们现在找到了这样一个股票 A 和 B 的序列,他们的差价,经过统计学的 Cointegration test 证明具备稳定性(如 Adfuller test),我们计算出该时间序列的 mean 和 std , 就可以设定一个稳定阀域,在偏离的时候买入/卖出,等到回归到稳定阀域再平仓。

举例,过去6个月内,A 股票和 B 股票的价差序列为平稳序列,均值为 10,标准差为 2,我们设定阀域为1.5个标准差,那么平稳区间就是 7-13 。

当 A-B > 13 时,我们买入 B , 卖出 A;

当 A-B < 7 时,我们买入 A , 卖出 B 。

等到回归到平稳区间平仓。

1.3 股票配对交易

1.3.1 定义

股票配对交易是统计套利的主要内容之一,它旨在寻找市场上历史走势相似的股票进行配对,当价格差较大(高于历史均值)时高卖低买进行套利。

1.3.2 主要方法

i.距离法

定 义:距离法使用一个回溯时间区间,标准化价格。然后在 2 范数下计算 n 只股票两两间的配对距离(SSD)。以 SSD 值最小的前 20 对作为标的,在后续 6 个月内以 2 倍标准差作为阈值进行统计套利,距离回到均值时平仓。6 个月后更新标的继续套利。

评 价:标的选择标准中蕴含着其无法最大化利润,因每对的收益与其价差(SSD)成正比;此外高相关性不代表协整,从而均值回复得不到保证。

改 进:(a) 只在同一行业内选择标的;

(b)使用 Pearson 相关系数度量期内相关性。

ii.协整法

前 提: 不平稳的经济时间序列的线性组合可能实现平稳。

在这里插入图片描述

Engle-Granger 法: 用对数价格进行 OLS 回归,对残差进行 ADF 检验,其中误差修正模型为 Johansen
方法。若验证了协整关系,即可说明股价 A,B之间存在长期均衡关系,从而残差序列是均值回复的。

评 价: 模型太单一,标的仅为两种股票,时限仅限于 2 年之内,单笔收益最大化不保证整体收益最大化。

改 进: 先进行距离筛选后再做协整。

iii.时间序列法

定 义: 假定价差为具有均值回归特性的马尔科夫链,伴随着高斯噪声。

在这里插入图片描述

评 价: 该方法优越性在于抓住了配对交易的核心—均值回复性;其次该模型是连续的,因而可以用于预测;最后,该模型易处理,可通过卡尔曼滤波方法得到最小
MSE 参数估计。
不过,价差应使用价格的自然对数差来避免量纲不同的影响;模型条件苛求收益平价,这实际很难达到;金融资产数据现实中并不满足Ornstein-Uhlenbeck
过程。

2. python 实现

Pair trading 策略 - 考虑时间序列平稳性

2.1 数据准备 & 回测准备

import pandas as pd
import numpy as np
import tushare as ts
import seaborn
from matplotlib import pyplot as plt
plt.style.use('seaborn')
%matplotlib inline
data1 = ts.get_k_data('600199', '2013-06-01', '2014-12-31')[['date','close']]
data2 = ts.get_k_data('600702', '2013-06-01', '2014-12-31')['close']
data.set_index('date',inplace = True)
data.columns = stocks_pair
data.head()

在这里插入图片描述

data3.plot(figsize=(8,6));

在这里插入图片描述

2.2 策略开发思路

data3.corr()  # 协方差矩阵

在这里插入图片描述

# 可视化看相关关系
plt.figure(figsize =(10,8))
plt.title('Stock Correlation')
plt.plot(data['000568'], data['000858'], '.');
plt.xlabel('000568')
plt.ylabel('000858')
data.dropna(inplace = True)

在这里插入图片描述

[slope, intercept] = np.polyfit(data.iloc[:,0], data.iloc[:,1], 1).round(2)    #   斜率和截距  
slope,intercept
data['spread'] = data.iloc[:,1] - (data.iloc[:,0]*slope + intercept)
data.head()

在这里插入图片描述

data['zscore'] = (data['spread'] - data['spread'].mean())/data['spread'].std()

在这里插入图片描述

data3['zscore'].plot(figsize = (10,8),title = 'Z-score')
plt.axhline(1.5)
plt.axhline(0)
plt.axhline(-1.5)

在这里插入图片描述
产生交易信号

data['position_1'] = np.where(data['zscore'] > 1.5, 1, np.nan)
data['position_1'] = np.where(data['zscore'] < -1.5, -1, data['position_1'])
data['position_1'] = np.where(abs(data['zscore']) < 0.5, 0, data['position_1'])data['position_1'] = data['position_1'].fillna(method = 'ffill')data['position_1'].plot(ylim=[-1.1, 1.1], figsize=(10, 6),title = 'Trading Signal_Uptrade')

在这里插入图片描述

data['position_2'] = -np.sign(data['position_1'])
data['position_2'].plot(ylim=[-1.1, 1.1], figsize=(10, 6),title = 'Trading Signal_Downtrade')

2.3 计算策略年化收益并可视化

data['returns_1'] = np.log(data['600199'] / data['600199'].shift(1))
data['returns_2'] = np.log(data['600702'] / data['600702'].shift(1))
data['strategy'] = 0.5*(data['position_1'].shift(1) * data['returns_1']) +0.5*(data['position_2'].shift(1) * data['returns_2'])
data[['returns_1','returns_2','strategy']].dropna().cumsum().apply(np.exp).plot(figsize=(10, 8),title = 'Strategy_Backtesting')

在这里插入图片描述

# 计算年化收益率
data3[['returns_1','returns_2','strategy']].dropna().mean() * 252
returns_1   -0.073915
returns_2   -0.017554
strategy     0.105002
dtype: float64
# 计算年化风险
data3[['returns_1','returns_2','strategy']].dropna().std() * 252 ** 0.5
returns_1    0.300306
returns_2    0.280425
strategy     0.068639
dtype: float64
# 策略累积收益率
data3['cumret'] = data3['strategy'].dropna().cumsum().apply(np.exp)
# 策略累积最大值
data3['cummax'] = data3['cumret'].cummax()
# 算回撤序列
drawdown = (data3['cummax'] - data3['cumret'])
# 算最大回撤
drawdown.max()
0.038159777097367176

策略的思考

  1. 对多只ETF进行配对交易,是很多实盘量化基金的交易策略;

策略的风险和问题:

  1. Spread不回归的风险,当市场结构发生重大改变时,用过去历史回归出来的Spread会发生不回归的重大风险;
  2. 中国市场做空受到限制,策略中有部分做空的收益是无法获得的;
  3. 回归系数需要Rebalancing;
  4. 策略没有考虑交易成本和其他成本;

http://chatgpt.dhexx.cn/article/O6CFCvuW.shtml

相关文章

【量化笔记】配对交易

配对交易的步骤 1. 如何挑选进行配对的股票 2. 挑选好股票对以后&#xff0c;如何制定交易策略&#xff0c;开仓点如何设计 3. 开仓是&#xff0c;两只股票如何进行多空仓对比 股票对的选择 1. 行业内匹配 2. 产业链配对 3. 财务管理配对 最小距离法 配对交易需要对股…

配对交易——初识统计套利

配对交易是统计套利中的非常经典的策略。众所周知,A股市场无法卖空个股,所以中性化的配对交易策略并不能直接“拿来主义”。但这并不妨碍我们学习配对交易的思想,将卖空改成卖出,构造适合A股市场的策略。下面我们就开始学习吧~ 一、配对交易:统计套利的基石 配对交易是基…

配对交易策略

一、引言 在量化投资领域&#xff0c;既然严格的无风险套利机会少、收益率微薄&#xff0c;实际的执行过程中也不能完全消除风险。那么如果有一种选择&#xff0c;能够稍微放松100%无风险的要求&#xff0c;比如允许有5%的风险&#xff0c;但同时却能够让套利机会增加100%以上…

股票中的情侣——配对交易(附:源码)

什么是配对交易&#xff1f; 配对交易&#xff08;Pairs Trading&#xff09;是指八十年代中期华尔街著名投行Morgan Stanley的数量交易员Nunzio Tartaglia成立的一个数量分析团队提出的一种市场中性投资策略&#xff0c;&#xff0c;其成员主要是物理学家、数学家、以及计算机…

在html中透明度的用法,关于CSS透明度的两种使用方法以及优缺点

关于CSS透明度的两种使用方法以及优缺点 在建企业网站的过程中&#xff0c;为了提升用户视觉体验度&#xff0c;可能要将网页中的某些部分设置为背景颜色透明&#xff0c;使用css设置背景颜色透明的有两种方法&#xff1a;一种是通过rgba方式设置&#xff0c;另一种是通过backg…

CSS如何设置透明

以下介绍三种方法供参考: 设置方法一: 给对应元素添加background-color: transparent; 设置相应代码: 修改之前 : 修改之后: 设置方法二 : 给对应元素设置opacity:0; ☆☆☆注意 : 1.opacity准确来讲是设置的"不透明度"(即不透明的程度); 2.取值"0~1"之间…

设置CSS透明度的方法

一、css rgba()设置颜色透明度 语法&#xff1a; rgba&#xff08;R,G,B,A&#xff09;;RGBA是代表Red&#xff08;红色&#xff09;Green&#xff08;绿色&#xff09;Blue&#xff08;蓝色&#xff09;和Alpha&#xff08;不透明度&#xff09;三个单词的缩写。RGBA颜色值是…

css透明度兼容问题opacity

CSS3的透明度属性opacity想必大家都已经用的无处不在了。而对于不支持CSS3的浏览器如何进行透明处理&#xff0c;保持浏览器效果的一致&#xff0c;这个估计谁都会写&#xff0c;但是涉及到filter的具体语法含义和各版本写法的不同区别&#xff0c;很多人都搞不准确&#xff0c…

css3透明度渐变

在需要使用透明度渐变的div中添加 linear类即可 <div class"linear" style"widht:500px;height:500px"></div> .linear {background: -webkit-linear-gradient( top, rgba(0, 0, 0, 0),rgba(0, 0, 0, 0.2) ); /* Safari 5.1 - 6 /background…

html中透明度100是,CSS 透明度设置方法及常见问题解析

你对 CSS 中的半透明颜色可能已经有了基础的了解&#xff0c;CSS透明算得上是一种相当流行的技术&#xff0c;但在跨浏览器支持上&#xff0c;对于开发者来说&#xff0c;可以说是一件令人头疼的事情。目前还没有一个通用方法&#xff0c;以确保透明度设置可以在目前使用的所有…

html页面透明度属性,css透明度属性是什么?

css透明度属性是什么&#xff1f;CSS透明度属性是opacity属性。下面本篇文章就来给大家介绍一下CSS 透明度属性--opacity属性。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 CSS 透明度属性--opacity属性 css opacity属性用于设置一…

html中的透明度怎么设置,css透明度怎么设置?css中各种透明度的设置方法总结...

本篇文章给大家介绍一下css中透明度的设置方法,下面我们就来看看具体的内容。 不透明度和透明度 根据定义,CSS中的不透明度和透明度定义了元素的可见性,无论是图像,表格还是RGBA(红绿蓝alpha)颜色值。根据它们的意思,不透明度是元素不透明度或坚固度的度量,而透明度则衡量…

html页面透明度属性,css透明度是什么属性?

css透明度属性指的是opacity属性&#xff1b;opacity属性可以设置一个元素了透明度级别。下面本篇文章就来给大家介绍一下CSS opacity属性&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 css opacity属性用于设置一个元素…

html css表格透明度,【总结】CSS透明度大汇总_html/css_WEB-ITnose

近年来,CSS不透明算得上是一种相当流行的技术,但在跨浏览器支持上,对于开发者来说,可以说是一件令人头疼的事情。目前还没有一个通用方法,以确保透明度设置可以在目前使用的所有浏览器上有效。 这篇汇总主要是提供一些CSS不透明的详细介绍,代码示例和解释,以实现这项有用…

CSS透明度[简述]

CSS透明度 CSS中设置透明度有两种方式: GRBA和opacity. 下面我们就这两种方式进行简要介绍: GRBA 语法如下: rgba(R,G,B,A); rgba只是单纯的设置颜色的透明度,但是标签上的文字不会透明. 即透明元素的子元素不会继承其透明效果. 代码示例如下: <!DOCTYPE html> <…

一文搞懂蓝绿发布、灰度发布和滚动发布

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。 长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布、灰度发布和滚动发布,目的是尽可能避免因发布导致的流量丢失或服务不可用问题。 一、 蓝绿发布 项目逻…

微信小程序的灰度发布

❤️最细微信小程序版本上传、提交审核、发布【建议收藏】❤️ ❤️2021直击大厂前端开发岗位面试题❤️ ❤️效果图如下&#xff0c;如有需要请自取修改【建议收藏】&#xff01;❤️最火前端Web组态软件(可视化)❤️效果图如下&#xff0c;如有需要请自取修改【建议收藏】&…

持续集成和灰度发布

一、持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;是一种软件开发实践&#xff0c;即团队开发成员经常集成它们的工作&#xff0c;通常每个成员每天至少集成一次&#xff0c;也就意味着每天可能会发生多次集成。每次集成都通过自动化的构…

灰度发布:灰度很简单,发布很复杂

什么是灰度发布&#xff0c;其要点有哪些&#xff1f; 最近跟几个聊的来的同行来了一次说聚就聚的晚餐&#xff0c;聊了一下最近的工作情况如何以及未来规划等等&#xff0c;酒足饭饱后我们聊了一个话题“灰度发布”。 因为笔者所负责的产品还没有达到他们产品用户的量级上…

互联网产品灰度发布

互联网产品灰度发布 关于2016年5月15日&#xff0c;DevOps成都站&#xff5c;架构与运维峰会活动总结 1. 前言 2 2. 灰度发布定义 5 3. 灰度发布作用 5 4. 灰度发布步骤 5 5. 灰度发布测试方法 6 6. 灰度发布引擎 6 7. 灰度发布常见问题 8 7.1. 以偏概全 8 7.1.1. 问题…