DolphinDB使用案例10:计算股票的两两相关性
-
读取股票数据
本ID构建了1990-2018年所有A股交易数据
CHstock1990_2008.csv
(如有需要,可留言索取)# 读取数据 schema = extractTextSchema("D:/DolphinDB/Data/CHstock1990_2018.csv") # 提取数据结构 update schema set type= `symbol where name=`col0 # 更新数据结构 CHstocks = ploadText("D:/DolphinDB/Data/CHstock1990_2018.csv", , schema) # 以更新后的数据结构载入CHstocks
-
选择成交量最大的100只股票的代码
# 提取历史成交量最大的100只股票的股票代码 num = 100 syms = (exec sum(vol) as totalVolume from CHstocks group by ts_code order by totalVolume desc).ts_code[0:num]
-
exec选择函数
select语句总是生成一张表,即使我们只选择一列。
exec语句生成一个标量或一个向量。
如果exec选择了多列,则效果和select一样。
当和
pivot by
共同使用时,exec
生成一个矩阵。 -
desc
syms = (exec sum(vol) as totalVolume from CHstocks group by ts_code order by totalVolume desc
desc
不是函数,算是一个参数,用在order等排序函数后面,表示降序。esc
则表示升序。 -
构造股票每月交易价格的矩阵
列表示股票,行表示月份。
#构造每个月交易价格矩阵 priceMatrix = exec wavg(open, vol) as wavp from CHstocks where ts_code in syms, trade_date.month() between 2008.01M:2018.12M pivot by trade_date.month() as month, ts_code
构造矩阵使用
exec
和pivot by
结合。select
只能构造表。exec
可以构造标量、向量、表、矩阵。 -
wavg加权平均数
wavg(X,Y)
参数 意义 备注 X 值的向量 Y 权重向量 计算加权平均数:X中的每个元素被赋予一个权重,即Y中的对应值。这些权重决定了在平均值计算中的相对重要性。
权重向量会自动缩放,使得权重向量的和为1.
-
计算股票回报矩阵
使用模板函数each把ratios函数应用到交易价格矩阵的每一列。生成相同维度的股票回报矩阵。
# 计算股票收益矩阵 retMatrix = each(def(x):ratios(x)-1,priceMatrix)
-
each模板函数
each是一个模板函数,关于模板函数,参见《DolphinDB使用案例5:透视数据pivot》。模板函数简单理解为一种基于函数和数据的管道。
each(func, args...)
参数 意义 备注 func 一个函数 args func的参数 把一个函数应用到指定参数中的每个元素。
对于矩阵,把函数应用到每一列;
对于表,把函数应用到每一行。
peach
是并行计算版本的each
模板函数。对于执行时间较长的任务,peach
比each
能节省大量的时间。对于小人物,peach
可能执行时间要比each
更长,因为并行函数调用的开销很大。 -
通过股票回报矩阵生成股票回报相关矩阵
# 计算股票收益相关矩阵 corrMatrix = cross(corr, retMatrix, retMatrix)
通过模板函数cross,生成100*100的股票回报相关矩阵。
-
cross模板函数
cross(func, X, Y)
参数 意义 备注 func 二元函数 X 可以是数据对、向量、矩阵 X和Y可以又不同的数据形式或维度 Y 可选参数 如果没有指定,将会执行cross(func, X, X),func必须是对称二元函数 将X和Y中元素的两两组合作为参数来调用函数。如果X或Y是矩阵,以列为单位遍历。
pcross
是并行计算版本的cross
模板函数。 -
取每支股票相关性最高的10只股票
# 取每支股票相关性最高的10只股票 mostCorrelated = select * from table(corrMatrix).rename!(`sym`corrSym`corr) context by sym having rank(corr, false) between 1:10
-
rename!赋名
rename!(X, Y, [Z])
参数 意义 备注 X 向量、矩阵或表 Y 当X是向量,Y是字符串或符号;
当X是矩阵,如果Z没有指定,则Y是列标签;
如果Z指定了,则Y是行标签。
当X是表时,如果Z没有指定,则Y从左到右是新的列名;
如果Z制定了,则Y是旧的列名,Z是对应的新的列名。对于向量,
rename!
赋予其一个新的标签;对于矩阵,
rename!
给列(和行)添加标签;对于表,
rename!
把已存在的列名替换为新的列名。 -
having
having
子句总是跟在group by
或者context by
后,用来将select语句返回的结果在此进行过滤,只返回汉族指定条件的聚合函数值的组结果。如果
having
用在group by
后面,having
与聚合函数一起使用,结果是符合聚合函数条件的分组。如果
having
用在group by
后面,并且只与聚合函数一起使用,结果是符合聚合函数条件的分组。如果
having
用在group by
后面,与非聚合函数一起使用,结果是符合指定条件的分组。 -
rank排序函数
rank(X, [ascending=true],[groupNum])
参数 意义 备注 X 一个待排序的向量 ascending 布尔值,表示排序方向 ture:升序()默认
false:降序groupNum 正整数 表示排序形成的组的数量 基于升序/降序排序,返回X中每个元素的排名。
如果指定了
groupNums
,把X分成多个组,返回X中每个元素属于的组别数。 -
选择与000009.SZ相关性最高的10只股票
# 选取与000009.SZ相关性最高的10只股票 select * from mostCorrelated where sym="000009.SZ" order by corr desc
下一篇: PHP自定义函数判断是哪种提交方式