FAQ > 金融建模 > 应用案例 > 指标或功能实现

Q:如何获取指定日市场的涨跌幅分布数量    

简述
根据个股的涨跌幅,汇总当日市场中不同涨幅大小区间中的数量
比如涨0-1% 1-5%,5%以上等
  • 说明:个股涨幅可通过stockzf等模型计算,要统计市场涨幅的分布情况,需要根据自定义的涨幅区间进行分类统计得到,这里针对这类统计做了一个实现范例,供用户参考。
    FAQ:StockZf3
    需求说明:下面是实现指定日所有A股个股涨幅的一个分布统计。
    统计规则为:下跌(<0%),上涨分为 0-1%, 1-5%,5%以上。
    实现代码一:指定日的实现
    //取数
       endt:=20240219T;
       stocks:=getAbkbydate("A股",endt);
       setsysparam(Pn_date(),endt);
       setsysparam(pn_cycle(),cy_day());
       stockdata:=select thisrow as '代码',spec(stockzf3(),thisrow) as '涨幅(%)'
          from stocks where spec(istradeday(endt),thisrow) end;
       //统计
        lambda:=function(v) //匿名函数,实现统计规则
        begin
          Case v of //前开后闭
          -inf to 0:return "<0%";
          0 to 1:return "0-1%";
          1 to 5:return "1-5%";
          5 to inf:return "5+%";
          end;
        end;
       //查看每个个股的一个所属分布可通过下面代码实现
       // t:= select *,lambda.do(['涨幅(%)']) as '类别' from stockdata end;
      //直接统计分类的个数-->比分组统计效率高
       r:=array();
       for i:=0 to length(stockdata)-1 do
         r[lambda.do(stockdata[i]['涨幅(%)'])]++;
       return r[array("<0%","0-1%","1-5%","5+%")];

    返回如:

    实现代码二:多日市场的结果展示
    将实现一中的实现过程封装成独立函数,然后,取时间序列进行循环调用,合并结果即可
    实现如下:
    第一步:封装函数getAZFDisTrib(endt)
    function getAZFDisTrib(endt);
    begin
       //取数
      //endt:=today();
      stocks:=getAbkbydate("A股",endt);
      setsysparam(Pn_date(),endt);
      setsysparam(pn_cycle(),cy_day());
      stockdata:=select thisrow as '代码',spec(stockzf3(),thisrow) as '涨幅(%)'
       from stocks where spec(istradeday(endt),thisrow) end;
      //统计
      lambda:=function(v) //匿名函数,实现统计规则
      begin
       Case v of //前开后闭
       -inf to 0:return "<0%";
       0 to 1:return "0-1%";
       1 to 5:return "1-5%";
       5 to inf:return "5+%";
       end;
      end;
      // t:= select *,lambda.do(['涨幅(%)']) as '类别' from stockdata end;
      r:=array();
      r["日期"]:=datetostr(endt);//增加指定日的返回,便于上层调用
      for i:=0 to length(stockdata)-1 do
       r[lambda.do(stockdata[i]['涨幅(%)'])]++;
      return r[array("日期","<0%","0-1%","1-5%","5+%")];
    end

    第二步:执行调用
      tim:=MarketTradeDayQk(20240201T,20240220T);//取区间市场交易日序列
      r:=array();
      for i:=0 to length(tim)-1 do
        r[i]:=getAZFDisTrib(tim[i]);
      return r;

    返回展示: