在制定投资策略时,我们往往会研究股票之间的相关性。研究个股的相关性或者个股与指数,ETF之间的相关性,从而通过对冲套利来获得稳定收益。找到最相关的股票,可以根据交易员的经验,也可以根据股票的相关信息(行业,beta,每日回报等)。
本文将介绍如何利用海量的高频数据寻找最相关的股票。
假设我们有一个数据表quotes,包含以下字段:
symbol:股票代码
date:日期
time:时间
bid:买入价格
ofr:卖出价格
下面以纽约证券交易所2007年8月一个月实时报价数据的数据表quotes为例,计算股票在2007年8月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 descsymcorrSym corrLEHMS 0.7027LEHGS 0.6825LEHMER 0.6788LEHIAI 0.6785LEHIYG 0.6481LEHIWF 0.6296LEHOEF 0.6287LEHIYF 0.6275LEHIWP 0.6213LEHIWB 0.6161
性能分析
在2007年8月1日,共有8361只股票的实时报价数据,大约是3.8亿条数据。上面的代码需要对数据进行过滤,按分钟聚合,形成数据表透视,并进行矩阵迭代运算,如此复杂的计算任务,DolphinDB在一个4节点(每节点8核)的集群上耗时仅8秒。除此之外,DolphinDB的代码十分简洁高效,只需4行核心代码即可实现,这得益于功能强大的编程语言。如果你对DolphinDB编程语言感兴趣,可以查看DolphinDB的混合范式编程。