量化投资 — 配对交易策略 (Pair Trading)

配对交易策略 Pair Trading

0. 引库

import pandas as pd
import numpy as np
import tushare as ts
import seaborn
from matplotlib import pyplot as plt
plt.style.use('seaborn')
%matplotlib inline
data = pd.read_csv('pair-trade-data.csv')
data.set_index('date',inplace = True)
data.head()
000568 000858
date
2010/1/4 27.488118 26.117536
2010/1/5 27.335123 26.391583
2010/1/6 26.941707 25.694008
2010/1/7 26.388011 24.913389
2010/1/8 26.825140 24.863562
data.plot(figsize=(8, 6));

在这里插入图片描述

2. 策略开发思路

# 价差是回归的(不科学想法)
data['priceDelta'] = data['000568'] - data['000858']
data.head()
000568 000858 priceDelta
date
2010/1/4 27.488118 26.117536 1.370582
2010/1/5 27.335123 26.391583 0.943540
2010/1/6 26.941707 25.694008 1.247699
2010/1/7 26.388011 24.913389 1.474622
2010/1/8 26.825140 24.863562 1.961578
# 图示价差及其均值
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.head()
000568 000858 priceDelta zscore
date
2010/1/4 27.488118 26.117536 1.370582 0.569895
2010/1/5 27.335123 26.391583 0.943540 0.500520
2010/1/6 26.941707 25.694008 1.247699 0.549932
2010/1/7 26.388011 24.913389 1.474622 0.586796
2010/1/8 26.825140 24.863562 1.961578 0.665903
len(data[data['zscore'] > 1.5])
17
# 'position_1'是000568开平仓信号
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.head()
000568 000858 priceDelta zscore position_1
date
2010/1/4 27.488118 26.117536 1.370582 0.569895 NaN
2010/1/5 27.335123 26.391583 0.943540 0.500520 NaN
2010/1/6 26.941707 25.694008 1.247699 0.549932 NaN
2010/1/7 26.388011 24.913389 1.474622 0.586796 NaN
2010/1/8 26.825140 24.863562 1.961578 0.665903 NaN
产生交易信号
data['position_1'] = data['position_1'].ffill().fillna(0)
data['position_1'].plot(ylim=[-1.1, 1.1], figsize=(10, 6));

在这里插入图片描述

# 'position_2'是000858开平仓信号(与000568符号相反)
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['000568'] / data['000568'].shift(1))).fillna(0)
data
  • 10
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值