507 lines
14 KiB
Markdown
507 lines
14 KiB
Markdown
# 指数研究 / 指数计算
|
|
|
|
## `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;
|
|
```
|