在前一篇当中利用相关系数来进行套利,看到价差并不为平稳序列,回测结果也就不是很好,所以想到利用协整关系来构建股票的线性组合,使得股价差为平稳序列,从而在真正意义上构建一个套利策略。看到有其他小伙伴也做过类似研究,但是都是以样本内得到的结果去回测样本内的数据,所以会有一定的不真实性。此研究以14年到15年数据作为样本来检验协整性,当然协整关系是一个动态过程,所以检验出来的协整性只能在统计意义上满足样本内数据,但我们假设这个协整性还继续保持,以16年数据来进行回测来看看实际效果如何。

之前我们谈到了利用两只股票之间的相关系数进行配对交易,但我们能通过两只相关性较高的股票对之间的差价图看出,相关性高他们之间的价差并不一定会是一个平稳序列,简单来说我们无法利用这个不收敛的价差来进行套利。那么要进行真正统计意义上的套利得需要什么样的条件呢,那么就引出了我们的协整关系。首先谈协整我们得先知道平稳这一个概念,一个平稳序列是指数据的期望不会随时间改变,数据的方差与协方差不会随时间而改变,并且固定一个时间,往前与往后进行回归都是相同的。所以平稳的股票是有很多统计上的好性质,可以进行套利操作,当股价达到一定高度时就要卖出,当股价低于一定数值时就需要买入,也就是俗称的低买高卖。但是一般在现实生活中不存在平稳的股票,所以很难去预测他在什么地方是高点什么地方是低点,这也就解释了为什么这么多人都是买高卖低了。
虽然一般不存在平稳的股票,但是几支股票的线性组合就可能是一个平稳序列,这就是我们一般意义上提到的协整关系,通过一些股票的组合来构造平稳的序列来进行套利。但是这个平稳性也是在一定时间段来说的,我们只能根据以往的数据来判断在这段时间内是协整的,但是无法断言在之后交易的时段也是协整的。
我们来只管看一下一个平稳的序列长什么样,最简单的一个噪声序列他就是一个平稳的序列。
In [1]:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

np.random.seed(1234)
x = np.random.normal(0, 1, 500)
X = pd.Series(x) + 100
X.plot(figsize=(14,7))
Out[1]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fdf8c8fd208>

上图构建了一个以100为均值的噪声序列,可以看出这个序列的期望与方差协方差均不随时间而改变。我们来看看两个序列本身是非平稳的序列是怎么样的。

In [2]:

np.random.seed(1234)
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)
X = pd.Series(x) + 100
Y = X + y + 30
for i in range(1000):
    X[i] = X[i] - i/10
    Y[i] = Y[i] - i/10
X.plot(figsize=(14,7));
plt.hold()
Y.plot(figsize=(14,7));
plt.xlabel("Time"); 
plt.ylabel("Price");
plt.legend(["X", "Y"]);

可以看出期望是随时间递减的,明显不是平稳序列,我们通过差分来看看是否能构造平稳序列。

In [3]:

Z=X-Y
Z.plot(figsize=(14,7));
plt.xlabel("Time"); 
plt.ylabel("Price");
plt.legend(["X", "Y"]);

通过差分我们得到的就是一个跟噪声序列长的一样的平稳序列了。 那么一般股票序列是非平稳的我们怎么去找协整关系构建平稳的序列呢。

In [4]:

import statsmodels.api as sm
import seaborn as sns
def find_cointegrated_pairs(dataframe):
    # 得到DataFrame长度
    n = dataframe.shape[1]
    # 初始化p值矩阵
    pvalue_matrix = np.ones((n, n))
    # 抽取列的名称
    keys = dataframe.keys()
    # 初始化强协整组
    pairs = []
    # 对于每一个i
    for i in range(n):
        # 对于大于i的j
        for j in range(i+1, n):
            # 获取相应的两只股票的价格Series
            stock1 = dataframe[keys[i]]
            stock2 = dataframe[keys[j]]
            # 分析它们的协整关系
            result = sm.tsa.stattools.coint(stock1, stock2)
            # 取出并记录p值
            pvalue = result[1]
            pvalue_matrix[i, j] = pvalue
            # 如果p值小于0.05
            if pvalue < 0.05:
                # 记录股票对和相应的p值
                pairs.append((keys[i], keys[j], pvalue))
    # 返回结果
    return pvalue_matrix, pairs
In [60]:

#选取所需要分析的板块,比如我们要看能源行业中具有协整关系的股票对,就为J66,可以更改为自己想研究的行业,选取网址在这https://www.ricequant.com/data/stock#Data—Stock-IndustrySectorConcept-industry
selected_plate=industry('J66')
stock_list = list(selected_plate)
#以14到15年时间的数据作为样本看这段时间的协整股票对。
prices_df = get_price(stock_list, start_date="2014-01-01", end_date="2015-12-01",adjust_type='internal')['ClosingPx']
#获得强协整性股票对
pvalues, pairs = find_cointegrated_pairs(prices_df)
#以热力图来形象表示
sns.heatmap(1-pvalues, xticklabels=stock_list, yticklabels=stock_list, cmap='RdYlGn_r', mask = (pvalues == 1))
#打印出强协整股票对
print (pairs)
[('601998.XSHG', '601988.XSHG', 0.028768046322897745), ('601998.XSHG', '601398.XSHG', 0.013629324146940534), ('601998.XSHG', '601939.XSHG', 0.016186699863228984), ('002142.XSHE', '601169.XSHG', 0.027812249267330186), ('002142.XSHE', '601818.XSHG', 0.0092541471307567586), ('002142.XSHE', '601398.XSHG', 0.0033907684560022452), ('002142.XSHE', '601939.XSHG', 0.033686497622529323), ('002142.XSHE', '600015.XSHG', 0.018079993954006082), ('600016.XSHG', '601288.XSHG', 0.001991599665954755), ('600016.XSHG', '601398.XSHG', 0.025213962807341925), ('600016.XSHG', '601939.XSHG', 0.00074291331294701216), ('601169.XSHG', '601818.XSHG', 0.0037269289212674877), ('601169.XSHG', '601398.XSHG', 0.0062386679292854314), ('000001.XSHE', '601818.XSHG', 0.026555557172914288), ('000001.XSHE', '601398.XSHG', 0.017055918585236828), ('601988.XSHG', '601288.XSHG', 0.049477774986942703), ('601988.XSHG', '601328.XSHG', 0.031518249690270679), ('601988.XSHG', '601398.XSHG', 0.0017579349683697794), ('601988.XSHG', '601939.XSHG', 0.022091735344094244), ('601818.XSHG', '601288.XSHG', 0.0079690226186329947), ('601818.XSHG', '601398.XSHG', 1.8498109175515084e-06), ('601818.XSHG', '601939.XSHG', 7.3502792464642114e-05), ('601818.XSHG', '600015.XSHG', 0.002855359657926119), ('601818.XSHG', '601166.XSHG', 0.034728631041139102), ('601288.XSHG', '601398.XSHG', 0.009342478808074841), ('601288.XSHG', '601939.XSHG', 0.00032856946936313198), ('601288.XSHG', '601166.XSHG', 0.035998851902388045), ('601328.XSHG', '601398.XSHG', 0.025492050058063633), ('601328.XSHG', '601009.XSHG', 0.031395724762407769), ('601398.XSHG', '601009.XSHG', 0.041948115265482692), ('601398.XSHG', '601939.XSHG', 5.0993548358750156e-05), ('601398.XSHG', '600015.XSHG', 8.5274360359395085e-05), ('601398.XSHG', '601166.XSHG', 0.0019644719704145722), ('600036.XSHG', '601009.XSHG', 0.010631898202746499), ('601939.XSHG', '600015.XSHG', 0.034950426223026097), ('601939.XSHG', '601166.XSHG', 0.021113531419143263)]

从选出的股票里挑选p值最低的,也就是我们认为最符合协整关系的来看看他们之间的股价走势是怎么样的.

In [62]:

stock_sample1 = prices_df['601398.XSHG']
stock_sample2 = prices_df['601939.XSHG']
stock_sample1.plot(figsize=(14,7));
plt.hold()
stock_sample2.plot(figsize=(14,7));
plt.xlabel("Time"); 
plt.ylabel("Price");
plt.legend(['601398.XSHG', '601939.XSsHG']);

要利用这组股票对进行配对交易,就得看看他们之间的存在什么样的线性关系。这里我们通过股价进行最小残差平方和(OLS)方法来进行回归。

In [63]:

x = stock_sample1
y = stock_sample2
X = sm.add_constant(x)
result = (sm.OLS(y,X)).fit()
print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:            601939.XSHG   R-squared:                       0.978
Model:                            OLS   Adj. R-squared:                  0.978
Method:                 Least Squares   F-statistic:                 2.028e+04
Date:                Sun, 20 Nov 2016   Prob (F-statistic):               0.00
Time:                        06:56:26   Log-Likelihood:                 179.27
No. Observations:                 467   AIC:                            -354.5
Df Residuals:                     465   BIC:                            -346.2
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
===============================================================================
                  coef    std err          t      P>|t|      [95.0% Conf. Int.]
-------------------------------------------------------------------------------
const          -1.2796      0.045    -28.141      0.000        -1.369    -1.190
601398.XSHG     1.5254      0.011    142.402      0.000         1.504     1.546
==============================================================================
Omnibus:                      137.194   Durbin-Watson:                   0.225
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              676.507
Skew:                           1.192   Prob(JB):                    1.25e-147
Kurtosis:                       8.393   Cond. No.                         26.6
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
r-squred为0.978,说明我们拟合的参数解释了97.8%的样本数据,说明拟合结果比较好,AIC与BIC检验较小说明回归效果好,再来看看系数是否统计显著,const的系数的绝对值除标准误差std err明显大于自由度为465的t统计量,说明统计显著。至此,我们能认为我们回归得到的结果是比较好的了。

接下来我们看看线性组合的价差是否是在均值周围波动。

In [67]:

diff=y-1.5254*x
mean=np.mean(diff)
std=np.std(diff)
print(std)
up=mean+std
down=mean-std
time=diff.index
mean_line=pd.Series(mean,index=time)
up_line=pd.Series(up,index=time)
down_line=pd.Series(down,index=time)
set=pd.concat([diff,mean_line,up_line,down_line],axis=1)
set.plot(figsize=(15,7))
0.164835349769
Out[67]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fdf609ac470>

至此,我们完成了配对交易的准备步骤,找到了协整股票对之间的线性关系以及股价差满足的模型,我们以'601818.XSHG'的股价减去拟合的系数0.6319倍'601988.XSHG'的股价,线性组合价差服从均值为0.9328标准误差为0.072的正态分布。根据这样的线性关系,我们构建这么一个简单的配对交易策略:组合价差超过均值+1倍标准误差即卖出601818,买入601988;低于均值1倍标准误差即买入601818,卖出601988.

转自米框

https://www.ricequant.com/community/topic/2053/%E7%BB%9F%E8%AE%A1%E5%A5%97%E5%88%A9-%E4%BA%8C-%E5%88%A9%E7%94%A8%E5%8D%8F%E6%95%B4%E5%85%B3%E7%B3%BB%E8%BF%9B%E8%A1%8C%E9%85%8D%E5%AF%B9%E4%BA%A4%E6%98%93

利用协整关系进行配对交易相关推荐

  1. python统计套利_统计套利(二),利用协整关系进行配对交易【原文】

    之前我们谈到了利用两只股票之间的相关系数进行配对交易,但我们能通过两只相关性较高的股票对之间的差价图看出,相关性高他们之间的价差并不一定会是一个平稳序列,简单来说我们无法利用这个不收敛的价差来进行套利 ...

  2. 基于时间序列的协整关系的配对交易

    数据来源:Vitu.AI (一)什么是配对交易? 统计套利之配对交易是一种基于数学分析交易策略,其盈利模式是通过两个标的的差价(spread)来获取,两者的价格走势虽然在中途会有所偏离,但是最终都会趋 ...

  3. USDCNY--USDCNH 配对交易___境内及离岸人民币即期的协整关系及配对交易策略分析

    由于中国没有实现资本项下的可自由兑换,目前人民币的外汇交易存在境内及境外两个市场.在境内交易的CNY和境外交易的CNH,本质都是人民币,从这个角度上看,两者具有高度相关性.但是由于两者的市场形态.监管 ...

  4. r语言 协整_基于协整关系的配对量化交易策略-R语言

    基于协整关系的配对交易比之前的基于距离和相关性要更先进一些.收益上确实也体现出来了. library(tseries) adf.test(xom) adf.test(cvx) model <- ...

  5. 基于协整理论的配对交易

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

  6. 量化金融分析AQF(12):配对交易 Pair trading - 考虑时间序列平稳性、协整关系

    目录 1. 数据准备 & 回测准备 2. 策略开发思路 3.产生交易信号 3. 计算策略年化收益并可视化 4.总结 上节说到,做2只股票配对交易,先判断2只股票的平稳性,不平稳就做一阶差分和协 ...

  7. 使用R语言进行协整关系检验

    协整检验是为了检验非平稳序列的因果关系,协整检验是解决伪回归为问题的重要方法.首先回归伪回归例子: 伪回归Spurious regression伪回归方程的拟合优度.显著性水平等指标都很好,但是其残差 ...

  8. R语言迹检验协整关系式_使用R语言进行协整关系检验

    协整检验是为了检验非平稳序列的因果关系,协整检验是解决伪回归为问题的重要方法.首先回归伪回归例子: 伪回归Spurious regression伪回归方程的拟合优度.显著性水平等指标都很好,但是其残差 ...

  9. Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化

    最近我们被客户要求撰写关于向量自回归模型的研究报告,包括一些图形和统计输出. 视频:向量自回归VAR数学原理及R软件经济数据脉冲响应分析实例 [视频]向量自回归VAR数学原理及R语言软件经济数据脉冲响 ...

最新文章

  1. ROS Master IP
  2. Android 数据存储与IO (一)
  3. AT2064-[AGC005F]Many Easy Problems【NTT】
  4. keepalived实现高可用nginx反向代理的简单案例
  5. java poi生成excel文件_java poi 导出Excel文件
  6. java我现在不懂看不懂,看都看不懂,难道我与Java无缘吗
  7. 最著名的10位程序员,你都知道吗?
  8. 各家银行黄金T+D业务比较
  9. jenkins 文件服务器,jenkins 部署文档
  10. 批量修改文件夹及文件用户权限和用户组权限 centos
  11. hdu 4622 Reincarnation(SAM)
  12. qrcode生成一个带有图片的二维码
  13. 二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解
  14. 在MQTT中使用SSL/TLS提高安全性
  15. ubuntu 8.10安装配置经验(Intrepid Ibex)——转载
  16. 为什么蘑菇丁会显示服务器繁忙,浅谈蘑菇丁自动打卡
  17. 搭建IIS服务器发布ASP网站
  18. matlab空间计量模型AIC和SC,空间计量模型
  19. 计算机音乐外国,趣闻,国内外大神教你,用计算器圆你的音乐梦
  20. BUG被称为计算机错误的来源

热门文章

  1. 你见过什么天方夜谭的盈利项目吗?
  2. PCI总线的工作原理?
  3. SAP BW用户分类及收费/用户表
  4. TCP/IP之Traceroute程序
  5. 谈谈互联网后端基础设施
  6. win10系统进入英雄联盟后黑屏怎么办
  7. SciencePub学术 | 计算机工程类重点SCIEI征稿中
  8. flink mysql cdc到kafka
  9. ecshop后台系统设置-商店设置详解
  10. 【Nan‘s 吴恩达机器学习笔记】第八、九章 神经网络