乾貨丨如何利用高頻數據找到最相關的股票

c0591d87e27302e30fb82e7d77cdc0a1.jpeg

在制定投資策略時,我們往往會研究股票之間的相關性。研究個股的相關性或者個股與指數,ETF之間的相關性,從而通過對沖套利來獲得穩定收益。找到最相關的股票,可以根據交易員的經驗,也可以根據股票的相關信息(行業,beta,每日回報等)。

本文將介紹如何利用海量的高頻數據尋找最相關的股票。

假設我們有一個數據表quotes,包含以下字段:

symbol:股票代碼

date:日期

time:時間

bid:買入價格

ofr:賣出價格

下面以紐約證券交易所2007年8月一個月實時報價數據的數據表quotes爲例,計算股票在2007年8月1日的兩兩相關性。

  1. 選擇500只最具流動性的股票。注意,由於本文使用的是紐約證券交易所的數據集,所以開盤時間是9:30-16:00。
dateValue=2007.08.01
num=500
syms = (exec count(*) from quotes where date = dateValue, time between 09:30:00 : 15:59:59, 0<bid, bid<ofr, ofr<bid*1.2 group by Symbol order by count desc).Symbol[0:num]

2. 構造股票每分鐘交易價格的矩陣。列表示股票,行表示分鐘。

priceMatrix = exec avg(bid + ofr)/2.0 as price from quotes where date = dateValue, Symbol in syms, 0<bid, bid<ofr, ofr<bid*1.2, time between 09:30:00 : 15:59:59 pivot by time.minute() as minute, Symbol

exec和pivot by是DolphinDB編程語言的特點之一。exec與select的用法相同,但是select子句生成的是表,exec子句生成的是向量。pivot by用於整理維度,與exec一起使用時會生成一個矩陣。

3. 生成股票回報矩陣

retMatrix = each(def(x):ratios(x)-1, priceMatrix)

4. 生成500*500的股票回報相關矩陣

corrMatrix = cross(corr, retMatrix, retMatrix)

這時已經生成了500只最具流動性股票的兩兩相關性矩陣,取每隻股票相關性最高的10只股票。

mostCorrelated = select * from table(corrMatrix.columnNames() as sym, corrMatrix).unpivot(`sym, syms).rename!(`sym`corrSym`corr) context by sym having rank(corr,false) between 1:10

步驟3和步驟4中使用的模板函數each和cross是 DolphinDB database 中的高階函數,它以函數和對象作爲輸入內容,把函數應用到每個對象上。模板函數在複雜的批量計算中非常有用。

context by 語句是 DolphinDB database 編程語言的一個創新,是對標準SQL的擴展,大大簡化了對面板數據的操作。context by與group by類似,都是用於分組計算。它們的區別是,group by對每組計算產生一個結果,而context by可對每組計算產生與組中元素個數相同的結果個數。換句話說,group by返回的結果個數等於組的個數,而context by返回結果的個數等於表中記錄條數。context by增加了數據操作的靈活性,它可以把函數應用到組內的每個成員,這對組內計算的場景非常有用。

5. 這時我們可以分析某隻股票與其他股票的相關性。比如,取與雷曼兄弟股票相關性最高的10只股票。從結果看,排名前三的都是與雷曼兄弟處於同一行業的三個投行。如果要取得更好的效果,避免數據的偶然性,可以計算更多天,然後取平均。

select * from mostCorrelated where sym='LEH' order by corr desc

sym	corrSym	corr
LEH	MS	0.7027
LEH	GS	0.6825
LEH	MER	0.6788
LEH	IAI	0.6785
LEH	IYG	0.6481
LEH	IWF	0.6296
LEH	OEF	0.6287
LEH	IYF	0.6275
LEH	IWP	0.6213
LEH	IWB	0.6161

性能分析

在2007年8月1日,共有8361只股票的實時報價數據,大約是3.8億條數據。上面的代碼需要對數據進行過濾,按分鐘聚合,形成數據表透視,並進行矩陣迭代運算,如此複雜的計算任務,DolphinDB在一個4節點(每節點8核)的集羣上耗時僅8秒。除此之外,DolphinDB的代碼十分簡潔高效,只需4行核心代碼即可實現,這得益於功能強大的編程語言。如果你對DolphinDB編程語言感興趣,可以查看DolphinDB的混合範式編程


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章