第五章:量化研究專題(第四篇:統計套利:利用相關係數進行配對交易 )
阿新 • • 發佈:2019-02-08
導語:本篇內容你將會學會如何運用相關係數找出適合套利的股票標的,並編寫套利策略,
進行套利交易。
什麼是配對交易?
配對交易是指八十年代中期華爾街著名投行Morgan Stanley 的數量交易員Nunzio
Tartaglia 成立的一個數量分析團隊提出的一種市場中性投資策略。
Ganapathy Vidyamurthy 在《Pairs Trading: Quantitative Methods and Analysis 》一書中定義
配對交易為兩種型別:一類是基於統計套利的配對交易,一類是基於風險套利的配對交易。
基於統計套利的配對交易策略是一種市場中性策略,具體的說,是指從市場上找出歷史
股價走勢相近的股票進行配對,當配對的股票價格差 (Spreads )偏離歷史均值時,則做空
股價較高的股票同時買進股價較低的股票,等待他們迴歸到長期均衡關係,由此賺取兩股票
價格收斂的報酬。
配對交易原理
配對交易策略的基本原理是基於兩個相關性較高的股票或者其他證券,如果在未來時期
保持著良好的相關性,一旦兩者之間出現了背離的走勢,且這種背離在未來是會得到糾正
的,那麼就可能產生套利的機會。對於配對交易的實踐而言,如果兩個相關性較高的股票或
者其他證券之間出現背離,就應該買進表現相對較差的,賣出表現相對較好的。當未來兩者
之間的背離得到糾正,那麼可以進行相反的平倉操作來獲取利潤。
由於配對交易利用配對間的短期錯誤定價,通過持有相對低估,賣空相對高估,因此其
本質上是一個反轉投資策略,其核心是學術文獻中的股票價格均值回覆。儘管配對交易策略
非常簡單,但卻被廣泛應用,其之所以能被廣泛應用的主要原因是:首先,配對交易的收益
與市場相獨立,即市場中性,也就是說它與市場的上漲或者下跌無關;其次,其收益的波動
性相對較小;第三,其收益相對穩定。
統計套利:利用相關係數進行配對交易
1.首先想到利用統計套利,可能會想到兩隻股票的相關係數是否會讓兩隻股票的走勢有
一種特定關係。
匯入相應的python 庫包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
----------------------- Page 159-----------------------
首先相關係數的公式定義為下,將協方差標準化即得到我們需要的相關係數
Cov (X , Y ) Cov (X , Y ) Cov (X , Y )
n= = =
std (X )std (Y ) √var (X )√var (Y ) √ Cov (X , X )√Cov (Y ,Y )
我們來看看相關係數高的資料集具體長什麼樣
X = np.random.rand(50)
Y = X + np.random.normal(0, 0.1, 50)
plt.scatter(X,Y,alpha=0.7)
plt.xlabel('X Value')
plt.ylabel('Y Value')
print ('相關係數:' + str(np.corrcoef(X, Y)[0, 1]))
相關係數:0.916457598007
從影象上看,資料基本都落在一條直線上那麼它們之間的相關性就會很高。 接下來我
們來看看兩隻股票價格之間相關性高長什麼樣,我們以中國航空和南方航空為例。
start = '20140101'#此處時間一定要與回測的時間相對應,因為不同時間可能相關性不一致
end = '20180101'
stock1='601111.SH'
stock2='600029.SH'
a1 = get_price(stock1, start, end, '1d', ['close'], False)['close']
a2 = get_price(stock2, start, end, '1d', ['close'], False)['close']
#上圖
plt.scatter(a1,a2,alpha=0.7)
plt.xlabel(stock1)
plt.ylabel(stock2)
plt.title('Stock prices from ' + start + ' to ' + end)
print (stock1+"與"+stock2+"之間的相關係數: ", np.corrcoef(a1,a2)[0,1])
601111.SH 與 600029.SH 之間的相關係數: 0.952849080194
----------------------- Page 160-----------------------
同樣資料大多都集中在一條直線上
找到相關性高的股票對,我們要來研究它們之間的價差,因為這是我們策略套利的關鍵
a3=a1-a2
a3.plot(figsize=(14,7))
從圖中看出,兩隻股票的相關係數高,兩者之間的價差大致圍繞一個常數波動,那麼其
價差是否平穩,我們通過 ADF 單位根檢驗,來判斷一下序列是否平穩。
from statsmodels.tsa.stattools import adfuller
adftest = adfuller(a3)#使用 adf 單位根檢驗平穩性
result = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations
Used'])
for key,value in adftest[4].items():
result['Critical Value (%s)'%key] = value
print(result)
----------------------- Page 161-----------------------
Test Statistic -3.049276
p-value 0.030542
Lags Used 22.000000
Number of Observations Used 954.000000
Critical Value (5%) -2.864574
Critical Value (10%) -2.568386
Critical Value (1%) -3.437223
dtype: float64
根據 ADF 單位根檢驗結果,此處檢驗出來價差平穩,價差基礎對套利策略的實施有利。
ADF 單位根檢驗結果判斷技巧:
A.看p-value 值,一般小於 0.05 即為平穩
B.看 Test statistic 值,一般小於 Critical Value (5%) 的值即為平穩
進一步的我們來看看價差均值基礎上加減一個價差標準差作為套利上下軌,上下軌區間
是否包含了大部分的差價區間?
可以看到上下軌區間包含了大部分價差區間,但是在牛市中,兩者價差波動非常大,不
利於套利策略實施,但是在牛市後,兩者的價差穩定在上下軌之間波動,非常適合進行套利
策略。
讓我們計算兩者 60 日滾動相關性,來看看兩者變化趨勢。
rolling_correlation_cn = pd.rolling_corr(a1, a2, 60)
rolling_correlation_cn.plot()
plt.xlabel('Day')
plt.ylabel('New 60-day Rolling Correlation')
----------------------- Page 162-----------------------
從相關係數的 60 日滾動相關性來看其實這兩隻股票相關性是非常高的,除了牛市中相
關性降低一段時間外,其餘時間都保持在0.7 以上。
通過簡單的套利策略,針對中國國航和南方航空,我們展開套利回測,回測結果如下:
----------------------- Page 163-----------------------
套利策略程式碼如下:
import numpy as np
def initialize(account):
#選取研究後相關係數較高的股票對
g.s1 = '601111.SH'
g.s2 = '600029.SH'
def handle_data(account,data):
# 取得選取的兩隻股票 1 年的收盤價並算出差價
price_stock1=history(g.s1,['close'],250,'1d',True)['close'].values
price_stock2=history(g.s2,['close'],250,'1d',True)['close'].values
diff=price_stock1-price_stock2
# 以均值加一倍標準差作為上開倉線
up=np.mean(diff)+np.std(diff)
# 以均值減一倍標準差作為下開倉線
down=np.mean(diff)-np.std(diff)
#取得進行交易前一天股票的收盤價並計算差價
yesterday_price1=history(g.s1,['close'],1,'1d',True)['close'][0]
yesterday_price2=history(g.s2,['close'],1,'1d',True)['close'][0]
yesterday_diff=yesterday_price1-yesterday_price2
#前一天差價達到上開倉線即賣出股票 s1,做多s2
if yesterday_diff>up:
order_target_percent(g.s1,0)
order_target_percent(g.s2,1)
#前一天的差價達到下開倉線即賣出股票 s2,做多s1
if yesterday_diff<down:
order_target_percent(g.s2,0)
order_target_percent(g.s1,1)
----------------------- Page 164-----------------------
進行套利交易。
什麼是配對交易?
配對交易是指八十年代中期華爾街著名投行Morgan Stanley 的數量交易員Nunzio
Tartaglia 成立的一個數量分析團隊提出的一種市場中性投資策略。
Ganapathy Vidyamurthy 在《Pairs Trading: Quantitative Methods and Analysis 》一書中定義
配對交易為兩種型別:一類是基於統計套利的配對交易,一類是基於風險套利的配對交易。
基於統計套利的配對交易策略是一種市場中性策略,具體的說,是指從市場上找出歷史
股價走勢相近的股票進行配對,當配對的股票價格差 (Spreads )偏離歷史均值時,則做空
股價較高的股票同時買進股價較低的股票,等待他們迴歸到長期均衡關係,由此賺取兩股票
價格收斂的報酬。
配對交易原理
配對交易策略的基本原理是基於兩個相關性較高的股票或者其他證券,如果在未來時期
保持著良好的相關性,一旦兩者之間出現了背離的走勢,且這種背離在未來是會得到糾正
的,那麼就可能產生套利的機會。對於配對交易的實踐而言,如果兩個相關性較高的股票或
者其他證券之間出現背離,就應該買進表現相對較差的,賣出表現相對較好的。當未來兩者
之間的背離得到糾正,那麼可以進行相反的平倉操作來獲取利潤。
由於配對交易利用配對間的短期錯誤定價,通過持有相對低估,賣空相對高估,因此其
本質上是一個反轉投資策略,其核心是學術文獻中的股票價格均值回覆。儘管配對交易策略
非常簡單,但卻被廣泛應用,其之所以能被廣泛應用的主要原因是:首先,配對交易的收益
與市場相獨立,即市場中性,也就是說它與市場的上漲或者下跌無關;其次,其收益的波動
性相對較小;第三,其收益相對穩定。
統計套利:利用相關係數進行配對交易
1.首先想到利用統計套利,可能會想到兩隻股票的相關係數是否會讓兩隻股票的走勢有
一種特定關係。
匯入相應的python 庫包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
----------------------- Page 159-----------------------
首先相關係數的公式定義為下,將協方差標準化即得到我們需要的相關係數
Cov (X , Y ) Cov (X , Y ) Cov (X , Y )
n= = =
std (X )std (Y ) √var (X )√var (Y ) √ Cov (X , X )√Cov (Y ,Y )
我們來看看相關係數高的資料集具體長什麼樣
X = np.random.rand(50)
Y = X + np.random.normal(0, 0.1, 50)
plt.scatter(X,Y,alpha=0.7)
plt.xlabel('X Value')
plt.ylabel('Y Value')
print ('相關係數:' + str(np.corrcoef(X, Y)[0, 1]))
相關係數:0.916457598007
從影象上看,資料基本都落在一條直線上那麼它們之間的相關性就會很高。 接下來我
們來看看兩隻股票價格之間相關性高長什麼樣,我們以中國航空和南方航空為例。
start = '20140101'#此處時間一定要與回測的時間相對應,因為不同時間可能相關性不一致
end = '20180101'
stock1='601111.SH'
stock2='600029.SH'
a1 = get_price(stock1, start, end, '1d', ['close'], False)['close']
a2 = get_price(stock2, start, end, '1d', ['close'], False)['close']
#上圖
plt.scatter(a1,a2,alpha=0.7)
plt.xlabel(stock1)
plt.ylabel(stock2)
plt.title('Stock prices from ' + start + ' to ' + end)
print (stock1+"與"+stock2+"之間的相關係數: ", np.corrcoef(a1,a2)[0,1])
601111.SH 與 600029.SH 之間的相關係數: 0.952849080194
----------------------- Page 160-----------------------
同樣資料大多都集中在一條直線上
找到相關性高的股票對,我們要來研究它們之間的價差,因為這是我們策略套利的關鍵
a3=a1-a2
a3.plot(figsize=(14,7))
從圖中看出,兩隻股票的相關係數高,兩者之間的價差大致圍繞一個常數波動,那麼其
價差是否平穩,我們通過 ADF 單位根檢驗,來判斷一下序列是否平穩。
from statsmodels.tsa.stattools import adfuller
adftest = adfuller(a3)#使用 adf 單位根檢驗平穩性
result = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations
Used'])
for key,value in adftest[4].items():
result['Critical Value (%s)'%key] = value
print(result)
----------------------- Page 161-----------------------
Test Statistic -3.049276
p-value 0.030542
Lags Used 22.000000
Number of Observations Used 954.000000
Critical Value (5%) -2.864574
Critical Value (10%) -2.568386
Critical Value (1%) -3.437223
dtype: float64
根據 ADF 單位根檢驗結果,此處檢驗出來價差平穩,價差基礎對套利策略的實施有利。
ADF 單位根檢驗結果判斷技巧:
A.看p-value 值,一般小於 0.05 即為平穩
B.看 Test statistic 值,一般小於 Critical Value (5%) 的值即為平穩
進一步的我們來看看價差均值基礎上加減一個價差標準差作為套利上下軌,上下軌區間
是否包含了大部分的差價區間?
可以看到上下軌區間包含了大部分價差區間,但是在牛市中,兩者價差波動非常大,不
利於套利策略實施,但是在牛市後,兩者的價差穩定在上下軌之間波動,非常適合進行套利
策略。
讓我們計算兩者 60 日滾動相關性,來看看兩者變化趨勢。
rolling_correlation_cn = pd.rolling_corr(a1, a2, 60)
rolling_correlation_cn.plot()
plt.xlabel('Day')
plt.ylabel('New 60-day Rolling Correlation')
----------------------- Page 162-----------------------
從相關係數的 60 日滾動相關性來看其實這兩隻股票相關性是非常高的,除了牛市中相
關性降低一段時間外,其餘時間都保持在0.7 以上。
通過簡單的套利策略,針對中國國航和南方航空,我們展開套利回測,回測結果如下:
----------------------- Page 163-----------------------
套利策略程式碼如下:
import numpy as np
def initialize(account):
#選取研究後相關係數較高的股票對
g.s1 = '601111.SH'
g.s2 = '600029.SH'
def handle_data(account,data):
# 取得選取的兩隻股票 1 年的收盤價並算出差價
price_stock1=history(g.s1,['close'],250,'1d',True)['close'].values
price_stock2=history(g.s2,['close'],250,'1d',True)['close'].values
diff=price_stock1-price_stock2
# 以均值加一倍標準差作為上開倉線
up=np.mean(diff)+np.std(diff)
# 以均值減一倍標準差作為下開倉線
down=np.mean(diff)-np.std(diff)
#取得進行交易前一天股票的收盤價並計算差價
yesterday_price1=history(g.s1,['close'],1,'1d',True)['close'][0]
yesterday_price2=history(g.s2,['close'],1,'1d',True)['close'][0]
yesterday_diff=yesterday_price1-yesterday_price2
#前一天差價達到上開倉線即賣出股票 s1,做多s2
if yesterday_diff>up:
order_target_percent(g.s1,0)
order_target_percent(g.s2,1)
#前一天的差價達到下開倉線即賣出股票 s2,做多s1
if yesterday_diff<down:
order_target_percent(g.s2,0)
order_target_percent(g.s1,1)
----------------------- Page 164-----------------------