700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 金融量化 — 配对交易策略 (Pair Trading)

金融量化 — 配对交易策略 (Pair Trading)

时间:2018-12-29 16:49:39

相关推荐

金融量化 — 配对交易策略 (Pair Trading)

1. 配对交易策略

1.1、引言

在量化投资领域,既然严格的无风险套利机会少、收益率微薄,实际的执行过程中也不能完全消除风险。那么如果有一种选择,能够稍微放松100%无风险的要求,比如允许有5%的风险,但同时却能够让套利机会增加100%以上,那岂不是一个更好的选择?今天,我们就来介绍这样一种方法——配对交易。

1.2、统计套利

1.2.1 定义

统计套利即主要以对历史数据进行统计分析为基础,估计目标统计量的分布,再结合股票自身基本面数据来指导套利交易。

1.2.2 评价

统计套利相对于无风险套利,它增加了一些风险,但也伴随着诱人的风险溢价,即获得更多套利机会。不过它一个本质上的局限来自于使用的历史数据,其只能反映过去的信息,用之预测未来有时难以讲得通。

1.2.3 例子

统计套利的原理其实用下面这张图就可以解释:

老头小狗走路时随机的,但老头和小狗的中间距离是0到绳子的长度, 具备稳定性

我们现在把这个场景应用到市场上,以股票为例:

股票A、B: 价格——Random Walk;

股票A和B的差价(或者其他的 Linear combination 的时间序列)——具备稳定性。

假设我们现在找到了这样一个股票 A 和 B 的序列,他们的差价,经过统计学的 Cointegration test 证明具备稳定性(如 Adfuller test),我们计算出该时间序列的 mean 和 std , 就可以设定一个稳定阀域,在偏离的时候买入/卖出,等到回归到稳定阀域再平仓。

举例,过去6个月内,A 股票和 B 股票的价差序列为平稳序列,均值为 10,标准差为 2,我们设定阀域为1.5个标准差,那么平稳区间就是 7-13 。

当 A-B > 13 时,我们买入 B , 卖出 A;

当 A-B < 7 时,我们买入 A , 卖出 B 。

等到回归到平稳区间平仓。

1.3 股票配对交易

1.3.1 定义

股票配对交易是统计套利的主要内容之一,它旨在寻找市场上历史走势相似的股票进行配对,当价格差较大(高于历史均值)时高卖低买进行套利。

1.3.2 主要方法

i.距离法

定 义:距离法使用一个回溯时间区间,标准化价格。然后在 2 范数下计算 n 只股票两两间的配对距离(SSD)。以 SSD 值最小的前 20 对作为标的,在后续 6 个月内以 2 倍标准差作为阈值进行统计套利,距离回到均值时平仓。6 个月后更新标的继续套利。

评 价:标的选择标准中蕴含着其无法最大化利润,因每对的收益与其价差(SSD)成正比;此外高相关性不代表协整,从而均值回复得不到保证。

改 进:(a) 只在同一行业内选择标的;

(b)使用 Pearson 相关系数度量期内相关性。

ii.协整法

前 提: 不平稳的经济时间序列的线性组合可能实现平稳。

Engle-Granger 法: 用对数价格进行 OLS 回归,对残差进行 ADF 检验,其中误差修正模型为 Johansen

方法。若验证了协整关系,即可说明股价 A,B之间存在长期均衡关系,从而残差序列是均值回复的。

评 价:模型太单一,标的仅为两种股票,时限仅限于 2 年之内,单笔收益最大化不保证整体收益最大化。

改 进:先进行距离筛选后再做协整。

iii.时间序列法

定 义:假定价差为具有均值回归特性的马尔科夫链,伴随着高斯噪声。

评 价: 该方法优越性在于抓住了配对交易的核心—均值回复性;其次该模型是连续的,因而可以用于预测;最后,该模型易处理,可通过卡尔曼滤波方法得到最小

MSE 参数估计。

不过,价差应使用价格的自然对数差来避免量纲不同的影响;模型条件苛求收益平价,这实际很难达到;金融资产数据现实中并不满足Ornstein-Uhlenbeck

过程。

2. python 实现

Pair trading 策略 - 考虑时间序列平稳性

2.1 数据准备 & 回测准备

import pandas as pdimport numpy as npimport tushare as tsimport seabornfrom matplotlib import pyplot as pltplt.style.use('seaborn')%matplotlib inline

data1 = ts.get_k_data('600199', '-06-01', '-12-31')[['date','close']]data2 = ts.get_k_data('600702', '-06-01', '-12-31')['close']data.set_index('date',inplace = True)data.columns = stocks_pairdata.head()

data3.plot(figsize=(8,6));

2.2 策略开发思路

data3.corr() # 协方差矩阵

# 可视化看相关关系plt.figure(figsize =(10,8))plt.title('Stock Correlation')plt.plot(data['000568'], data['000858'], '.');plt.xlabel('000568')plt.ylabel('000858')data.dropna(inplace = True)

[slope, intercept] = np.polyfit(data.iloc[:,0], data.iloc[:,1], 1).round(2) # 斜率和截距 slope,intercept

data['spread'] = data.iloc[:,1] - (data.iloc[:,0]*slope + intercept)

data.head()

data['zscore'] = (data['spread'] - data['spread'].mean())/data['spread'].std()

data3['zscore'].plot(figsize = (10,8),title = 'Z-score')plt.axhline(1.5)plt.axhline(0)plt.axhline(-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),title = 'Trading Signal_Uptrade')

data['position_2'] = -np.sign(data['position_1'])data['position_2'].plot(ylim=[-1.1, 1.1], figsize=(10, 6),title = 'Trading Signal_Downtrade')

2.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, 8),title = 'Strategy_Backtesting')

# 计算年化收益率data3[['returns_1','returns_2','strategy']].dropna().mean() * 252

returns_1 -0.073915returns_2 -0.017554strategy0.105002dtype: float64

# 计算年化风险data3[['returns_1','returns_2','strategy']].dropna().std() * 252 ** 0.5

returns_1 0.300306returns_2 0.280425strategy0.068639dtype: float64

# 策略累积收益率data3['cumret'] = data3['strategy'].dropna().cumsum().apply(np.exp)# 策略累积最大值data3['cummax'] = data3['cumret'].cummax()# 算回撤序列drawdown = (data3['cummax'] - data3['cumret'])# 算最大回撤drawdown.max()

0.038159777097367176

策略的思考

对多只ETF进行配对交易,是很多实盘量化基金的交易策略;

策略的风险和问题:

Spread不回归的风险,当市场结构发生重大改变时,用过去历史回归出来的Spread会发生不回归的重大风险;中国市场做空受到限制,策略中有部分做空的收益是无法获得的;回归系数需要Rebalancing;策略没有考虑交易成本和其他成本;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。