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

Q:天软中如何计算证券波动率    

简述
波动率 = 对数收益率序列的标准差
  • A:低频数据计算波动率
    可使用已有公用模型:
    N日标准差(用对数收益率计算的N日标准差,即波动率):FAQ:StockStdev2
    支持任意周期,效率较高,推荐使用。

    若除了获取波动率外,还需要获取如Beta,Alpha,平均收益率,收益率标准差,残差标准差等,则可考虑使用下面这两个模型(多指标批量提取示例可参考示例06):
    风险指标可使用:FAQ:StockBetaAlpha2
    波动率函数(调用StockBetaAlpha2):FAQ:StockRisk
    支持日线,周线,月线等低频。

    示例01:通过指定区间的日线数据计算波动率
    //计算万科A在指定区间内的波动率,收益率序列为日线
    begt:=20220101T;
    endt:=20220630T;
    SetSysParam(pn_stock(),'SZ000002');
    SetSysParam(pn_cycle(),cy_day()); //日线
    setsysparam(pn_date(),endt);
    return StockStdev2(tradedays(begt,endt));

    返回:2.83756576955116
    示例02:计算指定区间的每日波动率(由最近N日收益率计算)
    begt:=20220101T;
    endt:=20220630T;
    N:=20;//取最近20个交易日的数据计算
    SetSysParam(pn_stock(),'SZ000002');
    SetSysParam(pn_cycle(),cy_day()); //日线
    setsysparam(pn_date(),endt);
    Nd:=tradedays(begt,endt);
    return Nday(Nd,"time",datetostr(sp_time()),
           "波动率",StockStdev2(N));

    返回:(部分结果截图)



    日内高频数据计算波动率
    可使用时间序列模型Nday与sp_std进行计算得到。
    示例03:计算指定区间内1分钟线的波动率序列
    begt:=20250714.09T;//开始时间
    endt:=20250714.16T;//截止时间
    N:=20;//取最近20个交易日的数据计算
    SetSysParam(pn_stock(),"SH600519");
    SetSysParam(pn_cycle(),cy_1m()); //分钟线
    setsysparam(pn_date(),endt);
    Nd:=tradedays(begt,endt);
    return Nday(Nd,"time",datetimetostr(sp_time()),
           "波动率",StockStdev2(N));



    批量提取-月度波动率(当月日线价格序列计算波动率)
    示例04:提取一段时间内指定板块每月的波动率
     begt:=20240101T; //开始时间
      endt:=20241231T; //截止时间
      //月线序列
      setsysparam(pn_cycle(),cy_month());
      setsysparam(pn_stock(),"SH000001");
      Tarr:=Markettradedayqk(begt,endt);
      if not istable(Tarr) then return array();
      vBegt:=specdate(ref(sp_time(),1),Tarr[0])+1;//第一个月线的开始日
      SetSysParam(pn_cycle(),cy_day()); //日线-用日线价格序列计算波动率
      ret:=array();
      for i,vEndt in Tarr do
      begin
       intD:=datetoint(vEndt);
       setsysparam(pn_date(),vEndt);
       stocks:=getAbkbydate("上证A股",vEndt);//指定日上证A股
       for j,stockid in stocks do
       begin
         setsysparam(pn_stock(),stockid);
         ret[stockid][intD]:=StockStdev2(tradedays(vbegt,vEndt));
       end;
       vBegt:=vEndt+1;
      end;
      return ret;

    返回:(部分结果截图)


    示例06:批量提取多风险指标-每月度的日线计算值
      begt:=20240101T; //开始时间
      endt:=20241231T; //截止时间
      //月线序列
      setsysparam(pn_cycle(),cy_month());
      setsysparam(pn_stock(),"SH000001");
      Tarr:=Markettradedayqk(begt,endt);
      if not istable(Tarr) then return array();
      vBegt:=specdate(ref(sp_time(),1),Tarr[0])+1;//第一个月线的开始日
      SetSysParam(pn_cycle(),cy_day()); //日线-用日线价格序列计算风险指标
      ret:=array();k:=0;
      for i,vEndt in Tarr do
      begin
       intD:=datetoint(vEndt);
       setsysparam(pn_date(),vEndt);
       stocks:=getAbkbydate("上证A股",vEndt)[0:9];//指定日上证A股前10个股票-方便展示
       for j,stockid in stocks do
       begin
         setsysparam(pn_stock(),stockid);
         r:=StockBetaAlpha2('SH000001',vbegt,vEndt);
         ret[k]:=r;
         ret[k,"Stockid"]:=stockid;
         ret[k,"Date"]:=intD;
         k++;
       end;
       vBegt:=vEndt+1;
      end;
      ret:=select ["Stockid"],["Date"],* from ret end;//将 "Stockid","Date" 前移
      return ret;

    返回:(部分结果截图)