14 KiB
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;