Files
playbook/skills/tsl-api-reference/references/codegen/module/ts-index-back-testing-base.md
T

14 KiB

指数研究 / 指数计算

tsIndexBackTesting_base

声明:class

指数计算框架

getTimeSeries()

声明:function

指数调仓日历,一维 or 二维数组。需重写该方法

可见性:public

getIndexStock(end_t)

声明:function

指定日调仓信息。需重写该方法

可见性:public

参数 类型 说明
end_t datetime 截止日,日期型

getIndexTmpAdjustStock(endt)

声明:function

指定日指数临调仓信息。需重写该方法

可见性:public

参数 类型 说明
endt datetime 截止日,日期型

initWeightAndDiv(p_endt, tpdiv_table, tp_next_weight_table)

声明:function

初始化权重和除数信息;主要用于非初始化清算时区间清算下的除数和权重数据赋值

可见性:public

参数 类型 说明
p_endt datetime 截止日期,一般为计算开始日;缺省时取开始日期,非交易日按下个交易日处理
tpdiv_table array 区间内除数与权重变更数据表
tp_next_weight_table array 股票清算时表示下个交易日开盘参考权重,包含字段如下: 字段 类型 含义

updatestockinfo_GetWeight(endt, stock_table)

声明:function

指定日权重计算模型

可见性:public

参数 类型 说明
endt datetime 截止日,日期型
stock_table array 样本池信息,二维数组。包含截止日、代码字段

示例

范例01:调用示例

Endt := 20260407T;
StockData := Select Endt as "截止日",
    thisrow as "代码"
    from GetBK("沪深300")
    End;
obj := New tsIndexBackTesting_base();
obj.FStockWeight := 9;
obj.FSharesType := 4;
return obj.updatestockinfo_GetWeight(Endt,StockData);

updatestockinfo_GetWeightFactorByWeight(stock_table, endt, close_type, share_type)

声明:function

权重因子计算模型

可见性:public

参数 类型 说明
stock_table array 指定日权重数据,包含字段:截止日、代码、比例(%)
endt datetime 截止日
close_type integer 价格选项,取值如下: 0:系统昨收 1:收盘价 2:开盘参考价
share_type integer 股本选项,参考 FShareType 说明

示例

范例01:调用示例

Endt := 20260407T;
StockData := Select Endt as "截止日",
    thisrow as "代码"
from GetBK("沪深300")
    End;
ShareType := 4;
CloseType := 1;
obj := New tsIndexBackTesting_base();
return
obj.updatestockinfo_GetWeightFactorByWeight(StockData,Endt,CloseType,ShareType);

getAdjustWeightData(begt, endt)

声明:function

区间调仓权重

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getOpenWeightData(begt, endt)

声明:function

区间开盘权重信息

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getNextOpenWeightData(begt, endt)

声明:function

区间下日权重开盘参考信息

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getDivisorData(begt, endt)

声明:function

区间指数除数信息

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getCloseWeightData(begt, endt)

声明:function

区间收盘权重信息

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getIndexReturn(beg_t, end_t)

声明:function

指数区间收益率,实数

可见性:public

参数 类型 说明
beg_t datetime 起始日,日期
end_t datetime 截止日,日期

getIndexReturn2(begt, endt)

声明:function

指数区间走势信息,二维数组

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getIndexReturnandRisk(begt, endt)

声明:function

区间指数风险回报信息,二维数组

可见性:public

参数 类型 说明
begt datetime 起始日,日期
endt datetime 截止日,日期

getIndexDailyHQPerf(begt, endt, src_cycle)

声明:function

区间日线行情信息

可见性:public

参数 类型 说明
begt datetime 起始日
endt datetime 起始日
src_cycle string 源数据周期,一般 30s 或 1 分钟线 缺省时持仓<3000 时为 30s,否则 1 分钟

getIndexHisData()

声明:function

区间清算指数点位信息

可见性:public

示例

范例01:调用示例

begt := 20201231T;
Endt := 20251231T;

obj := CreateObject("MytsIndexBackTesting");
//-------------------------==常用属性==----------------------------
obj.FBegT := begt;
obj.FendT := Endt;
obj.Fcycle := cy_month();//月线
obj.FSharesType := 4; //自由流通股本
obj.FISDividend := 2; //价格指数
obj.FStockWeight := 1;//等权重
obj.FIndexID := "SH000300";//基准指数
obj.Frunmode := "runback";//runback 模式

//-------------------------==自定义属性==----------------------------
obj.MajorIndexID := "SH000300"; //样本代码指数

//主函数调用
obj.BackTest();

 //结果返回
return array(

         "调仓日历":obj.GetTimeSeries(),
   '-----成分详情-----':'-----------',
         "调仓权重明细":obj.GetAdjustWeightData(begt,Endt),
         "成分变动明细":obj.GetIndexStockInfo(begt,Endt),

 '-----收益与走势-----':'-----------',
        "区间收益率(%)":obj.GetIndexReturn(BegT,EndT),




             "区间走势":obj.GetIndexReturn2(BegT,EndT),
             "风险回报":obj.GetIndexReturnandRisk(begt,Endt),

   '-----最新权重-----':'-----------',
   "次日开盘权重(最新)":obj.GetNextOpenWeightData(),
       "收盘权重(最新)":obj.GetCloseWeightData(endt, endT),
);
Type MytsIndexBackTesting=class(tsIndexBackTesting_base)
   MajorIndexID;
   Function GetIndexStock(endT); override;
   Begin
         //默认:调仓日 按 收盘调入,次日开盘生效
      stocks := getbkbydate(MajorIndexID,endt);
      return select Endt as "截止日",thisrow as "代码" from Stocks End;
   End
End;

范例02:调用示例

begt := 20210101T;
Endt := 20251231T;

//昨点位除数信息
TPPointInfo := array("截止日":NIL,"点位值":1100,"除数":303117200.0);
//当日开盘参考信息
TPGP := array(
   ("股本":11617732201.0,"代码":"SZ000002","计算用股本":11617732201L,"权重因
子":1,"开盘参考价":28.7),);
obj := CreateObject("MytsIndexBackTesting");
obj.FBegT := begt;
obj.FendT := endT;
obj.FISDividend := 2; //价格指数
obj.FSharesType := 4; //自由流通股本
obj.FStockWeight := 1; //等权
obj.FIndexID := "SH000300";

//昨点位和昨持仓赋值
obj.InitWeightAndDiv(nil,TPPointInfo,TPGP);

//其它参数




obj.FIndexShowID := "TSDemo100001";

//主函数调用
obj.BackTest();
//结果返回
return array(
   "调仓日历":obj.GetTimeSeries(),
   '-----成分详情-----':'-----------',
      "调仓权重明细":obj.GetAdjustWeightData(begt,Endt),
      "成分变动明细":obj.GetIndexStockInfo(begt,Endt),

   '-----收益与走势-----':'-----------',
      "区间收益率(%)":obj.GetIndexReturn(BegT,EndT),
      "区间走势":obj.GetIndexReturn2(BegT,EndT),
      "风险回报":obj.GetIndexReturnandRisk(begt,Endt),

   '-----最新权重-----':'-----------',
      "次日开盘权重(最新)":obj.GetNextOpenWeightData(),
      "收盘权重(最新)":obj.GetCloseWeightData(endt, endT),
);

Type MytsIndexBackTesting=class(tsIndexBackTesting_base)
   Function GetTimeSeries(); override;
   Begin
      CycleMacros := "M_1D+1BD";
      vbegt := IncMonth(FbegT,-1)+1;
      days := QK_get_date_range(vbegt,FEndT,CycleMacros);
      t := array();
      ni := 0;
      for i := 0 to length(days)-1 do
      begin
         d := days[i];
         if i=0 then
            if not (d=StartOfTheMonth(d) and IsMarketTradeDay(d)) then
continue;
         if IsMarketTradeDay(d-1) then
            vd := d-1
         else
            vd := d;
         ld := specdate(ref(SP_time(),1),vd);
         t[ni,"调仓日"] := vd;
         t[ni,"选股日"] := ld;
         t[ni,"权重计算日"] := ld;




         ni++;
      end
      return t;
   End;

   Function GetIndexStock(endT); override;
   Begin
      ov := BackupSystemParameters2();
      stocks := getbkbydate("TSI000001",endt);
      bday := IncMonth(Endt,-3)+1;
      t := array();
      ni := 0;
      for i := 0 to length(stocks)-1 do
      begin
         stockid := stocks[i];
         setsysparam(pn_stock(),stockid);
         if firstday()> bday then continue;
         if not istradeday(endt) or isst_3(Endt) then continue;
         t[ni,"截止日"] := Endt;
         t[ni,"代码"] := StockID;
         t[ni,"名称"] := Stockname(stockid);
         t[ni,"市值"] := StockMarketValue(endt);
         ni++;
      end
      return select drange(0 to 399)["截止日"],["代码"] from t order by ["市
值"] end;
   End
End;

范例03:调用示例

//区间调整信息
StockPoolInfo := array(
("代码":"SZ000538","截止日":20230103T,"权重":0.25),
("代码":"SH600031","截止日":20230103T,"权重":0.25),
("代码":"SH600019","截止日":20230103T,"权重":0.25),
("代码":"SH601088","截止日":20230103T,"权重":0.25),
("代码":"SZ000538","截止日":20240104T,"权重":0.2),
("代码":"SH600031","截止日":20240104T,"权重":0.2),
("代码":"SH600019","截止日":20240104T,"权重":0.2),
("代码":"SH601088","截止日":20240104T,"权重":0.2),
("代码":"SH601398","截止日":20240104T,"权重":0.2),
("代码":"SZ000538","截止日":20250106T,"权重":0.2),
("代码":"SH600031","截止日":20250106T,"权重":0.2),
("代码":"SH600019","截止日":20250106T,"权重":0.2),
("代码":"SH601088","截止日":20250106T,"权重":0.2),
("代码":"SH601398","截止日":20250106T,"权重":0.2),
);
begt := 20230101T;
Endt := 20251231T;
obj := CreateObject("MytsIndexBackTesting");
obj.FBegT := begt;
obj.FendT := Endt;





obj.FISDividend := 2;  //价格指数
obj.FSharesType := 4;  //自由流通市值
obj.FStockWeight := -2; //用户自定义权重
obj.FIndexID := "SH000300";
obj.FStockPoolInfo := StockPoolInfo;

//主函数调用
obj.BackTest();
return array(
"调仓日历":obj.GetTimeSeries(),
'-----成分详情-----':'-----------',
   "调仓权重明细":obj.GetAdjustWeightData(begt,Endt),
   "成分变动明细":obj.GetIndexStockInfo(begt,Endt),

'-----收益与走势-----':'-----------',
   "区间收益率(%)":obj.GetIndexReturn(BegT,EndT),
   "区间走势":obj.GetIndexReturn2(BegT,EndT),
   "风险回报":obj.GetIndexReturnandRisk(begt,Endt),

'-----最新权重-----':'-----------',
   "次日开盘权重(最新)":obj.GetNextOpenWeightData(),
   "收盘权重(最新)":obj.GetCloseWeightData(endt, endT),
);
Type MytsIndexBackTesting=class(tsIndexBackTesting_base)
   FStockPoolInfo;

   Function GetTimeSeries(); override;
   Begin
      return sselect distinct ["截止日"] from FStockPoolInfo where
               ['截止日']>=Fbegt and ['截止日']<=Fendt order by ['截止日']
               end;
   End;

   Function GetIndexStock(endT); override;
   Begin
      return select * from FStockPoolInfo where ["截止日"]=Endt End;
   End
End;