共计 2016 个字符,预计需要花费 6 分钟才能阅读完成。
在制订投资策略时,咱们往往会钻研股票之间的相关性。钻研个股的相关性或者个股与指数,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]
- 结构股票每分钟交易价格的矩阵。列示意股票,行示意分钟。
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 一起应用时会生成一个矩阵。
- 生成股票回报矩阵
retMatrix = each(def(x):ratios(x)-1, priceMatrix)
- 生成 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 减少了数据操作的灵活性,它能够把函数利用到组内的每个成员,这对组内计算的场景十分有用。
- 这时咱们能够剖析某只股票与其余股票的相关性。比方,取与雷曼兄弟股票相关性最高的 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 的混合范式编程。
感兴趣的敌人能够到官网下载 DolphinDB 钻研个股的相关性。