配对交易的步骤
1. 如何挑选进行配对的股票
2. 挑选好股票对以后,如何制定交易策略,开仓点如何设计
3. 开仓是,两只股票如何进行多空仓对比
股票对的选择
1. 行业内匹配
2. 产业链配对
3. 财务管理配对
最小距离法
配对交易需要对股票价格进行标准化处理。假设 P t i ( t = 0 , 1 , 2 , . . . , T ) P_t^i(t=0,1,2,...,T) Pti(t=0,1,2,...,T)表示股票i在第t天的价格,那么股票i在第t天的单期收益率可以表达为:
r t i = P t i − P t − 1 i P t − 1 i , t = 1 , 2 , 3 , . . . , T r_t^i=\frac{P_t^i-P_{t-1}^{i}}{P_{t-1}^{i}},t=1,2,3,...,T rti=Pt−1iPti−Pt−1i,t=1,2,3,...,T
用 p ^ t i \hat{p}_t^i p^ti 表示股票i在第t天的标准化价格,学界和业界认为 p ^ t i \hat{p}_t^i p^ti可以有这t天内的累计收益率来计算:
p ^ t i = ∏ τ = 1 t ( 1 + r τ i ) \hat{p}^i_t=\prod_{\tau=1}^t (1+r_\tau^i) p^ti=∏τ=1t(1+rτi)
假设有股票X,Y,则我们可以计算二者之间的标准化价差之平方和 S S D X , Y SSD_{X,Y} SSDX,Y
S S D X , Y = ∑ t = 1 T ( p ^ t X − p ^ t Y ) 2 \\ SSD_{X,Y}=\sum_{t=1}^T (\hat{p}_t^X-\hat{p}_t^Y)^2 SSDX,Y=∑t=1T(p^tX−p^tY)2
下面使用python计算SSD
import pandas as pd
sh=pd.read_csv('sh50p.csv',index_col='Trddt')
sh.index=pd.to_datetime(sh.index)
sh.head()
600000 | 600010 | 600015 | 600016 | 600018 | 600028 | 600030 | 600036 | 600048 | 600050 | ... | 601688 | 601766 | 601800 | 601818 | 601857 | 601901 | 601985 | 601988 | 601989 | 601998 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Trddt | |||||||||||||||||||||
2010-01-04 | 9.997 | 2.260 | 6.541 | 4.627 | 4.775 | 8.445 | 17.927 | 13.174 | 6.443 | 6.703 | ... | - | 4.991 | - | - | 11.284 | - | - | 3.055 | 4.591 | 6.498 |
2010-01-05 | 10.072 | 2.250 | 6.706 | 4.708 | 4.783 | 8.494 | 18.804 | 13.188 | 6.243 | 6.937 | ... | - | 4.982 | - | - | 11.499 | - | - | 3.090 | 4.573 | 6.578 |
2010-01-06 | 9.874 | 2.255 | 6.461 | 4.615 | 4.733 | 8.311 | 18.586 | 12.913 | 6.237 | 6.787 | ... | - | 4.947 | - | - | 11.342 | - | - | 3.055 | 4.627 | 6.393 |
2010-01-07 | 9.652 | 2.201 | 6.328 | 4.493 | 4.602 | 8.091 | 18.133 | 12.578 | 6.240 | 6.590 | ... | - | 4.875 | - | - | 11.267 | - | - | 2.998 | 4.573 | 6.176 |
2010-01-08 | 9.761 | 2.211 | 6.370 | 4.539 | 4.618 | 8.005 | 18.483 | 12.578 | 6.322 | 6.674 | ... | - | 4.902 | - | - | 11.135 | - | - | 3.012 | 4.525 | 6.232 |
5 rows × 50 columns
# 定义配对形成期
formStart='2014-01-01'
formEnd='2015-01-01'
# 形成期数据
shform=sh[formStart:formEnd]
shform.head(2)
600000 | 600010 | 600015 | 600016 | 600018 | 600028 | 600030 | 600036 | 600048 | 600050 | ... | 601688 | 601766 | 601800 | 601818 | 601857 | 601901 | 601985 | 601988 | 601989 | 601998 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Trddt | |||||||||||||||||||||
2014-01-02 | 8.307 | 2.360 | 6.371 | 6.183 | 5.031 | 4.117 | 12.288 | 9.719 | 5.156 | 3.146 | ... | 8.534 | 4.869 | 3.781 | 2.383 | 7.245 | 5.91 | - | 2.333 | 5.617 | 3.634 |
2014-01-03 | 8.138 | 2.594 | 6.187 | 6.087 | 4.906 | 4.043 | 11.937 | 9.520 | 5.112 | 3.088 | ... | 8.293 | 4.791 | 3.725 | 2.356 | 7.217 | 5.91 | - | 2.289 | 5.517 | 3.578 |
2 rows × 50 columns
# 提取中国银行 601988 的收盘价数据
PAf=shform['601988']
# 提取浦发银行 600000 的收盘价数据
PBf = shform['600000']
#合并两只股票
pairf=pd.concat([PAf,PBf],axis=1)
len