关于数据挖掘:Python配对交易策略统计套利量化交易分析股票市场附代码数据

40次阅读

共计 6674 个字符,预计需要花费 17 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=24814

最近咱们被客户要求撰写对于配对交易策略的钻研报告,包含一些图形和统计输入。

说到在股票市场上赚钱,有无数种不同的赚钱形式。仿佛在金融界,无论你走到哪里,人们都在通知你应该学习 Python

毕竟,Python 是一种风行的编程语言,可用于所有类型的畛域,包含数据迷信。有大量软件包能够帮忙您实现目标,许多公司应用 Python 来开发与金融界相干的以数据为核心的应用程序和科学计算。

最重要的是,Python 能够帮忙咱们利用许多不同的交易策略,这些策略(没有它)将很难用手或电子表格进行剖析。咱们将探讨的交易策略之一称为 配对交易。

配对交易

配对交易是_均值回归的_一种模式,具备始终对冲市场稳定的独特劣势。该策略基于数学分析。

原理如下。假如您有一对具备某种潜在经济分割的证券 X 和 Y。一个例子可能是生产雷同产品的两家公司,或一条供应链中的两家公司。如果咱们能够用数学模型对这种经济分割进行建模,咱们就能够对其进行交易。

为了了解配对交易,咱们须要了解三个数学概念:平稳性、差分和协整。

import numpy as np
import pandas as pd

安稳 / 非安稳

平稳性是工夫序列剖析中最常见的未经检验的假如。当数据生成过程的参数不随工夫变动时,咱们通常假如数据是安稳的。或者思考两个系列:A 和 B。系列 A 将生成具备固定参数的安稳工夫序列,而 B 将随工夫变动。

咱们将创立一个函数,为概率密度函数创立 z 分数。高斯分布的概率密度为:

 是均值和  是标准差。标准差的平方,,是方差。教训法令规定 66% 的数据应该介于  和,这意味着该函数normal 更有可能返回凑近均值的样本,而不是那些远离均值的样本。

    mu 
    sigma 
    return normal(mu, sigma)

从那里,咱们能够创立两个展现安稳和非安稳工夫序列的图。

# 设置参数和数据点数
T = 100

Series(index=range(T))


     # 当初参数依赖于工夫
     # 具体来说,序列的均值随工夫变动
     B[t] = genedata
    
plt.subplots

为什么平稳性很重要

许多统计测试要求被测试的数据是安稳的。在非安稳数据集上应用某些统计数据可能会导致垃圾后果。作为一个例子,让咱们通过咱们的非安稳 .

np.mean

plt.figure
plt.plot
plt.hlines

计算的平均值将显示所有数据点的平均值,但对将来状态的任何预测都没有用。与任何特定工夫相比,它毫无意义,因为它是不同工夫的不同状态混搭在一起的汇合。这只是一个简略而清晰的例子,阐明了为什么非平稳性会扭曲剖析,在实践中会呈现更奥妙的问题。

平稳性测验 Augmented Dickey Fuller(ADF)

为了测试平稳性,咱们须要测试一个叫做_单位根的_货色。自回归单位根测验基于以下假设检验:

它被称为单位根 tet 因为在原假如下,自回归多项式 , 的根等于 1。在原假如下趋势安稳。如果 而后首先进行差分,它变成:

测验统计量为

 是最小二乘预计和 SE() 是通常的标准误差预计。该测试是单侧左尾测试。如果 {} 是安稳的,那么能够证实或者并且是,然而,在非平稳性原假如下,上述后果给出以下函数将容许咱们应用 Augmented Dickey Fuller (ADF) 测验来查看平稳性。

defty_test(X, cutoff=0.01):
     # adfuller 中的 H_0 是单位根存在(非安稳)# 咱们必须察看显着的 p 值看该序列是安稳的
     adfuller

正如咱们所见,基于工夫序列 A 的测验统计量(与特定的 p 值对应),咱们可能无奈回绝原假如。因而,A 系列很可能是静止的。另一方面,B 系列被假设检验回绝,所以这个工夫序列很可能是非安稳的。

协整

金融数量之间的相关性是出了名的不稳固。尽管如此,简直所有的多元金融问题都常常应用相关性。相关性的另一种统计度量是协整。这可能是掂量两个金融数量之间分割的更持重的衡量标准,但迄今为止,简直没有基于此概念的偏差实践。

两只股票可能在短期内齐全相干,但从久远来看却出现分歧,一只增长,另一只上涨。相同,两只股票可能互相追随,相距不会超过肯定间隔,但具备相关性,正负相干变动。如果咱们是短期,相关性可能很重要,但如果咱们在投资组合中长期持有股票,则无关紧要。

咱们曾经构建了两个协整序列的示例。咱们当初绘制两者之间的差别。

# 生成每日收益

np.random.normal

# 总结


plot

np.random.normal
Y = X + 6 + 乐音

plt.show()

(Y - X).plot # 绘制点差
plt.axhline# 增加均值
plt.xlabel
plt.xlim


点击题目查阅往期内容

R 语言动量交易策略剖析调整后的数据

左右滑动查看更多

01

02

03

04

协整测验

协整测验程序的步骤:

  • 测验每个重量系列的单位根  独自应用单变量单位根测验,例如 ADF、PP 测验。
  • 如果单位根不能被回绝,那么下一步就是测验重量之间的协整关系,即测验是否  是 I(0)。

如果咱们发现工夫序列为单位根,那么咱们持续进行协整过程。有三种次要的协整测验办法:Johansen、Engle-Granger 和 Phillips-Ouliaris。咱们将次要应用 Engle-Granger 测试。

让咱们思考回归模型 :

中 是确定性项。假设检验如下:

 与 归一化的协整向量协整

咱们也应用残差  用于单位根测验。

该假设检验实用于模型:

以下等式的测验统计量:

当初您理解了两个工夫序列协整的含意,咱们能够对其进行测试并应用 python 进行测量:

coint
print(pvalue)


# 低 p 值意味着高协整!

相干与协整

相关性和协整性尽管在实践上类似,但齐全不同。为了证实这一点,咱们能够查看两个相干但不协整的工夫序列的示例。

一个简略的例子是两个序列。

Xruns = np.random.normal
yrurs = np.random.normal



pd.concat
plt.xlim

接下来,咱们能够输入相关系数,, 和协整测验

正如咱们所看到的,序列 X 和 Y 之间存在十分强的相关性。然而,咱们协整测验的 p 值产生了 0.7092,这意味着工夫序列 X 和 Y 之间没有协整。

这种状况的另一个例子是正态分布系列和方波。

Y2 = pd.Series



plt.figure
Y2.plot()

# 相关性简直为零

prinr(pvle))

只管相关性非常低,但 p 值表明这些工夫序列是协整的。

import fix_yaance as yf
yf.pdrde

交易中的数据迷信

在开始之前,我将首先定义一个函数,该函数能够应用咱们曾经涵盖的概念轻松找到协整对。

def fitirs(data):
    n = data.shape
    srmaix = np.zeros
    pvl_mrix = np.ones
    keys = dta.keys 
    for i in range(n):
        for j in range:
          
            reut = coint 
            sr = ret[0]
            paue = rsult[1]
            soeix[i, j] = score
            pu_trix[i, j] = palue
            if palue < 0.05:
                pairs.append
    return soe_mati, prs

咱们正在查看一组科技公司,看看它们中是否有任何一家是协整的。咱们将首先定义咱们想要查看的证券列表。而后咱们将取得 2013 – 2018 年每个证券的定价数据..

如前所述,咱们曾经制订了一个经济假如,即科技行业内的证券子集之间存在某种分割,咱们想测试是否存在任何协整对。与搜寻数百种证券相比,这产生的多重比拟偏差要小得多,而比为单个测试造成假如的状况略多。

start = datetime.datetime
end = datetime.datetime




df = pdr(tcrs, strt, nd)['Close']
df.tail()

# 热图显示每对之间的协整测验的 p 值股票。只显示热图上对角线上的值
分数、seaborn.heatmap

咱们的算法列出了两个协整对:AAPL/EBAY 和 ABDE/MSFT。咱们能够剖析他们的模式。

coit
pvalue

如咱们所见,p 值小于 0.05,这意味着 ADBE 和 MSFT 的确是协整对。

计算价差

当初咱们能够绘制这两个工夫序列的价差。为了理论计算价差,咱们应用线性回归来取得咱们两个证券之间的线性组合的系数,正如之前提到的恩格尔 - 格兰杰办法。

results.params

sed = S2 - b * S1
sedplot
plt.axhline
plt.xlim
plt.legend

或者,咱们能够查看两个工夫序列之间的比率

rio
rao.plot
plt.axhline
plt.xlim
plt.legend

无论咱们是应用价差法还是比率法,咱们都能够看到咱们的第一个图对 ADBE/SYMC 偏向于围绕均值挪动。咱们当初须要标准化这个比率,因为相对比率可能不是剖析这种趋势的最现实形式。为此,咱们须要应用 z 分数。

z 分数是数据点与平均值的规范差数。更重要的是,高于或低于总体平均值的标准差的数量来自原始分数。z-score 的计算方法如下:

def zscr:
    return (sres - ees.mean) / np.std


zscr.plot
plt.axhline
plt.axhline
plt.axhline
plt.xlim
plt.show

通过将另外两条线搁置在 z 分数 1 和 -1 处,咱们能够分明地看到,在大多数状况下,与平均值的任何大背离最终都会收敛。这正是咱们想要的配对交易策略。

交易信号

在进行任何类型的交易策略时,明确定义和形容理论进行交易的工夫点总是很重要的。例如,我须要交易特定股票的最佳指标是什么?

设置规定

咱们将应用咱们创立的比率工夫序列来查看它是否通知咱们是在特定工夫买入还是卖出。咱们将首先创立一个预测变量 . 如果比率为正,则示意“买入”,否则示意卖出。预测模型如下:

配对交易信号的益处在于,咱们不须要晓得价格将走向的相对信息,咱们只须要晓得它的走向:上涨或上涨。

训练测试拆分

在训练和测试模型时,通常会有 70/30 或 80/20 的宰割。咱们只应用了 252 个点的工夫序列(这是一年中的交易天数)。在训练和拆分数据之前,咱们将在每个工夫序列中增加更少数据点。

ratios = df['ADBE'] / df['MSFT'] 
print(len(ratios) * .70 )

tran = ratos[:881]
tet = rats[881:]

特色工程

咱们须要找出哪些特色在确定比率挪动的方向上实际上很重要。晓得比率最终总是会复原到均值,兴许与均值相干的挪动平均线和指标将很重要。

让咱们尝试:

  • 60 天挪动平均线
  • 5 天挪动平均线
  • 60 天标准差
  • z 分数
train.rolg
zcoe_5 = (ra_ag5 - rasag60)/
plt.figure
plt.plot
plt.legend
plt.ylabel
plt.show

plt.figure
z5.plot()
plt.xlim
plt.axhline
plt.legend
plt.show

创立模型

规范正态分布的均值为 0,标准差为 1。从图中能够看出,很显著,如果工夫序列超出均值 1 个标准差,则趋向于复原到均值。应用这些模型,咱们能够创立以下交易信号:

  • 每当 z-score 低于 -1 时,买入(1),这意味着咱们预计比率会减少。
  • 每当 z 得分高于 1 时,卖出(-1),这意味着咱们预计比率会降落。

训练优化

咱们能够在理论数据上应用咱们的模型

train.plot()
buy 
sell
buy[z>-1] = 0
sell[z5<1] = 0
buy[160:].plot
sell[160:].plot

plt.figure


# 当您买入比率时,您买入股票 S1 并卖出 S2

sell[buy!=0] = S[uy!=0]

# 当您卖出比率时,您卖出股票 S1 并买入 S2

sell[sll!=0] = S1[sll!=0]

BuR[60:].plot
selR[60:].plot

当初咱们能够分明地看到咱们应该何时买入或卖出相应的股票。

当初,咱们能够冀望从这个策略中取得多少收益?

# 应用简略的 strydef 进行交易:# 如果窗口长度为 0,算法没有意义,退出
   
    
    # 计算滚动平均值和滚动标准差
    比率 = S1/S2
    a1 = rais.rolng
    zscoe = (ma1 - ma2)/std
    
    # 模仿交易

    # 对于范畴内的 i(len(ratios)):# 如果 z-score > 1,则卖空
      
            mey += S1[i] - S2[i] * rts[i]
         
            cutS2 += raos[i]
          
        # 如果 z-score < -1,则买入多头
        ef zoe[i] > 1:
            mey  -= S1[i] - S2[i] * rtos[i]
    
        # 如果 z-score 介于 -.5 和 .5 之间,则革除
        elif abs(zcre[i]) < 0.75:mey  += S1[i] * ctS + S2[i] * oS2
trad

对于从策略制订的策略来说,这是一个不错的利润。

改良的畛域和进一步的步骤

这绝不是一个完满的策略,咱们策略的施行也不是最好的。然而,有几件事能够改良。

  1. 应用更多的证券和更多样化的工夫范畴

对于配对交易策略的协整测试,我只应用了多数股票。天然地(并且在实践中)在行业内应用集群会更无效。我只用了只有 5 年的工夫范畴,这可能不能代表股市的稳定。

  1. 解决过拟合

任何与数据分析和训练模型相干的事件都与过拟合问题有很大关系。有许多不同的办法能够解决像验证这样的过拟合,例如卡尔曼滤波器和其余统计办法。

  1. 调整交易信号

咱们的交易算法没有思考到互相重叠和穿插的股票价格。思考到该代码仅依据其比率要求买入或卖出,它并未思考实际上哪个股票更高或更低。

  1. 更高级的办法

这只是算法对交易的冰山一角。这很简略,因为它只解决挪动平均线和比率。如果您想应用更简单的统计数据,请应用。其余简单示例包含 Hurst 指数、半衰期均值回归和卡尔曼滤波器等主题。


本文摘选 Python 配对交易策略 Pairs Trading 统计套利量化交易剖析股票市场 ,点击“ 浏览原文”获取全文残缺材料。


点击题目查阅往期内容

R 语言资产配置策略量化模型:改良的挪动平均线策略动静回测
R 语言量化:合成稳定率指数挪动均匀策略剖析规范普尔 500 稳定率指数 (VIX)
R 语言改良的股票配对交易策略剖析 SPY-TLT 组合和中国股市投资组合
R 语言量化交易 RSI 策略:应用反对向量机 SVM
应用 R 语言对 S&P500 股票指数进行 ARIMA + GARCH 交易策略
R 语言量化交易 RSI 策略:应用反对向量机 SVM
R 语言资产配置: 季度战术资产配置策略钻研
R 语言动量交易策略剖析调整后的数据
TMA 三均线股票期货高频交易策略的 R 语言实现
R 语言工夫序列:ARIMA / GARCH 模型的交易策略在外汇市场预测利用
R 语言基于 Garch 稳定率预测的区制转移交易策略
r 语言多均线股票价格量化策略回测
应用 R 语言对 S&P500 股票指数进行 ARIMA + GARCH 交易策略
Python 基于粒子群优化的投资组合优化钻研
R 语言 Fama-French 三因子模型理论利用:优化投资组合
R 语言动量和马科维茨 Markowitz 投资组合 (Portfolio) 模型实现
Python 计算股票投资组合的危险价值(VaR)
R 语言 Markowitz 马克维茨投资组合实践剖析和可视化
R 语言中的狭义线性模型(GLM)和狭义相加模型(GAM):多元(平滑)回归剖析保险资金投资组合信用风险敞口

正文完
 0