# 因子指标 / 扩展指标 ## `tsf_factorExtindiCator_base` 声明:class 因子指标计算框架 ### `frf` 声明:field 无风险收益率(%)/最低可接受收益率(%) 可见性:`public` 类型:real ### `configSet(key, value)` 声明:function 设置配置项 可见性:`public` | 参数 | 类型 | 说明 | | ------- | ------ | ------------------ | | `key` | string | 要设置的配置项名称 | | `value` | any | 要写入配置项的值 | #### 示例 范例01:调用示例 ```tsl Obj := new tsf_factorExtindicator_Base(); Obj.configSet('总组数',5); ``` ### `configGet(key)` 声明:function 获取配置项 可见性:`public` | 参数 | 类型 | 说明 | | ----- | ------ | ------------------ | | `key` | string | 要读取的配置项名称 | #### 示例 范例01:调用示例 ```tsl Obj := new tsf_factorExtindicator_Base(); Return Obj.configGet('总组数'); //5 ``` ### `defaultConfig()` 声明:function 默认配置,用户可重载,来设置默认配置,如'总组数','基准指数','回测周期','是否年化' 可见性:`public` 返回:array ### `getIC(begt, endt, ic_type)` 声明:function 获得 IC 数据,需要用户重载,基类未实现,返回空数组,并提示报错:getIC 方法必须重写! 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ----------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,用户可自行对照 | 返回:array ### `getDailyGroupReturnAllG(begt, endt)` 声明:function 获取全部分组的日收益数据;基类未实现,使用时必须重写 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:array ### `getDailyGroupReturn(begt, endt, group_name)` 声明:function 获得指定组名的分组日收益数据 可见性:`public` | 参数 | 类型 | 说明 | | ------------ | --------------- | ---------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `group_name` | string_or_array | 要返回的分组名称或名称数组;为空时返回全部分组 | 返回:array ### `getFactorReturn(begt, endt)` 声明:function 获取因子回归分析数据;基类未实现,使用时必须重写 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:array ### `getgroupstocks(endt, gtype)` 声明:function 获取指定日、指定分组的成分股及因子值;基类未实现,使用时必须重写 可见性:`public` | 参数 | 类型 | 说明 | | ------- | -------- | ------------------------------------------------------------------ | | `endt` | end_date | 日期,截止日 | | `gtype` | int | 分组类型:nil 全部分组;-1 最后一组;-2 多空组;正整数表示对应组号 | 返回:array ### `gettcrq(begt, endt)` 声明:function 获得指定区间的调仓日序列 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:array ### `get_ICI_mean(begt, endt, ic_type)` 声明:function 计算 IC 均值 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,取值与 getIC 模型一致 | 返回:real ### `get_ICI_StdDev(begt, endt, ic_type)` 声明:function 计算 IC 标准差 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,取值与 getIC 模型一致 | 返回:real ### `get_ICI_Absmean(begt, endt, ic_type)` 声明:function 计算 IC 绝对值的均值 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,取值与 getIC 模型一致 | 返回:real ### `get_ICI_Win_pct(begt, endt, ic_type)` 声明:function 计算 IC 胜率(%) 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,取值与 getIC 模型一致 | 返回:real ### `get_ICI_ICIR(begt, endt, ic_type)` 声明:function 计算 ICIR 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | int | 整数,IC 类型,取值与 getIC 模型一致 | 返回:real ### `get_Ri_CumReturn(begt, endt, rt_type)` 声明:function 计算区间累计收益率(%) 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 收益率类型:0 基准;1 多头(第 1 组);2 多头超额(第 1 组减基准);3 空头(最后 1 组);4 空头超额(最后 1 组减基准);5 多空(第 1 组减最后 1 组);6 多空超额(多空减基准);7 因子收益率 | 返回:real ### `get_Ri_volatility(begt, endt, rt_type)` 声明:function 计算区间收益率标准差(%) 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与 Get_Ri_CumReturn模型一致 | 返回:real ### `get_Ri_Sharpe_ratio(begt, endt, rt_type)` 声明:function 计算指定收益类型在区间内的夏普比率 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与 Get_Ri_CumReturn模型一致 | 返回:real ### `get_Ri_Win_pct(begt, endt, rt_type)` 声明:function 计算收益率胜率(%) 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与 Get_Ri_CumReturn模型一致 | 返回:real ### `get_Ri_cagr(begt, endt, rt_type)` 声明:function 计算年化收益率 (%) 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与Get_Ri_CumReturn模型一致 | 返回:real ### `get_Ri_mean(begt, endt, rt_type)` 声明:function 计算平均收益率 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与Get_Ri_CumReturn模型一致 | 返回:real ### `get_Ri_To_CumReturn(begt, endt, rt_type)` 声明:function 指定类型的累计收益率(%)序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 整数,收益率类型,取值与Get_Ri_CumReturn模型一致 | 返回:array ### `get_Ti_AbsMean(begt, endt)` 声明:function 计算 T 值绝对值的均值 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:real ### `get_Ti_AbsSignProp(begt, endt, abstsignv)` 声明:function 计算 T 值大于 abstsignv 的占比 可见性:`public` | 参数 | 类型 | 说明 | | ----------- | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `abstsignv` | real | 实数 | 返回:real ### `get_Crowding_ValuPB(endt, alg_type)` 声明:function 基于估值指标 PB 衡量的因子分化程度,其中 PB 为市净率,BP 为市净率的倒数 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | ------------------------------------------------ | | `endt` | end_date | 日期,截止日 | | `alg_type` | int | 整数,算法类型 取值 含义 备注 0 差值 默认 1 比率 | 返回:real ### `get_Crowding_ValuPE(endt, alg_type)` 声明:function 基于估值指标 PE 衡量因子分化程度,其中 PE 为市盈率,EP 为市盈率的倒数; 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | ------------------------------------------------ | | `endt` | end_date | 日期,截止日 | | `alg_type` | int | 整数,算法类型 取值 含义 备注 0 差值 默认 1 比率 | 返回:real ### `get_Crowding_ValuFac(endt, alg_type)` 声明:function 基于估值指标因子值衡量因子分化程度 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | ------------------------------------------------ | | `endt` | end_date | 日期,截止日 | | `alg_type` | int | 整数,算法类型 取值 含义 备注 0 差值 默认 1 比率 | 返回:real ### `get_Crowding_Corr(begt, endt, alg_type, option)` 声明:function 计算不同因子值的个股收益率之间的相关性 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | -------------------------------------------------------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `alg_type` | int | 整数,算法类型 取值 含义 备注 0 多头-空头 默认 1 多头+空头 2 多头 3 空头 | | `option` | int | 整数,计算相关系数的算法类型 取值 含义 备注 0 日均收益率与组内成分股 默认 1 组内成分股与成分股之间 | 返回:real ### `get_Crowding_Volatility(begt, endt, alg_type)` 声明:function 基于波动率比率衡量因子波动率 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `alg_type` | int | 波动率比率算法:0 多头与空头的波动比率(默认);1 多头与市场的波动比率;2 多空与市场的波动比率;市场指全局配置的基准指数 | 返回:real ### `get_Crowding_AssetCentrality(begt, endt, ep)` 声明:function 计算各分组的资产集中度,并以多头组资产集中度作为当期因子集中度;分组数使用全局配置 可见性:`public` | 参数 | 类型 | 说明 | | ------ | ------------- | ---------------------------------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ep` | real\|integer | 累计贡献度阈值或主成分个数:实数表示累计贡献度阈值,整数表示选用的主成分个数 | 返回:real ### `getFactor_Crowded_TopBottomStocks(begt, endt, zbarr, seq_standard, n)` 声明:function 多空分组指标计算,价差法,即分别算出多组、空组股票池的指标值,加权后相减获得值 可见性:`public` | 参数 | 类型 | 说明 | | -------------- | -------- | ------------------------------------------------------ | | `begt` | end_date | 计算区间的开始日期 | | `endt` | end_date | 计算区间的截止日期 | | `zbarr` | array | 自定义拥挤指标配置表;为空时使用文档列出的六项默认指标 | | `seq_standard` | int | 时序标准化方式:-1 不处理;0 百分位;1 Z 值 | | `n` | int | 移动时序标准化窗口期数,默认 3 期 | 返回:array ### `getFactor_Discrete(begt, end_t, seq_standard, n)` 声明:function 计算因子值分化度, 支持移动时序标准化处理 可见性:`public` | 参数 | 类型 | 说明 | | -------------- | -------- | ------------------------------------------------------------------ | | `begt` | end_date | 日期,开始日 | | `end_t` | end_date | 日期,截止日 | | `seq_standard` | int | 整数,结果时序标准化方式,与 GetFactor_Crowded_TopBottomStocks一致 | | `n` | int | 整数,移动窗口期数,默认为3 期,进行时序标准化处理时生效 | 返回:array ### `get_Seq_Rt(begt, endt, rt_type)` 声明:function 返回指定类型的日收益率的一维数字序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ---------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | integer | 收益率类型选择项,取值与 Get_Ri_CumReturn 一致 | 返回:array ### `get_Seq_IC(begt, endt, ic_type)` 声明:function 返回 IC 的一维数字序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | integer | IC 类型选择项,取值与 getIC 一致 | 返回:array ### `get_Seq_T(begt, endt)` 声明:function 返回 T 值的一维数字序列 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:array ### `get_Seq2_Rt(begt, endt, rt_type)` 声明:function 返回指定类型的日收益率 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ---------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | integer | 收益率类型选择项,取值与 Get_Ri_CumReturn 一致 | 返回:array ### `get_Seq2_IC(begt, endt, ic_type)` 声明:function 返回 IC 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | integer | IC 类型选择项,取值与 getIC 一致 | 返回:array ### `get_Seq2_T(begt, endt)` 声明:function 返回 T 值 可见性:`public` | 参数 | 类型 | 说明 | | ------ | -------- | ------------ | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | 返回:array ### `getFactorReturnandIC(begt, endt, ic_type)` 声明:function 同时获得因子回归分析数据和 IC 数据 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `ic_type` | integer | IC 类型选择项,取值与 getIC 一致 | 返回:array ### `getLongShortReturn(begt, endt, cycle)` 声明:function 返回指定周期的多空收益率(%)和多空累计收益(%) 可见性:`public` | 参数 | 类型 | 说明 | | ------- | -------- | -------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `cycle` | cycle | 多空收益率的统计周期 | 返回:array ### `getGroupN()` 声明:function 获取分组数,默认为系统配置的全局参数-总组数,可重载 可见性:`public` 返回:int ### `getLongName()` 声明:function 获取多头组名称,默认第1 组,可重载 可见性:`public` 返回:string ### `getShortName()` 声明:function 获取空头组名称,默认第最后一组,假设一共分为5 组,则返回:第 5 组,可重载 可见性:`public` 返回:string ### `transferGroupName(group_name)` 声明:function 转化分组名称,将"多头"转化为"第 1 组",将"空头" ,"最后 1 组"转化为最后一组的实际组名 可见性:`public` | 参数 | 类型 | 说明 | | ------------ | ------ | --------------------------------- | | `group_name` | string | 字符串或数组,被转化的数组/字符串 | 返回:array ### `getGroupNameByGType(g_type)` 声明:function 将分组类型代码转换为分组名称 可见性:`public` | 参数 | 类型 | 说明 | | -------- | ---- | ---------------------------------------------------- | | `g_type` | int | 分组类型:-1 最后一组;-2 多空组;正整数表示对应组号 | 返回:string ### `getDaysInOneYear(cycle)` 声明:function 根据周期获得年化系数 可见性:`public` | 参数 | 类型 | 说明 | | ------- | ----- | -------------------------- | | `cycle` | cycle | 用于确定年化系数的统计周期 | 返回:real ### `getFdaysIn1y(begt, endt, rt_type)` 声明:function 根据收益类型获取年化系数 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------------------------------- | | `begt` | end_date | 日期,开始日 | | `endt` | end_date | 日期,截止日 | | `rt_type` | int | 收益类型:0 基准;1 多头;2 多头超额;3 空头;4 空头超额 | 返回:real #### 示例 范例01:.4.1 范例一:如何设置配置 ```tsl Obj := new tsf_factorExtindicator_test(); Obj.configSet('基准指数','SH000985'); //修改指数为中证全指 return obj.getDailyGroupReturnAllG(20260101T,20260331T); ``` 范例02:可通过 tsf_factorExtindicator_test类来查看必须重写的方法的返回,为随机生成的数据 ```tsl obj := new tsf_factorExtindicator_test(); return array('分组收益-第一组 ':obj.getDailyGroupReturn(20260101T,20260331T,'第1 组'), '分组收益':obj.getDailyGroupReturnAllG(20260101T,20260331T), 'IC': obj.getIC(20260101T,20260331T,1), '回归分析':obj.getFactorReturn(20260101T,20260331T), '组成分详情':obj.getgroupstocks(20260331T,1)); ``` ### `tsfAdapterfun_mulfactor2Extindicator(obj_ts_multi_factor, if_cache)` 声明:function 将已完成回测的多因子框架对象转换为因子指标框架对象;基础 IC、分组收益和回归分析数据取自多因子框架 可见性:`public` | 参数 | 类型 | 说明 | | --------------------- | ---------- | -------------------------------------------------- | | `obj_ts_multi_factor` | tsl_object | 已完成回测的 TSMultiFactor 框架对象 | | `if_cache` | boolean | 是否预缓存中间指标数据:1 预缓存;0 不缓存(默认) | 返回:tsl_object #### 示例 范例01:调用示例 ```tsl //详见 mulfactor_Invoker_GetFactorMetricsOverview begt := 20260101T; endt := 20260529T; //多因子框架实例:中证200 域内,20 日动量因子 obj_TSMultiFactor := tsmf_factory_bySigleStockFormula('stockzf2(20)','SH000904'); obj_TSMultiFactor.FBegT := begt; obj_TSMultiFactor.FEndT := endt; obj_TSMultiFactor.FCycle := '月线'; obj_TSMultiFactor.BackTest(); //调用转化器 obj := tsfAdapterfun_mulfactor2Extindicator(obj_TSMultiFactor,1); //获取缓存数据 Fdata := obj.Fdata; //计算指标 rtlb := Fdata['分组日收益率数据']; ic1 := Fdata['行业调整IC']; ret := array(); ret[0,"开始日"] := begt; ret[0,"截止日"] := endt; ret[0,"多空分析@多空累计收益(%)"] := obj.Get_Ri_CumReturn(Begt,endt,5); ret[0,"IC 分析@IC 均值"] := obj.Get_ICI_mean(Begt,endt,1); ret[0,"IC 分析@IC_行业调整均值"] := mean(ic1[:,"行业调整@IC"]); ret[0,"回归分析@|T 值|均值(%)"] := obj.Get_Ti_AbsMean(Begt,endt); ret[0,"相关系数"] := correl(rtlb[:,'基准'],rtlb[:,'多空组']); return ret; ``` 范例02:调用示例 ```tsl // 详见 mulfactor_Invoker_GetFactorCrowd begt := 20260101T; endt := 20260529T; //多因子框架实例:中证200 域内,20 日动量因子 obj_TSMultiFactor := tsmf_factory_bySigleStockFormula('stockzf2(20)','SH000904'); obj_TSMultiFactor.FBegT := begt; obj_TSMultiFactor.FEndT := endt; obj_TSMultiFactor.FCycle := '月线'; obj_TSMultiFactor.BackTest(); //调用转化器 obj := tsfAdapterfun_mulfactor2Extindicator(obj_TSMultiFactor,1); //计算指标: 多空拥挤度 data := obj.GetFactor_Crowded_TopBottomStocks(begt,endt,nil,0,10); //叠加未来6 期累计涨幅 //未来2 期收益(%):以月线2026-10-31 为例,2026-11-01~2026-12-31 的累计涨幅 rt := obj.getFactorReturn(begt,endt); reindex(rt,rt[:,'截止日']); t := data[:,'截止日']; n := length(t); n2 := length(rt); zfcol := array(); for i := 0 to length(t)-1 do begin for j := 1 to 6 do begin if i = 0 then zfcol &= array('未来'$j$'期涨幅'); if i-1+j >= n-(n-n2) then data [i,'未来'$j$'期涨幅'] := '-'; else begin rt_ := rt[t[i:i+j-1],'因子收益率']; data[i,'未来'$j$'期涨幅'] := FI_CumReturn(rt_); end end end return array('因子拥挤':data, '因子离散度':obj.GetFactor_Discrete(begt,endt,0,10)); ```