FAQ > 金融建模 > 建模问题 > 语法相关

Q:计算序列中每个值的排位百分点的效率问题    

  • 2024-07-31 更新
    新一代服务器与测试服务器,以及两个客户端版本中,已优化了该问题。
    即,使用t:= select *,PercentRankOf(["A"],["A"]) as 'PR' from t end 方式不再存在效率问题。
    FAQ:2024-07-31新一代客户端升级
    2024-07-31 之前
    问题描述:计算排位百分点,一般我们想到的模型是PercentRankOf,它在计算指定值在整个序列中的排位时比较方便,且不需要额外的排名操作。
    但是当需要计算的数量超过一定,如5000个排位百分点时,就会显的非常慢。
    原因是,该模型在计算时,是临时排名然后计算指定值在整个序列中排位的百分点,如计算100个数据点,则需要将整个过程重复100次,因此,在这种情景中效率非常低下。
    此时,我们应该转换成下面这种用法:
    1、对序列进行整体排序
    2、通过排名计算排位比例
    如:计算指定日所有A股的市值排位百分点
    EndT:=20240726T;
    codes:=getabkbydate('上证A股;深证A股;中小企业板;创业板;科创板', EndT);
    codes:=select thisrow as 'code',spec(StockTotalValue(EndT),thisrow) as 'mv' from codes end;
    len:=length(codes);
    t:=select ['code'],['mv'],
      (thisorder-1)/(Len-1) as 'mvrank' from codes order by ["mv"] end;
    return t;


    效率说明:上述操作,order by后做(thisorder-1)/(Len-1) as 'mvrank'操作,该计算过程一般能在1秒内完成,而使用percentrankof(['mv'],['mv']) as 'mvrank'则至少在5秒以上,甚至更长时间。