同花顺Supermind量化交易 经典量化策略基础-配对交易策略

201 阅读3分钟

我们的基础策略教程教授配对交易策略策略。接下来我们将为大家展示相应策略的策略逻辑,策略信号以及策略表现等。

配对交易策略(pair trading)

1. 数据获取:选取金种子酒(600199.SH)和舍得酒业(600702.SH)作为股票标的进行研究

In [18]:

stocks_pair = ['600199.SH', '600702.SH']
data4=get_price(stocks_pair, '20130103', '20170103', '1d', ['close'],is_panel=1)
data4=data4['close']
data4.plot(figsize=(10,8))

Out[18]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f35d0175080>

2. 策略逻辑

In [19]:

data4.head()

Out[19]:

600199.SH600702.SH
2013-01-0418.8028.25
2013-01-0718.6627.91
2013-01-0819.4429.33
2013-01-0920.0030.20
2013-01-1019.7930.09

2.1 取价差,并对价差进行标准化

In [20]:

data4['pricedelta']=data4['600199.SH']-data4['600702.SH']
data4['after_zscore']=(data4['pricedelta']-data4['pricedelta'].mean())/np.std(data4['pricedelta'])

In [21]:

data4.head()

Out[21]:

600199.SH600702.SHpricedeltaafter_zscore
2013-01-0418.8028.25-9.45-0.492517
2013-01-0718.6627.91-9.25-0.442815
2013-01-0819.4429.33-9.89-0.601860
2013-01-0920.0030.20-10.20-0.678898
2013-01-1019.7930.09-10.30-0.703748

In [23]:

threshold=1.5
len(data4[data4['after_zscore'] < - threshold])

Out[23]:

84

2.2 策略逻辑:
当标准化后的价差大于阀门,则600199做空
当标准化后的价差小于负的阀门,则600199做多
当标准化后的价差在半个阀门范围内则平仓

In [27]:

data4['position_600199'] = np.where(data4['after_zscore'] > threshold, -1, np.nan)
data4['position_600199'] = np.where(data4['after_zscore'] < -threshold, 1, data4['position_600199'])
data4['position_600199'] = np.where(abs(data4['after_zscore']) < threshold/2, 0, data4['position_600199'])
data4['position_600199'] = data4['position_600199'].fillna(method = 'ffill')

In [29]:

data4.tail()

Out[29]:

600199.SH600702.SHpricedeltaafter_zscoreposition_600199
2016-12-279.0622.40-13.34-1.4592131.0
2016-12-288.9822.34-13.36-1.4641831.0
2016-12-299.0022.40-13.40-1.4741241.0
2016-12-309.1822.60-13.42-1.4790941.0
2017-01-039.2122.57-13.36-1.4641831.0

2.3 其中600702的信号与600199的信号相反

In [31]:

data4['position_600702']=-data4['position_600199']
data4.tail()

Out[31]:

600199.SH600702.SHpricedeltaafter_zscoreposition_600199position_600702
2016-12-279.0622.40-13.34-1.4592131.0-1.0
2016-12-288.9822.34-13.36-1.4641831.0-1.0
2016-12-299.0022.40-13.40-1.4741241.0-1.0
2016-12-309.1822.60-13.42-1.4790941.0-1.0
2017-01-039.2122.57-13.36-1.4641831.0-1.0

3.策略信号

In [34]:

data4[['position_600702','position_600199']].plot(ylim=[-1.1, 1.1], figsize=(10, 6))

Out[34]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f35d031c3c8>

4.策略展示

data4['return_600199']=np.log(data4['600199.SH']/data4['600199.SH'].shift(1)) data4['return_600702']=np.log(data4['600702.SH']/data4['600702.SH'].shift(1)) data4.head()

In [37]:

data4['strategy']=0.5*(data4['position_600199'].shift(1)*data4['return_600199'])+\
                  0.5*(data4['position_600702'].shift(1)*data4['return_600702'])

In [42]:

data4[['return_600199','return_600702','strategy']].cumsum().apply(np.exp).plot(figsize=(12, 8))

Out[42]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f35ca819518>

查看以上策略详情请到supermind量化交易官网查看:同花顺Supermind量化交易 经典量化策略基础-配对交易策略