欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DolphinDB使用案例10:计算股票的两两相关性

程序员文章站 2022-03-21 09:54:32
...
  • 读取股票数据

    本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]
    

    DolphinDB使用案例10:计算股票的两两相关性

  • 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
    

    构造矩阵使用execpivot by结合。

    select只能构造表。

    exec可以构造标量、向量、表、矩阵。

    DolphinDB使用案例10:计算股票的两两相关性

  • wavg加权平均数
    wavg(X,Y)
    
    参数 意义 备注
    X 值的向量
    Y 权重向量

    计算加权平均数:X中的每个元素被赋予一个权重,即Y中的对应值。这些权重决定了在平均值计算中的相对重要性。

    权重向量会自动缩放,使得权重向量的和为1.

  • 计算股票回报矩阵

    使用模板函数each把ratios函数应用到交易价格矩阵的每一列。生成相同维度的股票回报矩阵。

    # 计算股票收益矩阵
    retMatrix = each(def(x):ratios(x)-1,priceMatrix)
    

    DolphinDB使用案例10:计算股票的两两相关性

  • each模板函数

    each是一个模板函数,关于模板函数,参见《DolphinDB使用案例5:透视数据pivot》。模板函数简单理解为一种基于函数和数据的管道。

    each(func, args...)
    
    参数 意义 备注
    func 一个函数
    args func的参数

    把一个函数应用到指定参数中的每个元素。

    对于矩阵,把函数应用到每一列;

    对于表,把函数应用到每一行。

    peach是并行计算版本的each模板函数。对于执行时间较长的任务,peacheach能节省大量的时间。对于小人物,peach可能执行时间要比each更长,因为并行函数调用的开销很大。

  • 通过股票回报矩阵生成股票回报相关矩阵

    # 计算股票收益相关矩阵
    corrMatrix = cross(corr, retMatrix, retMatrix)
    

    通过模板函数cross,生成100*100的股票回报相关矩阵。

    DolphinDB使用案例10:计算股票的两两相关性

  • 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
    

    DolphinDB使用案例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  
    

    DolphinDB使用案例10:计算股票的两两相关性