# 指数研究 / 指数计算

## `tsIndexBackTesting_base`

声明：class

指数计算框架

<!-- tags: 基准指数 指数产品 指数编制 指数回测 成分股 -->

### `GetTimeSeries()`

声明：function

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

<!-- tags: 查询 时序 序列数据 基准指数 指数产品 时间处理 日期时间 列表 -->

可见性：`public`

### `GetIndexStock(end_t)`

声明：function

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

<!-- tags: 查询 证券 个股 -->

可见性：`public`

| 参数    | 类型     | 说明           |
| ------- | -------- | -------------- |
| `end_t` | datetime | 截止日，日期型 |

### `GetIndexTmpAdjustStock(endt)`

声明：function

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

<!-- tags: 查询 证券 个股 基准指数 指数产品 -->

可见性：`public`

| 参数   | 类型     | 说明           |
| ------ | -------- | -------------- |
| `endt` | datetime | 截止日，日期型 |

### `InitWeightAndDiv(p_endt, tpdiv_table, tp_next_weight_table)`

声明：function

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

<!-- tags: 组合权重 资产配置 -->

可见性：`public`

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

### `Updatestockinfo_GetWeight(endt, stock_table)`

声明：function

指定日权重计算模型

<!-- tags: 查询 组合权重 资产配置 -->

可见性：`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

权重因子计算模型

<!-- tags: 查询 因子分析 因子指标 组合权重 资产配置 -->

可见性：`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

区间调仓权重

<!-- tags: 查询 组合权重 资产配置 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetOpenWeightData(begt, endt)`

声明：function

区间开盘权重信息

<!-- tags: 查询 组合权重 资产配置 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetNextOpenWeightData(begt, endt)`

声明：function

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

<!-- tags: 查询 组合权重 资产配置 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetDivisorData(begt, endt)`

声明：function

区间指数除数信息

<!-- tags: 查询 基准指数 指数产品 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetCloseWeightData(begt, endt)`

声明：function

区间收盘权重信息

<!-- tags: 查询 组合权重 资产配置 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetIndexReturn(beg_t, end_t)`

声明：function

指数区间收益率，实数

<!-- tags: 查询 回报率 投资收益 基准指数 指数产品 -->

可见性：`public`

| 参数    | 类型     | 说明         |
| ------- | -------- | ------------ |
| `beg_t` | datetime | 起始日，日期 |
| `end_t` | datetime | 截止日，日期 |

### `GetIndexReturn2(begt, endt)`

声明：function

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

<!-- tags: 查询 基准指数 指数产品 列表 集合 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetIndexReturnandRisk(begt, endt)`

声明：function

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

<!-- tags: 查询 风险管理 风控 基准指数 指数产品 列表 集合 -->

可见性：`public`

| 参数   | 类型     | 说明         |
| ------ | -------- | ------------ |
| `begt` | datetime | 起始日，日期 |
| `endt` | datetime | 截止日，日期 |

### `GetIndexDailyHQPerf(begt, endt, src_cycle)`

声明：function

区间日线行情信息

<!-- tags: 查询 绩效 业绩表现 市场数据 价格数据 -->

可见性：`public`

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

### `GetIndexHisData()`

声明：function

区间清算指数点位信息

<!-- tags: 查询 基准指数 指数产品 -->

可见性：`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;
```
