FAQ > 金融建模 > 建模问题 > 期权相关

Q:指定标的期权认购认沽对照指标数据展示    

  • A:【报表实现】
    样本:某个标的在具体某个月份下的所有期权合约
    指标:价格,涨幅(%),成交量,持仓量,日增仓,GAMA,Delta,买一价,卖一价等
    数据展示:一个行权价为一行数据,左边认购,右边认沽,同时展示相关指标
    【实现代码】
    1、下载FAQ_GetOptionsData01.fun附件,并导入用函数附件:FAQ_GetOptionsData01.fun
     导入用户函数方法请参考:FAQ:Q:如何导入函数
     或复制第3步中源代码,自行进行封装,面后调用。
    2、调用
     return FAQ_GetOptionsData01("SH510300",20260414T,2604);

    结果展示(部分结果展示):

    3、FAQ_GetOptionsData01函数定义说明
    定义:FAQ_GetOptionsData01(BDid="SH000300",endt=today(),YYDD)
    说明:获取指定日指定标的期权认购认沽对照指标数据
    参数:
    BDid:标的代码,缺省时为"SH000300"
    endt:指定日,缺省时为今天
    YYDD:指定到期年月,整型,如2604,表示只取2026年4月份到期的期权合约样本,不指定时,不做这个筛选
    返回:数组,左边看涨合约指标,右边看跌合约指标,中间是行权价,具体可参与上面示例
    实现原码:
    Function FAQ_GetOptionsData01(BDid="SH000300",endt=today(),YYDD);
    Begin
    //某个标的在具体某个月份下的所有期权合约
      QQStocks:= OP_GetOptionList(BDid,endt);
      DEndt:=datetoint(endt);
      List:=select ["StockID"],["截止日"],["合约简称"],["合约交易代码"],["期权类型"],["行权价"],["到期日"]
        ,(["到期日"] div 100)%10000 as "YYDD"
        from infotable 720 of QQStocks where ["截止日"]=dEndt end;
      if ifnumber(YYDD) then
       List:=select * from List where ["YYDD"]=YYDD end;
      //取指标--价格,涨幅(%),成交量,持仓量,日增仓,GAMA,Delta,买一价,卖一价,
      setsysparam(pn_date(),endt);
      setsysparam(pn_cycle(),cy_day());
      for i:=0 to length(list)-1 do
      begin
       setsysparam(pn_stock(),list[i,"StockID"]);
       list[i,"价格"]:=close();
       list[i,"涨幅(%)"]:=StockZf7(endt,endt); //(截止日收盘价-开始日前结算价)/开始日前结算价*100%
       list[i,"涨跌"]:=close()-Prev_Settlement();
       list[i,"成交量"]:=vol();
       list[i,"持仓量"]:=OpenInterest();
       list[i,"日增量"]:=OpenInterest()-ref(OpenInterest(),1);
       list[i,"买一价"]:=buy1();
       list[i,"卖一价"]:=sale1();
       list[i,"Gama"]:=OP_Gamma();
       list[i,"Delta"]:=OP_delta();
      end
     //--拼报表
      t:= select ["行权价"],select * from thisgroup end as "GRP" from List group by ["行权价"] order by ["行权价"] desc end;
      re:=array();
      //展示的指标及先后位置
       //看涨
      hzRow:=array("StockID","合约交易代码","Gama","Delta","日增量","涨幅(%)","持仓量","成交量","卖一价","买一价","涨跌","价格","看涨");
        //看跌
      hdRow:= reverse(hzRow); //倒置
      hdRow::=mcell<>"看涨"?mcell:"看跌"; //看涨改成看跌
      // hdRow:=array("看跌","价格","涨跌","买一价","卖一价","成交量","持仓量","涨幅(%)","日增量","Delta","Gama","合约交易代码");
      for i:=0 to length(t)-1 do
      begin
        tmp:=t[i,"GRP"];
        hz:=select *,"C" as "看涨" from tmp where ["期权类型"]="认购" end;
        hd:=select *,"P" as "看跌" from tmp where ["期权类型"]="认沽" end;
        hzR:= Field_AddPrefix(hz[:,hzRow],"看涨@",0);
        hdR:= Field_AddPrefix(hd[:,hdRow],"看跌@",0);
        re&= hzR|array(("行权价":t[i,"行权价"]))|hdR;
      end
      return re;
    End;