# 指数研究 / 指数计算 ## `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:调用示例 ```tsl 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:调用示例 ```tsl 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:调用示例 ```tsl 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:调用示例 ```tsl 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:调用示例 ```tsl //区间调整信息 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; ```