配对交易策略
前面学习了均值回归,动量等三种量化交易策略,今天继续学习配对交易策略,具体代码如下所示:
import pandas as pd
import numpy as np
import tushare as ts
import seaborn
%matplotlib inline
from matplotlib import pyplot as plt
stocks_pair = ['600199', '600702']
1. 数据准备 & 回测准备
data1 = ts.get_k_data('600199', '2013-06-01', '2014-12-31')[['date','close']]
data2 = ts.get_k_data('600702', '2013-06-01', '2014-12-31')['close']
data = pd.concat([data1, data2], axis=1) #拼接,把两张表格的数据拼接起来;
data.set_index('date',inplace = True)
data.columns = stocks_pair
data.plot(figsize= (8,6))
2. 策略开发思路
data['priceDelta']=data['600199']-data['600702']
data['priceDelta'].plot(figsize= (8,6))
plt.ylabel('Spread')
plt.axhline(data['priceDelta'].mean())
data['zscore'] = (data['priceDelta'] - np.mean(data['priceDelta']))/np.std(data['priceDelta']) #价差的标准化;
data[data['zscore'] < - 1.5].head()
len(data[data['zscore'] < - 1.5])
data['position_1'] = np.where(data['zscore'] > 1.5, -1, np.nan)
data['position_1'] = np.where(data['zscore'] < -1.5, 1, data['position_1'])
data['position_1'] = np.where(abs(data['zscore']) < 0.5, 0, data['position_1'])
产生交易信号
data['position_1'] = data['position_1'].fillna(method = 'ffill')
data['position_1'].plot(ylim=[-1.1, 1.1], figsize=(10, 6))
data['position_2'] = -np.sign(data['position_1'])
data['position_2'].plot(ylim=[-1.1, 1.1], figsize=(10, 6))
3. 计算策略年化收益并可视化
data['returns_1'] = np.log(data['600199'] / data['600199'].shift(1))
data['returns_2'] = np.log(data['600702'] / data['600702'].shift(1))
data['strategy'] = 0.5*(data['position_1'].shift(1) * data['returns_1'])+0.5*(data['position_2'].shift(1) * data['returns_2'])
data[['returns_1','returns_2','strategy']].dropna().cumsum().apply(np.exp).plot(figsize=(10, 6))