Python配對交易策略統(tǒng)計套利量化交易分析股票市場|附代碼數(shù)據(jù)
原文鏈接:http://tecdat.cn/?p=24814
最近我們被客戶要求撰寫關于量化交易的研究報告,包括一些圖形和統(tǒng)計輸出。
說到在股票市場上賺錢,有無數(shù)種不同的賺錢方式。似乎在金融界,無論你走到哪里,人們都在告訴你應該學習 Python
畢竟,Python 是一種流行的編程語言,可用于所有類型的領域,包括數(shù)據(jù)科學。有大量軟件包可以幫助您實現(xiàn)目標,許多公司使用 Python 來開發(fā)與金融界相關的以數(shù)據(jù)為中心的應用程序和科學計算。
最重要的是,Python 可以幫助我們利用許多不同的交易策略,這些策略(沒有它)將很難用手或電子表格進行分析。我們將討論的交易策略之一稱為?配對交易。
配對交易
配對交易是_均值回歸的_一種形式??,具有始終對沖市場波動的獨特優(yōu)勢。該策略基于數(shù)學分析。
原理如下。假設您有一對具有某種潛在經(jīng)濟聯(lián)系的證券 X 和 Y。一個例子可能是生產(chǎn)相同產(chǎn)品的兩家公司,或一條供應鏈中的兩家公司。如果我們可以用數(shù)學模型對這種經(jīng)濟聯(lián)系進行建模,我們就可以對其進行交易。
為了理解配對交易,我們需要理解三個數(shù)學概念:?平穩(wěn)性、差分和協(xié)整。
import?numpy?as?npimport?pandas?as?pd
平穩(wěn)/非平穩(wěn)
平穩(wěn)性是時間序列分析中最常見的未經(jīng)檢驗的假設。當數(shù)據(jù)生成過程的參數(shù)不隨時間變化時,我們通常假設數(shù)據(jù)是平穩(wěn)的?;蛘呖紤]兩個系列:A 和 B。系列 A 將生成具有固定參數(shù)的平穩(wěn)時間序列,而 B 將隨時間變化。
我們將創(chuàng)建一個函數(shù),為概率密度函數(shù)創(chuàng)建 z 分數(shù)。高斯分布的概率密度為:


?是均值和?

?是標準差。標準差的平方,?

,是方差。經(jīng)驗法則規(guī)定 66% 的數(shù)據(jù)應該介于?

?和?

,這意味著該函數(shù)normal
?更有可能返回靠近均值的樣本,而不是那些遠離均值的樣本。
????mu?
????sigma?
????return?normal(mu,?sigma?)
從那里,我們可以創(chuàng)建兩個展示平穩(wěn)和非平穩(wěn)時間序列的圖。
#?設置參數(shù)和數(shù)據(jù)點數(shù)T?=?100Series(index=range(T))
?????#?現(xiàn)在參數(shù)依賴于時間?????#?具體來說,序列的均值隨時間變化?????B[t]?=?genedata
????
plt.subplots

為什么平穩(wěn)性很重要
許多統(tǒng)計測試要求被測試的數(shù)據(jù)是平穩(wěn)的。在非平穩(wěn)數(shù)據(jù)集上使用某些統(tǒng)計數(shù)據(jù)可能會導致垃圾結果。作為一個例子,讓我們通過我們的非平穩(wěn)?

.
np.meanplt.figureplt.plotplt.hlines

計算的平均值將顯示所有數(shù)據(jù)點的平均值,但對未來狀態(tài)的任何預測都沒有用。與任何特定時間相比,它毫無意義,因為它是不同時間的不同狀態(tài)混搭在一起的集合。這只是一個簡單而清晰的例子,說明了為什么非平穩(wěn)性會扭曲分析,在實踐中會出現(xiàn)更微妙的問題。
平穩(wěn)性檢驗Augmented Dickey Fuller(ADF)
為了測試平穩(wěn)性,我們需要測試一個叫做_單位根的_東西?。自回歸單位根檢驗基于以下假設檢驗:

它被稱為單位根 tet 因為在原假設下,自回歸多項式?

, 的根等于 1。

?在原假設下趨勢平穩(wěn)。如果?

然后首先進行差分,它變成:

檢驗統(tǒng)計量為


?是最小二乘估計和 SE(

) 是通常的標準誤差估計。該測試是單側左尾測試。如果 {

} 是平穩(wěn)的,那么可以證明

或者

并且是?
?,然而,在非平穩(wěn)性原假設下,上述結果給出
以下函數(shù)將允許我們使用 Augmented Dickey Fuller (ADF) 檢驗來檢查平穩(wěn)性。
defty_test(X,?cutoff=0.01):
?????#?adfuller?中的?H_0?是單位根存在(非平穩(wěn))?????#?我們必須觀察顯著的?p?值看該序列是平穩(wěn)的?????adfuller
正如我們所見,基于時間序列 A 的檢驗統(tǒng)計量(與特定的 p 值對應),我們可能無法拒絕原假設。因此,A 系列很可能是靜止的。另一方面,B系列被假設檢驗拒絕,所以這個時間序列很可能是非平穩(wěn)的。
協(xié)整
金融數(shù)量之間的相關性是出了名的不穩(wěn)定。盡管如此,幾乎所有的多元金融問題都經(jīng)常使用相關性。相關性的另一種統(tǒng)計度量是協(xié)整。這可能是衡量兩個金融數(shù)量之間聯(lián)系的更穩(wěn)健的衡量標準,但迄今為止,幾乎沒有基于此概念的偏差理論。
兩只股票可能在短期內(nèi)完全相關,但從長遠來看卻出現(xiàn)分歧,一只增長,另一只下跌。相反,兩只股票可能相互跟隨,相距不會超過一定距離,但具有相關性,正負相關變化。如果我們是短期,相關性可能很重要,但如果我們在投資組合中長期持有股票,則無關緊要。
我們已經(jīng)構建了兩個協(xié)整序列的示例。我們現(xiàn)在繪制兩者之間的差異。
#?生成每日收益np.random.normal#?總結plot
np.random.normalY?=?X?+?6?+?噪音
plt.show()
(Y?-?X).plot?#?繪制點差plt.axhline#?添加均值plt.xlabel
plt.xlim
點擊標題查閱往期內(nèi)容
R語言動量交易策略分析調整后的數(shù)據(jù)
左右滑動查看更多
01
02
03
04
協(xié)整檢驗
協(xié)整檢驗程序的步驟:
檢驗每個分量系列的單位根?
?單獨使用單變量單位根檢驗,例如 ADF、PP 檢驗。
如果單位根不能被拒絕,那么下一步就是檢驗分量之間的協(xié)整關系,即檢驗是否?

?是 I(0)。
如果我們發(fā)現(xiàn)時間序列為單位根,那么我們繼續(xù)進行協(xié)整過程。有三種主要的協(xié)整檢驗方法:Johansen、Engle-Granger 和 Phillips-Ouliaris。我們將主要使用 Engle-Granger 測試。
讓我們考慮回歸模型?

:

中

?是確定性項。假設檢驗如下:


?與?歸一化的協(xié)整向量協(xié)整

我們也使用殘差?

?用于單位根檢驗。

該假設檢驗適用于模型:

以下等式的檢驗統(tǒng)計量:

現(xiàn)在您了解了兩個時間序列協(xié)整的含義,我們可以對其進行測試并使用 python 進行測量:
cointprint(pvalue)#?低p值意味著高協(xié)整!

相關與協(xié)整
相關性和協(xié)整性雖然在理論上相似,但完全不同。為了證明這一點,我們可以查看兩個相關但不協(xié)整的時間序列的示例。
一個簡單的例子是兩個序列。
Xruns?=?np.random.normalyrurs?=?np.random.normal
pd.concat
plt.xlim

接下來,我們可以輸出相關系數(shù),?

, 和協(xié)整檢驗

正如我們所看到的,序列 X 和 Y 之間存在非常強的相關性。然而,我們協(xié)整檢驗的 p 值產(chǎn)生了 0.7092,這意味著時間序列 X 和 Y 之間沒有協(xié)整。
這種情況的另一個例子是正態(tài)分布系列和方波。
Y2?=?pd.Series
plt.figure
Y2.plot()#?相關性幾乎為零prinr(pvle))


盡管相關性非常低,但 p 值表明這些時間序列是協(xié)整的。
import?fix_yaance?as?yf
yf.pdrde
交易中的數(shù)據(jù)科學
在開始之前,我將首先定義一個函數(shù),該函數(shù)可以使用我們已經(jīng)涵蓋的概念輕松找到協(xié)整對。
def?fitirs(data):
????n?=?data.shape
????srmaix?=?np.zeros
????pvl_mrix?=?np.ones
????keys?=?dta.keys?
????for?i?in?range(n):
????????for?j?in?range:
??????????
????????????reut?=?coint?
????????????sr?=?ret[0]
????????????paue?=?rsult[1]
????????????soeix[i,?j]?=?score
????????????pu_trix[i,?j]?=?palue
????????????if?palue?<?0.05:
????????????????pairs.append
????return?soe_mati,?prs
我們正在查看一組科技公司,看看它們中是否有任何一家是協(xié)整的。我們將首先定義我們想要查看的證券列表。然后我們將獲得 2013 - 2018 年每個證券的定價數(shù)據(jù)..
如前所述,我們已經(jīng)制定了一個經(jīng)濟假設,即科技行業(yè)內(nèi)的證券子集之間存在某種聯(lián)系,我們想測試是否存在任何協(xié)整對。與搜索數(shù)百種證券相比,這產(chǎn)生的多重比較偏差要小得多,而比為單個測試形成假設的情況略多。
start?=?datetime.datetimeend?=?datetime.datetimedf?=?pdr(tcrs,?strt,?nd)['Close']
df.tail()


#?熱圖顯示每對之間的協(xié)整檢驗的 p 值股票。?只顯示熱圖上對角線上的值分數(shù)、
seaborn.heatmap
我們的算法列出了兩個協(xié)整對:AAPL/EBAY 和 ABDE/MSFT。我們可以分析他們的模式。
coit
pvalue

如我們所見,p 值小于 0.05,這意味著 ADBE 和 MSFT 確實是協(xié)整對。
計算價差
現(xiàn)在我們可以繪制這兩個時間序列的價差。為了實際計算價差,我們使用線性回歸來獲得我們兩個證券之間的線性組合的系數(shù),正如之前提到的恩格爾-格蘭杰方法。
results.paramssed?=?S2?-?b?*?S1
sedplot
plt.axhline
plt.xlim
plt.legend
或者,我們可以檢查兩個時間序列之間的比率
rio
rao.plotplt.axhline
plt.xlim
plt.legend
無論我們是使用價差法還是比率法,我們都可以看到我們的第一個圖對 ADBE/SYMC 傾向于圍繞均值移動。我們現(xiàn)在需要標準化這個比率,因為絕對比率可能不是分析這種趨勢的最理想方式。為此,我們需要使用 z 分數(shù)。
z 分數(shù)是數(shù)據(jù)點與平均值的標準差數(shù)。更重要的是,高于或低于總體平均值的標準差的數(shù)量來自原始分數(shù)。z-score 的計算方法如下:
def?zscr:
????return?(sres?-?ees.mean)?/?np.std
zscr.plotplt.axhline
plt.axhline
plt.axhline
plt.xlim
plt.show
通過將另外兩條線放置在 z 分數(shù) 1 和 -1 處,我們可以清楚地看到,在大多數(shù)情況下,與平均值的任何大背離最終都會收斂。這正是我們想要的配對交易策略。
交易信號
在進行任何類型的交易策略時,明確定義和描述實際進行交易的時間點總是很重要的。例如,我需要買賣特定股票的最佳指標是什么?
設置規(guī)則
我們將使用我們創(chuàng)建的比率時間序列來查看它是否告訴我們是在特定時間買入還是賣出。我們將首先創(chuàng)建一個預測變量?
. 如果比率為正,則表示“買入”,否則表示賣出。預測模型如下:
配對交易信號的好處在于,我們不需要知道價格將走向的絕對信息,我們只需要知道它的走向:上漲或下跌。
訓練測試拆分
在訓練和測試模型時,通常會有 70/30 或 80/20 的分割。我們只使用了 252 個點的時間序列(這是一年中的交易天數(shù))。在訓練和拆分數(shù)據(jù)之前,我們將在每個時間序列中添加更多數(shù)據(jù)點。
ratios?=?df['ADBE']?/?df['MSFT']?print(len(ratios)?*?.70?)
tran?=?ratos[:881]tet?=?rats[881:]
特征工程
我們需要找出哪些特征在確定比率移動的方向上實際上很重要。知道比率最終總是會恢復到均值,也許與均值相關的移動平均線和指標將很重要。
讓我們嘗試:
60 天移動平均線
5 天移動平均線
60 天標準差
z 分數(shù)
train.rolg
zcoe_5?=?(ra_ag5?-?rasag60)/
plt.figureplt.plotplt.legendplt.ylabel
plt.show
plt.figurez5.plot()
plt.xlim
plt.axhline
plt.legendplt.show
創(chuàng)建模型
標準正態(tài)分布的均值為 0,標準差為 1。從圖中可以看出,很明顯,如果時間序列超出均值 1 個標準差,則趨向于恢復到均值。使用這些模型,我們可以創(chuàng)建以下交易信號:
每當 z-score 低于 -1 時, 買入(1),這意味著我們預計比率會增加。
每當 z 得分高于 1 時,賣出(-1),這意味著我們預計比率會下降。
訓練優(yōu)化
我們可以在實際數(shù)據(jù)上使用我們的模型
train.plot()
buy?
sell
buy[z>-1]?=?0sell[z5<1]?=?0buy[160:].plotsell[160:].plot
plt.figure#?當您買入比率時,您買入股票?S1?并賣出?S2sell[buy!=0]?=?S[uy!=0]#?當您賣出比率時,您賣出股票?S1?并買入?S2sell[sll!=0]?=?S1[sll!=0]BuR[60:].plot
selR[60:].plot

現(xiàn)在我們可以清楚地看到我們應該何時買入或賣出相應的股票。
現(xiàn)在,我們可以期望從這個策略中獲得多少收益?
#?使用簡單的 strydef 進行交易:????
????#?如果窗口長度為0,算法沒有意義,退出???
????
????#?計算滾動平均值和滾動標準差????比率?=?S1/S2
????a1?=?rais.rolng
????zscoe?=?(ma1?-?ma2)/std
????
????#?模擬交易????#?對于范圍內(nèi)的 i(len(ratios)):????????#?如果?z-score?>?1,則賣空??????
????????????mey?+=?S1[i]?-?S2[i]?*?rts[i]?????????
????????????cutS2?+=?raos[i]??????????
????????#?如果?z-score?<?-1,則買入多頭????????ef?zoe[i]?>?1:
????????????mey??-=?S1[i]?-?S2[i]?*?rtos[i]
????
????????#?如果?z-score?介于?-.5?和?.5?之間,則清除????????elif?abs(zcre[i])?<?0.75:
????????????mey??+=?S1[i]?*?ctS?+?S2[i]?*?oS2
trad
對于從策略制定的策略來說,這是一個不錯的利潤。
改進的領域和進一步的步驟
這絕不是一個完美的戰(zhàn)略,我們戰(zhàn)略的實施也不是最好的。但是,有幾件事可以改進。
使用更多的證券和更多樣化的時間范圍
對于配對交易策略的協(xié)整測試,我只使用了少數(shù)股票。自然地(并且在實踐中)在行業(yè)內(nèi)使用集群會更有效。我只用了只有5年的時間范圍,這可能不能代表股市的波動。
處理過擬合
任何與數(shù)據(jù)分析和訓練模型相關的事情都與過擬合問題有很大關系。有許多不同的方法可以處理像驗證這樣的過擬合,例如卡爾曼濾波器和其他統(tǒng)計方法。
調整交易信號
我們的交易算法沒有考慮到相互重疊和交叉的股票價格??紤]到該代碼僅根據(jù)其比率要求買入或賣出,它并未考慮實際上哪個股票更高或更低。
更高級的方法
這只是算法對交易的冰山一角。這很簡單,因為它只處理移動平均線和比率。如果您想使用更復雜的統(tǒng)計數(shù)據(jù),請使用。其他復雜示例包括 Hurst 指數(shù)、半衰期均值回歸和卡爾曼濾波器等主題。
本文摘選?《?Python配對交易策略Pairs Trading統(tǒng)計套利量化交易分析股票市場?》?,點擊“閱讀原文”獲取全文完整資料。
點擊標題查閱往期內(nèi)容
R語言資產(chǎn)配置策略量化模型:改進的移動平均線策略動態(tài)回測
R語言量化:合成波動率指數(shù)移動平均策略分析標準普爾500波動率指數(shù)(VIX)
R語言改進的股票配對交易策略分析SPY-TLT組合和中國股市投資組合
R語言量化交易RSI策略:使用支持向量機SVM
使用R語言對S&P500股票指數(shù)進行ARIMA + GARCH交易策略
R語言量化交易RSI策略:使用支持向量機SVM
R語言資產(chǎn)配置: 季度戰(zhàn)術資產(chǎn)配置策略研究
R語言動量交易策略分析調整后的數(shù)據(jù)
TMA三均線股票期貨高頻交易策略的R語言實現(xiàn)
R語言時間序列:ARIMA / GARCH模型的交易策略在外匯市場預測應用
R語言基于Garch波動率預測的區(qū)制轉移交易策略
r語言多均線股票價格量化策略回測
使用R語言對S&P500股票指數(shù)進行ARIMA + GARCH交易策略
Python基于粒子群優(yōu)化的投資組合優(yōu)化研究
R語言Fama-French三因子模型實際應用:優(yōu)化投資組合
R語言動量和馬科維茨Markowitz投資組合(Portfolio)模型實現(xiàn)
Python計算股票投資組合的風險價值(VaR)
R語言Markowitz馬克維茨投資組合理論分析和可視化
R語言中的廣義線性模型(GLM)和廣義相加模型(GAM):多元(平滑)回歸分析保險資金投資組合信用風險敞口