拓端tecdat|Python配對(duì)交易策略Pairs Trading統(tǒng)計(jì)套利量化交易分析股票市場(chǎng)
原文鏈接:http://tecdat.cn/?p=24814
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
說到在股票市場(chǎng)上賺錢,有無數(shù)種不同的賺錢方式。似乎在金融界,無論你走到哪里,人們都在告訴你應(yīng)該學(xué)習(xí) Python。畢竟,Python 是一種流行的編程語言,可用于所有類型的領(lǐng)域,包括數(shù)據(jù)科學(xué)。有大量軟件包可以幫助您實(shí)現(xiàn)目標(biāo),許多公司使用 Python 來開發(fā)與金融界相關(guān)的以數(shù)據(jù)為中心的應(yīng)用程序和科學(xué)計(jì)算。
最重要的是,Python 可以幫助我們利用許多不同的交易策略,這些策略(沒有它)將很難用手或電子表格進(jìn)行分析。我們將討論的交易策略之一稱為?配對(duì)交易。
配對(duì)交易
配對(duì)交易是均值回歸的一種形式??,具有始終對(duì)沖市場(chǎng)波動(dòng)的獨(dú)特優(yōu)勢(shì)。該策略基于數(shù)學(xué)分析。
原理如下。假設(shè)您有一對(duì)具有某種潛在經(jīng)濟(jì)聯(lián)系的證券 X 和 Y。一個(gè)例子可能是生產(chǎn)相同產(chǎn)品的兩家公司,或一條供應(yīng)鏈中的兩家公司。如果我們可以用數(shù)學(xué)模型對(duì)這種經(jīng)濟(jì)聯(lián)系進(jìn)行建模,我們就可以對(duì)其進(jìn)行交易。
為了理解配對(duì)交易,我們需要理解三個(gè)數(shù)學(xué)概念:?平穩(wěn)性、差分和協(xié)整。
import numpy as np
import pandas as pd
平穩(wěn)/非平穩(wěn)
平穩(wěn)性是時(shí)間序列分析中最常見的未經(jīng)檢驗(yàn)的假設(shè)。當(dāng)數(shù)據(jù)生成過程的參數(shù)不隨時(shí)間變化時(shí),我們通常假設(shè)數(shù)據(jù)是平穩(wěn)的?;蛘呖紤]兩個(gè)系列:A 和 B。系列 A 將生成具有固定參數(shù)的平穩(wěn)時(shí)間序列,而 B 將隨時(shí)間變化。
我們將創(chuàng)建一個(gè)函數(shù),為概率密度函數(shù)創(chuàng)建 z 分?jǐn)?shù)。高斯分布的概率密度為:
?是均值和?
?是標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差的平方,?
,是方差。經(jīng)驗(yàn)法則規(guī)定 66% 的數(shù)據(jù)應(yīng)該介于?
?和?
,這意味著該函數(shù)normal
?更有可能返回靠近均值的樣本,而不是那些遠(yuǎn)離均值的樣本。
mu
sigma
return normal(mu, sigma )
從那里,我們可以創(chuàng)建兩個(gè)展示平穩(wěn)和非平穩(wěn)時(shí)間序列的圖。
# 設(shè)置參數(shù)和數(shù)據(jù)點(diǎn)數(shù)
T = 100
Series(index=range(T))
# 現(xiàn)在參數(shù)依賴于時(shí)間
# 具體來說,序列的均值隨時(shí)間變化
B[t] = genedata
plt.subplots
為什么平穩(wěn)性很重要
許多統(tǒng)計(jì)測(cè)試要求被測(cè)試的數(shù)據(jù)是平穩(wěn)的。在非平穩(wěn)數(shù)據(jù)集上使用某些統(tǒng)計(jì)數(shù)據(jù)可能會(huì)導(dǎo)致垃圾結(jié)果。作為一個(gè)例子,讓我們通過我們的非平穩(wěn)?
.
np.mean
plt.figure
plt.plot
plt.hlines
計(jì)算的平均值將顯示所有數(shù)據(jù)點(diǎn)的平均值,但對(duì)未來狀態(tài)的任何預(yù)測(cè)都沒有用。與任何特定時(shí)間相比,它毫無意義,因?yàn)樗遣煌瑫r(shí)間的不同狀態(tài)混搭在一起的集合。這只是一個(gè)簡(jiǎn)單而清晰的例子,說明了為什么非平穩(wěn)性會(huì)扭曲分析,在實(shí)踐中會(huì)出現(xiàn)更微妙的問題。
平穩(wěn)性檢驗(yàn)Augmented Dickey Fuller(ADF)
為了測(cè)試平穩(wěn)性,我們需要測(cè)試一個(gè)叫做單位根的東西?。自回歸單位根檢驗(yàn)基于以下假設(shè)檢驗(yàn):
它被稱為單位根 tet 因?yàn)樵谠僭O(shè)下,自回歸多項(xiàng)式?
, 的根等于 1。
?在原假設(shè)下趨勢(shì)平穩(wěn)。如果?
然后首先進(jìn)行差分,它變成:
檢驗(yàn)統(tǒng)計(jì)量為
?是最小二乘估計(jì)和 SE(
) 是通常的標(biāo)準(zhǔn)誤差估計(jì)。該測(cè)試是單側(cè)左尾測(cè)試。如果 {undefined
} 是平穩(wěn)的,那么可以證明
或者
并且是?
?,然而,在非平穩(wěn)性原假設(shè)下,上述結(jié)果給出
以下函數(shù)將允許我們使用 Augmented Dickey Fuller (ADF) 檢驗(yàn)來檢查平穩(wěn)性。
defty_test(X, cutoff=0.01):
# adfuller 中的 H_0 是單位根存在(非平穩(wěn))
# 我們必須觀察顯著的 p 值看該序列是平穩(wěn)的
adfuller
正如我們所見,基于時(shí)間序列 A 的檢驗(yàn)統(tǒng)計(jì)量(與特定的 p 值對(duì)應(yīng)),我們可能無法拒絕原假設(shè)。因此,A 系列很可能是靜止的。另一方面,B系列被假設(shè)檢驗(yàn)拒絕,所以這個(gè)時(shí)間序列很可能是非平穩(wěn)的。
協(xié)整
金融數(shù)量之間的相關(guān)性是出了名的不穩(wěn)定。盡管如此,幾乎所有的多元金融問題都經(jīng)常使用相關(guān)性。相關(guān)性的另一種統(tǒng)計(jì)度量是協(xié)整。這可能是衡量?jī)蓚€(gè)金融數(shù)量之間聯(lián)系的更穩(wěn)健的衡量標(biāo)準(zhǔn),但迄今為止,幾乎沒有基于此概念的偏差理論。
兩只股票可能在短期內(nèi)完全相關(guān),但從長(zhǎng)遠(yuǎn)來看卻出現(xiàn)分歧,一只增長(zhǎng),另一只下跌。相反,兩只股票可能相互跟隨,相距不會(huì)超過一定距離,但具有相關(guān)性,正負(fù)相關(guān)變化。如果我們是短期,相關(guān)性可能很重要,但如果我們?cè)谕顿Y組合中長(zhǎng)期持有股票,則無關(guān)緊要。
我們已經(jīng)構(gòu)建了兩個(gè)協(xié)整序列的示例。我們現(xiàn)在繪制兩者之間的差異。
# 生成每日收益
np.random.normal
# 總結(jié)
plot
np.random.normal
Y = X + 6 + 噪音
plt.show()
(Y - X).plot # 繪制點(diǎn)差
plt.axhline# 添加均值
plt.xlabel
plt.xlim
協(xié)整檢驗(yàn)
協(xié)整檢驗(yàn)程序的步驟:
檢驗(yàn)每個(gè)分量系列的單位根?
?單獨(dú)使用單變量單位根檢驗(yàn),例如 ADF、PP 檢驗(yàn)。
如果單位根不能被拒絕,那么下一步就是檢驗(yàn)分量之間的協(xié)整關(guān)系,即檢驗(yàn)是否?
?是 I(0)。
如果我們發(fā)現(xiàn)時(shí)間序列為單位根,那么我們繼續(xù)進(jìn)行協(xié)整過程。有三種主要的協(xié)整檢驗(yàn)方法:Johansen、Engle-Granger 和 Phillips-Ouliaris。我們將主要使用 Engle-Granger 測(cè)試。
讓我們考慮回歸模型?
:
中
?是確定性項(xiàng)。假設(shè)檢驗(yàn)如下:
?與?歸一化的協(xié)整向量協(xié)整
?
我們也使用殘差?
?用于單位根檢驗(yàn)。
該假設(shè)檢驗(yàn)適用于模型:
以下等式的檢驗(yàn)統(tǒng)計(jì)量:
現(xiàn)在您了解了兩個(gè)時(shí)間序列協(xié)整的含義,我們可以對(duì)其進(jìn)行測(cè)試并使用 python 進(jìn)行測(cè)量:
coint
print(pvalue)
# 低p值意味著高協(xié)整!
相關(guān)與協(xié)整
相關(guān)性和協(xié)整性雖然在理論上相似,但完全不同。為了證明這一點(diǎn),我們可以查看兩個(gè)相關(guān)但不協(xié)整的時(shí)間序列的示例。
一個(gè)簡(jiǎn)單的例子是兩個(gè)序列。
Xruns = np.random.normal
yrurs = np.random.normal
pd.concat
plt.xlim
接下來,我們可以輸出相關(guān)系數(shù),?
, 和協(xié)整檢驗(yàn)
正如我們所看到的,序列 X 和 Y 之間存在非常強(qiáng)的相關(guān)性。 然而,我們協(xié)整檢驗(yàn)的 p 值產(chǎn)生了 0.7092,這意味著時(shí)間序列 X 和 Y 之間沒有協(xié)整。
這種情況的另一個(gè)例子是正態(tài)分布系列和方波。
Y2 = pd.Series
plt.figure
Y2.plot()
# 相關(guān)性幾乎為零
prinr(pvle))
?
盡管相關(guān)性非常低,但 p 值表明這些時(shí)間序列是協(xié)整的。
import fix_yaance as yf
yf.pdrde
交易中的數(shù)據(jù)科學(xué)
在開始之前,我將首先定義一個(gè)函數(shù),該函數(shù)可以使用我們已經(jīng)涵蓋的概念輕松找到協(xié)整對(duì)。
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 年每個(gè)證券的定價(jià)數(shù)據(jù)..
如前所述,我們已經(jīng)制定了一個(gè)經(jīng)濟(jì)假設(shè),即科技行業(yè)內(nèi)的證券子集之間存在某種聯(lián)系,我們想測(cè)試是否存在任何協(xié)整對(duì)。與搜索數(shù)百種證券相比,這產(chǎn)生的多重比較偏差要小得多,而比為單個(gè)測(cè)試形成假設(shè)的情況略多。
start = datetime.datetime
end = datetime.datetime
df = pdr(tcrs, strt, nd)['Close']
df.tail()
?
# 熱圖顯示每對(duì)之間的協(xié)整檢驗(yàn)的 p 值股票。 只顯示熱圖上對(duì)角線上的值
分?jǐn)?shù)、
seaborn.heatmap
我們的算法列出了兩個(gè)協(xié)整對(duì):AAPL/EBAY 和 ABDE/MSFT。我們可以分析他們的模式。
coit
pvalue
如我們所見,p 值小于 0.05,這意味著 ADBE 和 MSFT?確實(shí)是協(xié)整對(duì)。
計(jì)算價(jià)差
現(xiàn)在我們可以繪制這兩個(gè)時(shí)間序列的價(jià)差。為了實(shí)際計(jì)算價(jià)差,我們使用線性回歸來獲得我們兩個(gè)證券之間的線性組合的系數(shù),正如之前提到的恩格爾-格蘭杰方法。
results.params
sed = S2 - b * S1
sedplot
plt.axhline
plt.xlim
plt.legend
或者,我們可以檢查兩個(gè)時(shí)間序列之間的比率
rio
rao.plot
plt.axhline
plt.xlim
plt.legend
無論我們是使用價(jià)差法還是比率法,我們都可以看到我們的第一個(gè)圖對(duì) ADBE/SYMC 傾向于圍繞均值移動(dòng)。我們現(xiàn)在需要標(biāo)準(zhǔn)化這個(gè)比率,因?yàn)榻^對(duì)比率可能不是分析這種趨勢(shì)的最理想方式。為此,我們需要使用 z 分?jǐn)?shù)。
z 分?jǐn)?shù)是數(shù)據(jù)點(diǎn)與平均值的標(biāo)準(zhǔn)差數(shù)。更重要的是,高于或低于總體平均值的標(biāo)準(zhǔn)差的數(shù)量來自原始分?jǐn)?shù)。z-score 的計(jì)算方法如下:
def zscr:
return (sres - ees.mean) / np.std
zscr.plot
plt.axhline
plt.axhline
plt.axhline
plt.xlim
plt.show
通過將另外兩條線放置在 z 分?jǐn)?shù) 1 和 -1 處,我們可以清楚地看到,在大多數(shù)情況下,與平均值的任何大背離最終都會(huì)收斂。這正是我們想要的配對(duì)交易策略。
交易信號(hào)
在進(jìn)行任何類型的交易策略時(shí),明確定義和描述實(shí)際進(jìn)行交易的時(shí)間點(diǎn)總是很重要的。例如,我需要買賣特定股票的最佳指標(biāo)是什么?
設(shè)置規(guī)則
我們將使用我們創(chuàng)建的比率時(shí)間序列來查看它是否告訴我們是在特定時(shí)間買入還是賣出。我們將首先創(chuàng)建一個(gè)預(yù)測(cè)變量?
. 如果比率為正,則表示“買入”,否則表示賣出。預(yù)測(cè)模型如下:
配對(duì)交易信號(hào)的好處在于,我們不需要知道價(jià)格將走向的絕對(duì)信息,我們只需要知道它的走向:上漲或下跌。
訓(xùn)練測(cè)試拆分
在訓(xùn)練和測(cè)試模型時(shí),通常會(huì)有 70/30 或 80/20 的分割。我們只使用了 252 個(gè)點(diǎn)的時(shí)間序列(這是一年中的交易天數(shù))。在訓(xùn)練和拆分?jǐn)?shù)據(jù)之前,我們將在每個(gè)時(shí)間序列中添加更多數(shù)據(jù)點(diǎn)。
ratios = df['ADBE'] / df['MSFT']
print(len(ratios) * .70 )
tran = ratos[:881]
tet = rats[881:]
特征工程
我們需要找出哪些特征在確定比率移動(dòng)的方向上實(shí)際上很重要。知道比率最終總是會(huì)恢復(fù)到均值,也許與均值相關(guān)的移動(dòng)平均線和指標(biāo)將很重要。
讓我們嘗試:
60 天移動(dòng)平均線
5 天移動(dòng)平均線
60 天標(biāo)準(zhǔn)差
z 分?jǐn)?shù)
train.rolg
zcoe_5 = (ra_ag5 - rasag60)/
plt.figure
plt.plot
plt.legend
plt.ylabel
plt.show
plt.figure
z5.plot()
plt.xlim
plt.axhline
plt.legend
plt.show
創(chuàng)建模型
標(biāo)準(zhǔn)正態(tài)分布的均值為 0,標(biāo)準(zhǔn)差為 1。從圖中可以看出,很明顯,如果時(shí)間序列超出均值 1 個(gè)標(biāo)準(zhǔn)差,則趨向于恢復(fù)到均值。使用這些模型,我們可以創(chuàng)建以下交易信號(hào):
每當(dāng) z-score 低于 -1 時(shí), 買入(1),這意味著我們預(yù)計(jì)比率會(huì)增加。
每當(dāng) z 得分高于 1 時(shí),賣出(-1),這意味著我們預(yù)計(jì)比率會(huì)下降。
訓(xùn)練優(yōu)化
我們可以在實(shí)際數(shù)據(jù)上使用我們的模型
train.plot()
buy
sell
buy[z>-1] = 0
sell[z5<1] = 0
buy[160:].plot
sell[160:].plot
plt.figure
# 當(dāng)您買入比率時(shí),您買入股票 S1 并賣出 S2
sell[buy!=0] = S[uy!=0]
# 當(dāng)您賣出比率時(shí),您賣出股票 S1 并買入 S2
sell[sll!=0] = S1[sll!=0]
BuR[60:].plot
selR[60:].plot
?
現(xiàn)在我們可以清楚地看到我們應(yīng)該何時(shí)買入或賣出相應(yīng)的股票。
現(xiàn)在,我們可以期望從這個(gè)策略中獲得多少收益?
# 使用簡(jiǎn)單的 strydef 進(jìn)行交易:
# 如果窗口長(zhǎng)度為0,算法沒有意義,退出
# 計(jì)算滾動(dòng)平均值和滾動(dòng)標(biāo)準(zhǔn)差
比率 = S1/S2
a1 = rais.rolng
zscoe = (ma1 - ma2)/std
# 模擬交易
# 對(duì)于范圍內(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
對(duì)于從策略制定的策略來說,這是一個(gè)不錯(cuò)的利潤(rùn)。
改進(jìn)的領(lǐng)域和進(jìn)一步的步驟
這絕不是一個(gè)完美的戰(zhàn)略,我們戰(zhàn)略的實(shí)施也不是最好的。但是,有幾件事可以改進(jìn)。
1. 使用更多的證券和更多樣化的時(shí)間范圍
對(duì)于配對(duì)交易策略的協(xié)整測(cè)試,我只使用了少數(shù)股票。自然地(并且在實(shí)踐中)在行業(yè)內(nèi)使用集群會(huì)更有效。我只用了只有5年的時(shí)間范圍,這可能不能代表股市的波動(dòng)。
2. 處理過擬合
任何與數(shù)據(jù)分析和訓(xùn)練模型相關(guān)的事情都與過擬合問題有很大關(guān)系。有許多不同的方法可以處理像驗(yàn)證這樣的過擬合,例如卡爾曼濾波器和其他統(tǒng)計(jì)方法。
3. 調(diào)整交易信號(hào)
我們的交易算法沒有考慮到相互重疊和交叉的股票價(jià)格??紤]到該代碼僅根據(jù)其比率要求買入或賣出,它并未考慮實(shí)際上哪個(gè)股票更高或更低。
4. 更高級(jí)的方法
這只是算法對(duì)交易的冰山一角。這很簡(jiǎn)單,因?yàn)樗惶幚硪苿?dòng)平均線和比率。如果您想使用更復(fù)雜的統(tǒng)計(jì)數(shù)據(jù),請(qǐng)使用。其他復(fù)雜示例包括 Hurst 指數(shù)、半衰期均值回歸和卡爾曼濾波器等主題。
最受歡迎的見解
1.R語言對(duì)S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
2.R語言改進(jìn)的股票配對(duì)交易策略分析SPY—TLT組合和中國(guó)股市投資組合
3.R語言時(shí)間序列:ARIMA GARCH模型的交易策略在外匯市場(chǎng)預(yù)測(cè)應(yīng)用
4.TMA三均線期指高頻交易策略的R語言實(shí)現(xiàn)
5.r語言多均線量化策略回測(cè)比較
6.用R語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
7.r語言預(yù)測(cè)波動(dòng)率的實(shí)現(xiàn):ARCH模型與HAR-RV模型
8.R語言如何做馬爾科夫轉(zhuǎn)換模型markov switching model
9.matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)