沪深300配对交易

article/2025/11/5 3:04:44

目录

      • 获取数据
      • 相关系数三级目录
      • 协整检验
      • 聚类算法进一步筛选
      • 回测

获取数据

通过pandas_datareader来获取沪深300的股票数据,为此,先从网上爬虫得到沪深300的股票名单

import os
import pandas as pd
import pandas_datareader as web
import pickle
import requests
import bs4 as bs
import matplotlib.pyplot as plt
import numpy as np
# import tusharedef save_hs300_tickers():# resp = requests.get('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')resp = requests.get('https://zh.wikipedia.org/wiki/%E6%B2%AA%E6%B7%B1300#%E6%88%90%E4%BB%BD%E8%82%A1%E5%88%97%E8%A1%A8')soup =bs.BeautifulSoup(resp.text, "lxml")table = soup.find('table', {'class':"wikitable collapsible sortable"})tickers = []for row in table.find_all('tr')[1:]:ticker = row.find('td').textif ticker[0] == "6" :ticker = ticker + ".SS"else :ticker = ticker + ".SZ"tickers.append(ticker)with open("hs300tickers.pickle","wb") as f:pickle.dump(tickers,f)print(tickers)return tickers

之后下载数据

def get_data_from_yahoo(reload_hs300=False):if reload_hs300:tickers = save_hs300_tickers()else:with open("hs300tickers.pickle", "rb") as f:tickers = pickle.load(f)if not os.path.exists('stock_dfs'):os.makedirs('stock_dfs')start_date = dt.datetime(2010, 1, 1)end_date = dt.datetime(2020, 6, 1)for ticker in tickers[:]:print(ticker)if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):df = web.DataReader(ticker,'yahoo',start_date, end_date )df.to_csv('stock_dfs/{}.csv'.format(ticker))else:print('Already have {}'.format(ticker))

这些步骤也可以用tushare完成,现在电脑里已经有了300个CSV文件,为了之后读取文件更方便,先写一个整合数据的程序

def compile_data():with open("hs300tickers.pickle", "rb") as f:tickers = pickle.load(f)main_df = pd.DataFrame()for count,ticker in enumerate(tickers):df = pd.read_csv('stock_dfs/{}.csv'.format(ticker))df.set_index('Date',inplace=True)df.rename(columns={'Adj Close': ticker}, inplace=True)df.drop(['Open', 'High', 'Low', 'Close', 'Volume'], 1, inplace=True)df.fillna(method = 'ffill')if main_df.empty:main_df = dfelse:main_df = main_df.join(df,how='outer')if count % 10 ==0:print(count)print(main_df.head())main_df.to_csv('hs300_closes.csv')

把300只股票的收盘价统一放进hs300_closes.csv中

相关系数三级目录

计算相关系数非常简单

df = pd.read_csv('hs300_closes.csv')
df = df[-700:-400]
df_corr = df.corr()

df_corr就是相关系数矩阵,可以通过下面的程序画出相关系数热力图

data = df_corr.values
fig = plt.figure()
ax = fig.add_subplot(1,1,1)heatmap = ax.pcolor(data,cmap=plt.cm.RdYlGn)
fig.colorbar(heatmap)
ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)ax.invert_yaxis()
ax.xaxis.tick_top()column_labels = df_corr.columns
row_labels = df_corr.indexax.set_xticklabels(column_labels)
ax.set_yticklabels(row_labels)heatmap.set_clim(-1,1)
plt.tight_layout()
plt.show()

绿色代表正相关,红色代表负相关,颜色越深值越大。可以通过图有一个大致上的判断。

相关系数

协整检验

两只股票价格的相关系数不能直接做为选择股票对的标准,一般要求配对的股票能够通过协整检验。协整检验是为了检验两个或多个非平稳时间序列有无因果关系。协整检验要先检验两只股票的价格时间序列是否同阶单整,本次就简化为先看两只股票的价格的一阶差分是否平稳,都单整后进行协整检验。整检验有两种方法,一种是先做回归,看残差是否平稳,这种方法叫Engel-Granger 两步协整检验法;另一种为Johansen Test 协整检验法。

import statsmodels.api as sm
from statsmodels.tsa.stattools import coint,adfullerdef cointrgration(priceX,priceY):if priceX is None or priceY is None:print('数据缺失')priceX = np.log(priceX)priceY = np.log(priceY)ret_x = np.diff(priceX)ret_y = np.diff(priceY)ret_x = ret_x[1:]ret_y = ret_y[1:]adf_x = adfuller(ret_x)adf_y = adfuller(ret_y)results = sm.OLS(priceY,sm.add_constant(priceX)).fit()spread = results.residadfSpread = adfuller(spread)if adfSpread[0]<adfSpread[4]['1%'] and adf_x[0]<adf_x[4]['1%'] and adf_y[0]<adf_y[4]['1%']:return Trueelse:return False

上面是python实现协整检验的方法,也可以用arch包进行以上操作。

聚类算法进一步筛选

一般同行业内的股票才可以进行配对交易。目前筛选股票的过程中并没有考虑到这一点,因此筛选出来的股票对中,会有一些统计意义上可以配对,但实际没有什么逻辑的股票对。所以用聚类算法对股票进行分类,筛选出适合实际操作的股票对。可以直接用sklearn库进行聚类,本次用的AP算法进行聚类,好处是不用事先给出聚类数目。

from sklearn.cluster import affinity_propagation
from sklearn.covariance import GraphicalLassoCV
def Clusters():df = pd.read_csv('hs300_diff.csv')df = df[-700:-400]df.drop(['Date'],axis=1,inplace=True)stock_dataset = np.array(df)stock_dataset = stock_dataset.copy().Tstock_dataset = stock_dataset/np.std(stock_dataset,axis=0)np.nan_to_num(stock_dataset)stock_model = GraphicalLassoCV()stock_model.fit(stock_dataset)_,labels = affinity_propagation(stock_model.covariance_)n_labels = max(labels)print('Stock Clusters: {}'.format(n_labels + 1))  # 10,即得到10个类别print(len(labels))return labels

完整的筛选股票对程序如下

def filter_data():df = pd.read_csv('hs300_closes.csv')df = df[-700:-400]df_corr = df.corr()pair_list=[]pair_SSD=[]pair_corr=[]tickers = df_corr.columnslabels = Clusters()for i in range(0,300):for j in range(i,300):corr = df_corr.iloc[i,j]if corr > 0.95:if labels[i]  ==labels[j]:priceX = df[str(tickers[i])].valuespriceY = df[str(tickers[j])].valuesif cointrgration(priceX ,priceY ):pair_list.append((tickers[i],tickers[j]))pair_SSD.append(SSD(priceX,priceY))pair_corr.append(corr)data = pd.DataFrame([pair_list,pair_corr,pair_SSD],index=['pair','corr','SSd'])return data

回测

对筛选出来的股票,在聚宽进行回测,采用标准的布林带策略,回测结果如下在这里插入图片描述

参考资料
https://blog.csdn.net/FrankieHello/article/details/86770852

https://www.youtube.com/watch?v=eAtcIoVGb-4&list=PLQVvvaa0QuDcR-u9O8LyLR7URiKuW-XZq&index=8


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

相关文章

配对交易策略设计

可交易的一个关键要求是两个股票的对数价格序列之间存在均衡关系。 而均衡关系由两个值描述&#xff1a;协整系数以及均衡值。一旦确定这两个值&#xff0c;它们就可以用来构建两种股票的对数价格的线性组合&#xff0c;即所谓的价差。配对交易是对价差均值回归特性的押注。当…

配对交易之统计套利配对:介绍

现在让我们来解释一下配对交易背后的想法。从估值角度来看&#xff0c;投资关心的问题是卖出高估值的证券&#xff0c;买入低估值的证券。然而&#xff0c;只有当我们也知道证券的真正价值时&#xff0c;才有可能确定证券被高估或低估。但是&#xff0c;这很难做到。配对交易试…

股票配对交易策略-最小距离法

策略 配对交易( Pairs Trading)为这种困境提供了一种既能避险又盈利的策略&#xff0c;其又被称之为价差交易或者统计套利交易&#xff0c;是一种风险小、收益较稳定的市场中性策略。一般的做法&#xff0c;是在市场中寻找两只历史价格走势有对冲效果的股票组成配对&#xff0c…

配对交易方法_COVID下的自适应配对交易,一种强化学习方法

配对交易方法 Abstract 抽象 This is one of the articles of A.I. Capital Management’s Research Article Series, with the intro article here. This one is about applying RL on market neutral strategies, specifically, optimizing a simple pair trading strategy …

一种拉风的交易策略——配对交易

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

基于协整理论的配对交易

基于协整理论的配对交易 前导知识协整协整与相关 配对交易策略思想策略实现 前导知识 协整 在实际生活中&#xff0c;大多数经济金融时间序列通常是非平稳的&#xff0c;如果用这些非平稳时间序列来建立回归模型&#xff0c;那么就会产生虚假回归&#xff0c;即所谓的“伪回归…

matlab配对交易回测,精品案例 | 经典投资策略之配对交易策略

原标题&#xff1a;精品案例 | 经典投资策略之配对交易策略 人不恋爱枉少年&#xff0c;在“全城热恋”的氛围下&#xff0c;股市也来凑热闹&#xff0c;配对交易策略油然而生。所谓“男女搭配&#xff0c;干活不累”&#xff0c;成双成对真的能虐死单身狗吗&#xff1f;配对交…

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

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

【量化笔记】配对交易

配对交易的步骤 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)颜色值。根据它们的意思,不透明度是元素不透明度或坚固度的度量,而透明度则衡量…