2.1.1 配对交易:基于距离的配对选择(1)

配对交易:基于距离的配对选择(1)


系列文章

1 概述
2.1.1 基于距离的配对选择(1)
2.2.1 基于协整的配对选择(1)

github仓库地址:https://github.com/financialnoob/pairs_trading


在前一篇文章中,我描述了配对交易策略的基本原则。现在,我想探讨一种最著名的配对选择方法,即距离方法。它在论文《配对交易:相对价值套利规则的表现》(Gatev等人,2006年)中有所描述。我打算在python中实现这种方法,将其应用于实际股票价格的数据集,并尝试分析其优缺点。

这个想法非常简单:对于每对股票,计算它们的标准化累积收益之间的欧几里得距离,并选择距离最小的股票对进行交易。用于配对选择的时间段被称为形成期。紧接着是交易期,在此期间,我们交易所选的股票对。在论文中,他们使用了12个月的形成期和6个月的交易期。我想测试几种不同长度的形成期:12个月、24个月和36个月。交易期将始终为6个月。

我将使用Vanguard Small Cap Value ETF(VBR)的成分股作为我的股票池。我相信,使用小盘股将使我能够发现更多的潜在交易机会(因为太多人交易大盘高流动性股票,因此市场更加拥挤,所以交易机会较少)。

第一步是获取数据。为了进行我想要的测试,我需要36+6=42个月的数据。我将使用2016年7月1日至2019年12月31日的时间段。在撰写本文时,VBR包含967家公司的股份。我打算只选择那些满足以下条件的公司:

  • 在整个时间段内,Yahoo Finance上有可用的数据;
  • 每个交易日的交易量大于1000。

应用上述规则后,我们剩下727支股票,这使得潜在的配对数量为727*726/2 = 263901对。下面是我用来下载数据的代码(或者你可以从这里以csv格式直接下载)。注意:我使用复权过后的价格来考虑任何公司行动。

import yfinance as yf
import pandas as pd

symbols = ['IEX', 'VICI', 'NUAN', 'MOH', 'NVAX', 'SBNY', 'PWR', 'WSM', 'FANG', 'BRO', 'STLD', 'ALLE', 'PNR', 'ATO', 'KIM', 
           'APO', 'JLL', 'HWM', 'WTRG', 'MPW', 'ARES', 'TPR', 'LPLA', 'BAH', 'RHI', 'BLDR', 'CSL', 'MOS', 'GLPI', 'RPM', 
           'CLF', 'IVZ', 'EWBC', 'CMA', 'AIZ', 'BG', 'TRGP', 'SCI', 'DVN', 'AFG', 'OC', 'LAD', 'NWL', 'UGI', 'CG', 'UTHR', 
           'ACM', 'NCLH', 'LSI', 'RS', 'ON', 'ZION', 'FRT', 'ST', 'DXC', 'SEE', 'MRO', 'FHN', 'KSS', 'ARW', 'FSLR', 'ATR', 
           'OGN', 'CPRI', 'DCI', 'LB', 'NNN', 'ATH', 'LECO', 'DKS', 'AGCO', 'JBL', 'ITT', 'HII', 'THC', 'AIRC', 'GXO', 
           'OHI', 'VOYA', 'RGA', 'AA', 'OSK', 'MRTX', 'EHC', 'TTEK', 'RNR', 'BJ', 'KNX', 'NLSN', 'VNO', 'JAZZ', 'BC', 'ORI', 
           'GPS', 'TOL', 'JHG', 'PVH', 'AN', 'MAT', 'CBSH', 'APA', 'FAF', 'IPG', 'FR', 'CNXC', 'EGP', 'NYT', 'ALK', 'OLN', 
           'OVV', 'OGE', 'STWD', 'PBCT', 'M', 'PII', 'BRX', 'LDOS', 'RXN', 'SF', 'NVST', 'JEF', 'USFD', 'AXTA', 'PFGC', 'AMG', 
           'SYNA', 'EME', 'MAN', 'XEC', 'AYI', 'SON', 'CFR', 'HBI', 'X', 'LPX', 'GME', 'MDU', 'FFIN', 'AAL', 'SRCL', 'LNC', 
           'PB', 'VNT', 'LEG', 'BPOP', 'SMG', 'CFX', 'DAR', 'SNV', 'HOG', 'RBC', 'FFIV', 'VAC', 'CACI', 'SLM', 'PRI', 'THO', 
           'ACHC', 'PACB', 'DECK', 'WCC', 'FL', 'HELE', 'UHAL', 'GPK', 'VER', 'BBIO', 'NVT', 'MSA', 'CUZ', 'OMF', 'TDC', 
           'HUBB', 'NRG', 'INGR', 'NCR', 'VSCO', 'CC', 'ASH', 'MHK', 'KBR', 'DEI', 'CIT', 'PRGO', 'CHK', 'VVV', 'HLF', 'NYCB',
           'CHNG', 'TMX', 'IRDM', 'IDA', 'EQT', 'VLY', 'VMI', 'HUN', 'SNX', 'OZK', 'MTG', 'NOV', 'FCNCA', 'RYN', 'MTZ', 
           'MIDD', 'GBCI', 'ADC', 'LAZ', 'FLS', 'CR', 'TKR', 'SIGI', 'CW', 'PACW', 'LAMR', 'UNM', 'SAIC', 'SSB', 'CF', 'EVR', 
           'SLG', 'NRZ', 'HRC', 'CRUS', 'LEA', 'JBLU', 'FCN', 'ESI', 'AVNT', 'HIW', 'JNPR', 'WTS', 'HFC', 'UBSI', 'RLI', 
           'HRB', 'REZI', 'GRA', 'POR', 'FLO', 'AEO', 'BXMT', 'WBS', 'THG', 'WAL', 'RDN', 'HE', 'CAR', 'ARMK', 'BKH', 'GT', 
           'UFPI', 'STL', 'NFG', 'UAA', 'ATKR', 'PNW', 'PINC', 'AL', 'PK', 'UMPQ', 'TAP', 'CRI', 'AGNC', 'WTFC', 'HR', 'PNM', 
           'XPO', 'KMPR', 'BHF', 'UMBF', 'SPR', 'CRNC', 'WEN', 'R', 'ALSN', 'SEIC', 'AVT', 'MTH', 'UNVR', 'HWC', 'CBU', 'UA', 
           'HPP', 'QRTEA', 'MUSA', 'RCII', 'LXP', 'NAVI', 'SIG', 'CMC', 'SUM', 'BKU', 'TGNA', 'AXS', 'BCO', 'SWX', 'OGS', 
           'KFY', 'MC', 'EPR', 'AIMC', 'KBH', 'MSM', 'SEM', 'FNB', 'VIAV', 'TRTN', 'SXT', 'WWD', 'FHB', 'NSIT', 'ENS', 'OUT', 
           'ABG', 'NJR', 'SABR', 'ETRN', 'AGO', 'CIM', 'AR', 'FUL', 'ALE', 'SLGN', 'UNF', 'TRIP', 'XRX', 'SBRA', 'AIT', 
           'TGTX', 'TMHC', 'MATX', 'TCBI', 'APG', 'RRC', 'ARNC', 'FLOW', 'AWR', 'WH', 'BOH', 'TEX', 'DAN', 'VG', 'ADS', 
           'MAC', 'FCFS', 'EVTC', 'ABM', 'EBC', 'HRI', 'PCH', 'WTM', 'HL', 'HOMB', 'SR', 'ITGR', 'GATX', 'COMM', 'NWE', 
           'KEX', 'CNO', 'PRG', 'APAM', 'ISBC', 'JWN', 'WD', 'HAIN', 'FHI', 'OFC', 'DNB', 'SPB', 'MLHR', 'HI', 'APLE', 
           'IOVA', 'MUR', 'KMT', 'SWN', 'EQC', 'CBT', 'CATY', 'ESGR', 'COTY', 'ASB', 'SFNC', 'AM', 'WWW', 'MIC', 'SFM', 
           'MDC', 'AUB', 'BXS', 'VSH', 'MGEE', 'PAG', 'AVA', 'KOD', 'SITC', 'CLR', 'BECN', 'H', 'PBH', 'GPI', 'RPAI', 
           'TPTX', 'RETA', 'TPH', 'KTB', 'SJI', 'BBBY', 'UFS', 'FBP', 'AEL', 'WERN', 'GDOT', 'TRN', 'ENR', 'SPXC', 'RMBS', 
           'PDCO', 'OMI', 'SAVE', 'RL', 'MTX', 'MD', 'CVBF', 'KRTX', 'ONB', 'MYGN', 'PLXS', 'UCBI', 'KW', 'VRNT', 'HP', 
           'COLB', 'NHI', 'FBC', 'FULT', 'CRC', 'BDC', 'CADE', 'SC', 'JELD', 'NUS', 'CWEN', 'EGHT', 'SCL', 'ESNT', 'SHO', 
           'AWI', 'PIPR', 'BRC', 'ACA', 'JW.A', 'AX', 'SANM', 'BOKF', 'EAT', 'TROX', 'MNTV', 'CWK', 'MLI', 'INDB', 'WAFD', 
           'OI', 'IBOC', 'BLMN', 'RLJ', 'BDN', 'HXL', 'GHC', 'FLR', 'TNL', 'SKYW', 'ODP', 'MOG.A', 'CVET', 'HLI', 'IOSP', 
           'EPC', 'B', 'OTTR', 'BCC', 'ATI', 'CMP', 'VRTS', 'HUBG', 'DTM', 'XPER', 'GO', 'FRME', 'ESE', 'IDCC', 'MGLN', 
           'PFSI', 'ANF', 'PDM', 'CAKE', 'REGI', 'AI', 'WSBC', 'FFBC', 'ARI', 'MANT', 'OM', 'WSFS', 'FMBI', 'WRE', 'CNX', 
           'AAWW', 'MFA', 'NMRK', 'KAR', 'UE', 'THS', 'SBH', 'DNLI', 'RIG', 'CORE', 'UNFI', 'HTH', 'TWO', 'TDS', 'MDRX', 
           'RLGY', 'PRGS', 'ROIC', 'SPT', 'KALU', 'GMS', 'DOC', 'TWNK', 'TOWN', 'XHR', 'WOR', 'VGR', 'BGS', 'TTEC', 'AMKR', 
           'SAFM', 'HCSG', 'PSMT', 'URBN', 'INT', 'CXP', 'NTCT', 'CNMD', 'GNW', 'DRH', 'PMT', 'SVC', 'RNST', 'RUSHA', 'BANR', 
           'JBGS', 'SPWR', 'GVA', 'KYMR', 'KN', 'EGBN', 'STAR', 'AKR', 'PRAA', 'CNK', 'LAZR', 'TRMK', 'FROG', 'AMWL', 'ILPT', 
           'SUMO', 'ESRT', 'NPO', 'AAT', 'ARGO', 'BGCP', 'ATGE', 'FUBO', 'FIBK', 'PRK', 'MTOR', 'AVIR', 'FOE', 'LANC', 'BIG', 
           'CENTA', 'HMN', 'ALGM', 'BLKB', 'GWB', 'CBRL', 'MEI', 'OSIS', 'MGRC', 'GOLF', 'LAUR', 'DBRG', 'WIRE', 'MDP', 
           'MCY', 'ANAT', 'CDE', 'LZB', 'SGRY', 'AVYA', 'DLX', 'HOPE', 'GNL', 'CWT', 'CRS', 'ARCB', 'SKT', 'GEF', 'AVNS', 
           'NWBI', 'NWN', 'HNI', 'SDGR', 'RAMP', 'SMCI', 'PFS', 'UIS', 'MCFE', 'CFFN', 'UNIT', 'ECPG', 'CSGS', 'SHOO', 'LC', 
           'WBT', 'MTRN', 'NBTB', 'REYN', 'CLI', 'ASO', 'OXM', 'WABC', 'PEB', 'HSC', 'ALEX', 'CALM', 'TTMI', 'STEM', 'WLK', 
           'CNNE', 'PTEN', 'TRS', 'PRA', 'IHRT', 'RGR', 'PPC', 'LTC', 'BKD', 'CDLX', 'AZZ', 'CSR', 'BRMK', 'ASTE', 'PRVA', 
           'AMCX', 'PRIM', 'FIX', 'ADT', 'SPNT', 'LADR', 'GFF', 'FCF', 'LGF.B', 'OPI', 'KRA', 'TEN', 'CLB', 'BANF', 'GIII', 
           'ALXO', 'AIN', 'BHLB', 'PBI', 'GBX', 'OFG', 'SXI', 'GCP', 'SWM', 'GTES', 'GTY', 'DDS', 'GPRO', 'VSTO', 'AROC', 
           'UVV', 'STBA', 'SNDR', 'CXW', 'FDP', 'CHCO', 'CNDT', 'SCHN', 'KFRC', 'BKE', 'SAFT', 'HCC', 'VREX', 'SCS', 'DK', 
           'AIR', 'SM', 'HURN', 'POLY', 'EIG', 'S', 'MATW', 'BRKL', 'NNI', 'SATS', 'DY', 'ARCH', 'KAMN', 'MAXR', 'DOCS', 
           'RPT', 'CWEN.A', 'HEES', 'APOG', 'SKIN', 'SAH', 'MGY', 'NTGR', 'AIV', 'FSR', 'TMP', 'MPLN', 'ADTN', 'PBF', 'SEB', 
           'HA', 'TVTY', 'TBI', 'RYAN', 'AXL', 'MDGL', 'AFIN', 'BJRI', 'GES', 'RAD', 'JAMF', 'CCO', 'WMK', 'STEP', 'BHE', 
           'BRSP', 'NHC', 'ANDE', 'SCSC', 'AAN', 'GEO', 'DHC', 'DBI', 'HTLF', 'STFC', 'IVR', 'ZUMZ', 'VIVO', 'BFLY', 'ACCO', 
           'TILE', 'DNOW', 'WRLD', 'KREF', 'CARS', 'NXGN', 'CHPT', 'WETF', 'NX', 'CERE', 'CLBK', 'ARR', 'LGF.A', 'WNC', 
           'EPAC', 'BCOR', 'NFBK', 'SBGI', 'TRTX', 'ETWO', 'AXSM', 'CIR', 'OPK', 'ELF', 'RMR', 'PQG', 'GLT', 'RWT', 'AERI', 
           'BTRS', 'ADV', 'NWLI', 'CPF', 'LRN', 'DIN', 'PUMP', 'AMRX', 'KOP', 'KELYA', 'PWSC', 'NUVB', 'AMBC', 'BV', 'CFLT', 
           'MRC', 'IPAR', 'CMO', 'ZIP', 'DNMR', 'FMTX', 'UFCS', 'SWBI', 'HY', 'PRAX', 'PLCE', 'PCT', 'TPC', 'DM', 'SKLZ', 
           'GRPN', 'MCW', 'WW', 'TGI', 'BFS', 'SCHL', 'CNM', 'REVG', 'OLO', 'AEVA', 'USM', 'GOEV', 'VVNT', 'ENDP', 'TR', 
           'ALVR', 'PAHC', 'STOK', 'OLMA', 'CLOV', 'SQSP', 'OUST', 'FIGS', 'INN', 'FSP', 'HYLN', 'SRG', 'CAL', 'NPK', 'CVI', 
           'GCO', 'VZIO', 'HIMS', 'TASK', 'GEF.B', 'ZGNX', 'CRCT', 'DBD', 'CENT', 'HTLD', 'RXRX', 'RUSHB', 'GPMT', 'TG', 
           'XL', 'RIDE', 'GRC', 'EBIX', 'FOR', 'KNSA', 'AGTI', 'IMVT', 'YOU', 'SWI', 'DUOL', 'LOCO', 'INSW', 'GIC', 'PYCR', 
           'VLDR', 'KRO', 'COOK', 'UBA', 'ADGI', 'DNUT', 'HLX', 'NABL', 'SWIM', 'LFST', 'FA', 'GTHX', 'APPH', 'NGM', 'RES', 
           'PECO', 'LE', 'SBTX', 'ANAB', 'ULCC', 'VIEW', 'HRMY', 'AMK', 'LTCH', 'APEI', 'KNBE', 'AVAH', 'FLYW', 'INTA', 
           'XMTR', 'ERAS', 'RMO', 'TDUP', 'LYEL', 'GCMG', 'MILE', 'NAPA', 'BRDG', 'IAS', 'VERX', 'MLNK', 'CTKB', 'LAW', 
           'WEBR', 'TMCI', 'SEMR', 'HNST', 'DAWN', 'PAY', 'ZY', 'CXM', 'ABSI', 'BDTX', 'DSGN', 'FF', 'OMIC', 'ZETA', 'AC', 
           'OWL', 'BHG', 'UBP', 'LZ', 'LDI', 'INST', 'DV', 'COMP', 'CURV', 'TXG', 'MRVI', 'EVCM', 'WK', 'CHX', 'LPRO', 'PKI', 
           'ALGT', 'PCOR', 'BLND', 'SAGE', 'ALKT', 'SWTX', 'OII', 'HAYW', 'DRQ', 'COUR', 'BPYPM', 'SGYPQ', 'FTBK']

start = '2016-07-01'
end = '2019-12-31'

# create dataframe for storing prices
tmpdf = yf.download(symbols[0], start, end)
prices = pd.DataFrame(index = tmpdf.index)

for symbol in symbols:
    tmpdf = yf.download(symbol, start, end)
    if (tmpdf['Volume'] < 1000).sum() == 0:   # check that volume at any trading day exceeds 1000
        prices[symbol] = tmpdf['Adj Close']
        
# delete all columns with NA values
prices = prices.dropna(axis=1)

# save prices to file
prices.to_csv('vbr16_19.csv')

现在我们需要将价格转换为累计收益,然后我们就可以开始测试了。(文章最后提供了包含源代码的Jupyter笔记本的链接)。

对于每种形成期和交易期的组合,我将选择欧几里得距离最小的前五对股票对。对于这些股票对中的每一对,我将构建一个由两个等额(按分配的资本而不是股票数量计算)仓位组成的投资组合(价差),即在一只股票上建立多头仓位,在另一只股票上建立空头仓位。我将提供在形成期和交易期间价差的图表,以及以下指标:

1.两只股票的累计收益之间的欧几里得距离
2.协整增广型迪基-富勒(CADF)检验p值(如果低→协整)
3.增广迪基-富勒(ADF)检验p值(如果低→平稳)
4.价差的标准偏差
5.价差的零交叉次数
6.赫斯特指数(对于均值回归时间序列应小于0.5)
7.均值回归的半衰期
8.在2个标准差带内的天数百分比(如果在2个标准差带外的时间太多→对太长时间内偏离过大)


12个月的形成期/6个月的交易期

下面你可以看到5对拥有最小欧式距离的图表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正如您所见,尽管所有股票对在形成期都显示出良好的均值回归行为,但在交易期中,它们中的大多数表现出不同的行为。在五对股票中,只有一对(CBSH-NBTB)在交易期看起来或多或少具有均值回归特性。其余四对股票与它们的历史均值偏离太多,且不会回归(至少在6个月的交易期内)。

在这里插入图片描述

前五交易对(12个月形成期)

在上表中,我们可以看到在形成期间所有股票对都展示了很多均值回归的特性:CADF和ADF检验的p值很低,赫斯特指数小于0.5,有很多零交叉。让我们看看交易期间相同的指标。
在这里插入图片描述

前五交易对(6个月交易期)
上表证实了我们在图表上已经看到的情况。大多数股票对不显示均值回归特性。因此,尽管距离方法在样本内选择均值回归对非常有效,但选定的股票对在样本外的行为却大不相同。但如果12个月的形成期不够长呢?如果使用更长的形成期会帮助我们发现具有更稳定长期关系的股票对呢?让我们尝试一下。

24个月的形成期/6个月的交易期

让我们再次先看看图表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在五对股票中,有三对(AGNC-MFA, MTG-ESNT, BANF-STBA)在交易期开始时就已经远离历史均值。在六个月的交易期间,它们没有回归到均值。如果我们在交易期开始时开仓这些价差,我们将不得不以亏损关闭它们。其他两对股票与均值的偏离没有那么大,但它们也没有提供很多交易机会。让我们看看指标。

在这里插入图片描述

前五对股票(24个月形成期)

在这里插入图片描述

前五对股票(6个月交易期)

与之前的结果相比,没有大的改善。如果我们将形成期增加到36个月呢?


36个月的形成期/6个月的交易期

图表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再次出现了类似的情况。三对股票偏离太多(尽管其中一对在交易期结束时似乎回归到了均值)。另外两对股票没有提供很多交易机会。


总结

似乎不可能使用配对选择的距离方法进行盈利交易。至少在这种实现和这个数据集中是这样。它在样本内很好地选择了均值回归的股票对,但是大部分选定的股票对在交易期(样本外)期间发散。

在不同的在线资源中描述了可能的改进,推荐用于配对选择的额外条件,例如:

  • 选择零交叉次数最多的股票对
  • 仅选择协整的股票对
  • 选择价差波动性高的股票对
  • 仅选择赫斯特指数小于0.5的股票对
  • 选择均值回归半衰期足够低的股票对

但如果我们看看形成期(样本内)顶级股票对的指标,我们可以看到对于大多数选定的股票对,这些条件已经得到满足。因此,引入这些条件不太可能有所帮助。无论如何,我可能会尝试测试它,并在另一篇文章中描述结果。

另一个想法是使用更长的交易期。如果发散的股票对确实回归到它们的历史均值,只是需要超过6个月的时间呢?这是可能的,但这并没有帮助。这样的股票对将具有长的均值回归半衰期,并且不会提供足够的交易机会。此外,我们持有股票对投资组合的时间越长,它们永远不会回归的可能性就越大(例如当公司的风险档案改变时)。我们对具有短均值回归半衰期并提供许多交易机会的股票对感兴趣,因此增加交易期不会有所帮助。

还有一个潜在的改进(我认为是最有前景的):使用更高频率的数据。由于配对交易策略非常著名,任何出现的交易机会可能不会持续很长时间。如果我能找到高频数据,我将测试它并在另一篇文章中报告结果。

其他潜在的改进与我的测试方法有关。我没有对使用不同形成期长度选出的股票对进行任何定量比较。可能现在这不是很重要,但在某个时刻,我们将不得不比较不同的配对选择技术,并决定哪一种是最好的。当然,可以简单地回测所有可能的配对选择技术与所有可能的策略和参数的组合,但这将大大增加回测过拟合的概率。我认为应该可以设计用于定量比较的统计测试。我将研究这个问题,并写另一篇关于它的文章。


源码jupyter notebook请点击这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值