FAQ > 金融建模 > 建模问题 > 股票相关

Q:证券代码有变更的代码有哪些?数据如何处理的?    

  • A:目前为止,有发布代码变更公告的证券有如下:
    变动日变更前代码变更前名称变更后代码变更后名称
    20100305SH600849上海医药SH601607上海医药
    20180228SH601313江南嘉捷SH601360三六零
    20181226SZ000022深赤湾ASZ001872招商港口
    20191216SZ000043中航善达SZ001914招商积余
    20250217SZ300114中航电测SZ302132中航成飞

    上述列表数据取自【证券.代码变更】表(表ID:159),该表记录了各新旧代码变更前后的关系情况。
    具体取数及整理成表的代码实现如下:
    t:= select * from infotable 159 of getbk("A股;暂停上市;终止上市") order by ["变动日"] end;
    ret:=array();
    for i:=0 to length(t)-1 do
      if t[i,"变更前代码"] in ret[:,"变更前代码"] then continue;
      else ret&=t[i:i];
       
    t:= select *,StockName(["变更前代码"]) as "变更前名称",StockName(["变更后代码"]) as "变更后名称"
      from ret order by ["变动日"] end;
    return t[:,array("变动日","变更前代码","变更前名称","变更后代码","变更后名称")];

    新旧代码交替后,相关数据的处理:
    旧代码的数据不再更新。
    新代码的如下:
    基本面数据:新代码复制一份旧代码的数据,并持续更新。
    财务数据:新代码复制一份旧代码的数据,并持续更新。
    行情数据:新代码复制一份旧代码的日线行情数据,其他高频的暂不处理。(复权在新代码上连续有效)
    回测框架:若持续持有证券的过程中,代码发生变更,框架会自动转出原股份,转入新股份。
    注:用户在给交易明细时,注意根据选股日期给出当时的正确证券代码,如何实现,可参考函数-新旧代码转换(按日期):getTrueStockIDbyDate(StockID,Endt)//获取指定日证券有效代码
    范例1:取一段时间内的60分钟线行情(跨)
    stockid:='SH601360';
      setsysparam(pn_stock(),stockid);
      setsysparam(pn_cycle(),cy_day());
      Tarr:=StockTradeDayQk(20180210T,20180305T);
      setsysparam(pn_cycle(),cy_60m());
      t:=array();
      for i:=0 to length(Tarr)-1 do //一天天取
       t&=select * from markettable datekey Tarr[i] to Tarr[i]+0.99
         of getTrueStockIDbyDate(stockid,Tarr[i]) end;
    return t;


    范例2:回测中的应用,旧代码迁出,新代码迁入,框架自动转换。高频下交易明细用户需正确给出交易的证券代码。
    begt:=20180227T;
      endt:=20180310T;
      obj := createobject('PercentPortfolio');
       //回测开始时间
      obj.FBegT:=begt;
       //回测截止时间
      obj.FEndT:=endt;
       //调仓周期-高频下,由于高频数据新代码没有历史数据,所以需要转代码
      obj.FCycle:=cy_60m();
       //组合类别(数量类组合)
      obj.FGroupType:=2;
       //基准代码
      obj.FIndexId:='SH000300';
       //初始资金
      obj.FIniCash:=1000000;
       //资金配比方式
      obj.FRateType:=-1;
     obj.FCashOption:=0;  //0 不现金对价(默认值),1 现金对价
        //回测
      obj.BackTest();

      return array(
             //---组合基础
            "交易明细":obj.GetTradeData(BegT,EndT),
            "资产配置":obj.GetAssetData(BegT,EndT),
            "持仓明细":obj.GetHoldData(BegT,EndT)
            );
    Type PercentPortfolio=class(TSBackTesting)
      function GetTradeOrder(vEndT);override;
      begin
        Stocks:=array('SZ000002','SH600000','SH601360');
        HolD:= GetHoldData();
        t:=select getTrueStockIDbyDate(thisrow,vEndt) as '代码',1 as '方向',0 as '动作',500 as '成交量'
         from Stocks
         where not (getTrueStockIDbyDate(thisrow,vEndt) in HolD[:,'代码'])
         end;
        return t;
      end;
    End;
    //可通过查看交易明细与持仓明细看出迁入迁出处理过程