在制定投資策略時,咱們每每會研究股票之間的相關性。研究個股的相關性或者個股與指數,ETF之間的相關性,從而經過對衝套利來得到穩定收益。找到最相關的股票,能夠根據交易員的經驗,也能夠根據股票的相關信息(行業,beta,每日回報等)。ios
本文將介紹如何利用海量的高頻數據尋找最相關的股票。git
假設咱們有一個數據表quotes,包含如下字段:github
symbol:股票代碼編程
date:日期app
time:時間編程語言
bid:買入價格ide
ofr:賣出價格函數
下面以紐約證券交易所2007年8月一個月實時報價數據的數據表quotes爲例,計算股票在2007年8月1日的兩兩相關性。性能
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. 構造股票每分鐘交易價格的矩陣。列表示股票,行表示分鐘。spa
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的混合範式編程。