Example 10. 计算股票的两两相关性



DolphinDB的编程语言表达能力非常强。在下面的例子中,我们对一天中股票的分笔交易数据进行操作。按照以下步骤,根据每分钟的股票收益来计算500只最具流动性的股票的两两相关性:


1.选择500只最具流动性的股票的股票代码。



num=500

syms = (exec sum(Trade_Volume) as totalVolume from trade where time.second() between 09:30:00 : 15:59:59 group by Symbol order by totalVolume desc).Symbol[0:num]



2.构造股票每分钟交易价格的矩阵。列表示股票,行表示分钟。注意,这里使用exec生成矩阵,因为使用select语句生成的是表;pivot by是用于整理矩阵。



priceMatrix = exec wavg(Trade_Price, Trade_Volume) as wavp from trade where Symbol in syms, Time.second() between 09:30:00 : 15:59:59 pivot by Time.minute() as minute, Symbol



3.使用模板函数each来把ratios函数应用到交易价格矩阵的每一列。结果是与步骤2生成的矩阵维度相同的股票回报矩阵。



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



4.对股票回报矩阵使用模板函数cross,生成一个500*500的股票回报相关矩阵。



corrMatrix = cross(corr, retMatrix, retMatrix)



我们已经生成了500只最具流动性的股票的两两相关性矩阵。取每只股票相关性最高的10只股票:



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



“context by”指定了应用函数的分组。“context by”与“having”一起使用得到的结果是符合“having”条件的记录行。如果“having”后面是聚合函数,得到的记录行有可能是整个分组;如果“having”后面是非聚合函数,得到的是组内部分记录行。


取与XOM股票相关性最高的10只股票:



select * from mostCorrelated where sym="XOM" order by corr desc


Download source code here.