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
    

    构造矩阵使用execpivot 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一个函数
    argsfunc的参数

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

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

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

    peach是并行计算版本的each模板函数。对于执行时间较长的任务,peacheach能节省大量的时间。对于小人物,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  
    

    在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值