# 组合优化 / 组合优化

## `tsPortfolioOptimizer`

声明：class

按收益、风险或自定义目标求解资产权重，支持证券、分组及组合指标约束

<!-- tags: 聚合 风险管理 风控 数学优化 约束求解 约束条件 限制条件 组合权重 -->

### `FBegT`

声明：field

开始时间 FEndT-365

可见性：`public`

类型：datetime

### `FEndT`

声明：field

结束时间 DATE()

可见性：`public`

类型：datetime

### `FIndexId`

声明：field

指数代码 "SH000300"

可见性：`public`

类型：varchar

### `FCycle`

声明：field

行情数据所用周期 "日线"

可见性：`public`

类型：varchar

### `FDaysIn1y`

声明：field

收益率折算为年化收益率所用天数 根据 FCycle 自动匹配

可见性：`public`

类型：integer

### `FReturnType`

声明：field

收益率数据类型 1

可见性：`public`

类型：integer

### `FConfidenceInterval`

声明：field

计算 VaR 时的置信度 0.95

可见性：`public`

类型：real

### `FLambda`

声明：field

风险厌恶系数λ 1

可见性：`public`

类型：real

### `FRf`

声明：field

年化无风险利率(%)，用于夏普比率计算 0

可见性：`public`

类型：real

### `FObjType`

声明：field

目标函数 0

可见性：`public`

类型：integer

### `FObjEvalStr`

声明：field

自定义优化目标表达式 ""

可见性：`public`

类型：string

### `FConType`

声明：field

指标约束函数 nil

可见性：`public`

类型：integer

### `FConIfAnnual`

声明：field

约束是否年化，控制指标约束上下界输入 0：不年化，兼容历史

可见性：`public`

类型：bool

### `FThresholdLower`

声明：field

指标约束下界 和 FConType 配合使用 nil

可见性：`public`

类型：number

### `FThresholdUpper`

声明：field

指标约束上界 和 FConType 配合使用 nil

可见性：`public`

类型：number

### `FConStr`

声明：field

组合约束 Array()

可见性：`public`

类型：array

### `FMulticon`

声明：field

多个指标约束 Array()

可见性：`public`

类型：array

### `FxData`

声明：field

组合对数收益率矩阵,二维数字数组,

可见性：`public`

类型：array

### `FyData`

声明：field

指数对数收益率序列,一维数字数组

可见性：`public`

类型：array

### `FCov`

声明：field

组合收益率协方差

可见性：`public`

类型：array

### `FCorr`

声明：field

组合相关系数矩阵

可见性：`public`

类型：array

### `FReturnArray`

声明：field

返回字段，控制返回（影响部分接口）

可见性：`public`

类型：array

### `PortfolioOptimize()`

声明：function

优化主函数，按照组合优化目标和阀值，计算优化比例

<!-- tags: 数学优化 约束求解 投资组合 资产组合 -->

可见性：`public`

返回：int

### `GetXData()`

声明：function

获得组合对数收益率矩阵

<!-- tags: 查询 回报率 投资收益 -->

可见性：`public`

返回：array

### `GetYData()`

声明：function

获得指数对数收益率序列

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

可见性：`public`

返回：array

### `GetCov()`

声明：function

获得组合协方差矩阵

<!-- tags: 查询 风险矩阵 -->

可见性：`public`

返回：array

### `GetCorr()`

声明：function

设置组合相关系数矩阵

<!-- tags: 查询 配置 相关性 关联关系 -->

可见性：`public`

返回：array

### `GetObj(w)`

声明：function

用户自定义优化的目标

<!-- tags: 查询 数学优化 约束求解 -->

可见性：`public`

| 参数 | 类型  | 说明         |
| ---- | ----- | ------------ |
| `w`  | array | 组合权重向量 |

返回：numeric

### `GetCon(w)`

声明：function

用户自定义优化的约束条件

<!-- tags: 查询 数学优化 约束求解 限制条件 -->

可见性：`public`

| 参数 | 类型  | 说明         |
| ---- | ----- | ------------ |
| `w`  | array | 组合权重向量 |

返回：array

### `GetPortfolioData()`

声明：function

查询优化结果

<!-- tags: 数学优化 约束求解 投资组合 资产组合 -->

可见性：`public`

返回：array

### `GetReturnandRisk()`

声明：function

查询优化前后组合收益和组合风险指标

<!-- tags: 回报率 投资收益 风险管理 风控 数学优化 约束求解 -->

可见性：`public`

返回：array

### `GetSectorData()`

声明：function

查询优化前后行业比例、超配比

<!-- tags: 数学优化 约束求解 行业分类 板块 -->

可见性：`public`

返回：array

### `GetPortfolioData2()`

声明：function

优化前后资产风险贡献，其中总风险贡献(%)与风险贡献率(%)具有可加性，理论公式说明请

<!-- tags: 查询 影响度 收益分解 风险管理 风控 数学优化 约束求解 投资组合 -->

可见性：`public`

返回：array

### `GetPortopt(numports, portreturn, r_type)`

声明：function

带约束投资组合的有效前沿，底层调用模型 Portopt，在收益一定时，组合风险最小。目前约

<!-- tags: 查询 执行 风险管理 风控 约束条件 限制条件 资产组合 -->

可见性：`public`

| 参数         | 类型  | 说明                                                                                                                  |
| ------------ | ----- | --------------------------------------------------------------------------------------------------------------------- |
| `numports`   | int   | 有效前沿组合数，整型，默认取 10，使用情况较多                                                                         |
| `portreturn` | array | 要求组合收益，不带%，一维数字数组，当该参数非空时，Numports 失效，使用情 况较少                                       |
| `r_type`     | int   | 返回类型，控制比例的输出格式 取值 含义 备注 0（默认） 比例平铺展示 适用资产较少 1 比例折叠到一个多级数组 适用资产较多 |

返回：array

### `GetData_OutSample(v_beg_t, v_end_t)`

声明：function

样本外各资产与基准收益率(%)序列，收益率带%。默认情况下，框架会根据成员变量

<!-- tags: 查询 回报率 投资收益 比较基准 业绩基准 -->

可见性：`public`

| 参数      | 类型 | 说明                   |
| --------- | ---- | ---------------------- |
| `v_beg_t` | date | 样本外开始日，日期类型 |
| `v_end_t` | date | 样本外截止日，日期类型 |

返回：array

### `GetPortfolioReturn_OutSample(v_beg_t, v_end_t, v_type)`

声明：function

样本外组合优化前后的收益率(%)序列

<!-- tags: 查询 回报率 投资收益 数学优化 约束求解 投资组合 资产组合 -->

可见性：`public`

| 参数      | 类型 | 说明                                                                                                                            |
| --------- | ---- | ------------------------------------------------------------------------------------------------------------------------------- |
| `v_beg_t` | date | 样本外开始日，日期类型                                                                                                          |
| `v_end_t` | date | 样本外截止日，日期类型                                                                                                          |
| `v_type`  | int  | 组合构造方式，整型，详情可参考 FAQ 组合不同构造方式说明 取值 含义 0（默认） 每期各资产权重不变 1 每期各资产权重根据涨幅自动变化 |

返回：array

### `GetReturnandRisk_OutSample(v_beg_t, v_end_t, v_type)`

声明：function

样本外组合优化前后的收益风险指标

<!-- tags: 查询 风险管理 风控 数学优化 约束求解 -->

可见性：`public`

| 参数      | 类型 | 说明                                                                                                                            |
| --------- | ---- | ------------------------------------------------------------------------------------------------------------------------------- |
| `v_beg_t` | date | 样本外开始日，日期类型                                                                                                          |
| `v_end_t` | date | 样本外截止日，日期类型                                                                                                          |
| `v_type`  | int  | 组合构造方式，整型，详情可参考 FAQ 组合不同构造方式说明 取值 含义 0（默认） 每期各资产权重不变 1 每期各资产权重根据涨幅自动变化 |

返回：array

### `InitData()`

声明：function

初始化数据用，在进行后续报表输出前必须调用，通常在PortfolioOptimize()后使用

<!-- tags: 执行 打印 -->

可见性：`public`

### `GetOptimizationTemplateTable()`

声明：function

优化模版配置表，用户可重写模版配置

<!-- tags: 查询 数学优化 约束求解 表数据 二维表 -->

可见性：`public`

返回：array

### `GetCumulativeReturnTable(cycle, qk_type)`

声明：function

累计收益表（固定周期或滚动区间）组合层

<!-- tags: 查询 回报率 投资收益 表数据 二维表 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetRetsCumulativeReturnTable(cycle, qk_type)`

声明：function

累计收益表（固定周期或滚动区间）资产层

<!-- tags: 查询 回报率 投资收益 表数据 二维表 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetCumulativeReturnTable2(cycle, qk_type)`

声明：function

累计收益表（固定周期或滚动区间）组合层，指定返回列，与FReturnArray 有关

<!-- tags: 查询 回报率 投资收益 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetMaxDrawdownTable(cycle, qk_type)`

声明：function

最大回撤表（固定周期或滚动区间）组合层

<!-- tags: 查询 亏损幅度 表数据 二维表 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetRetsMaxDrawdownTable(cycle, qk_type)`

声明：function

最大回撤表（固定周期或滚动区间）资产层

<!-- tags: 查询 亏损幅度 表数据 二维表 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetMaxDrawdownTable2(cycle, qk_type)`

声明：function

最大回撤表（固定周期或滚动区间）组合层，指定返回列，与FReturnArray 有关

<!-- tags: 查询 亏损幅度 -->

可见性：`public`

| 参数      | 类型    | 说明                    |
| --------- | ------- | ----------------------- |
| `cycle`   | string  | 行情或统计周期          |
| `qk_type` | integer | 0：固定周期 1：滚动周期 |

返回：array

### `GetPerformance()`

声明：function

历史表现汇总

<!-- tags: 查询 绩效 业绩表现 -->

可见性：`public`

返回：array

### `GetPerformance2()`

声明：function

历史表现汇总，指定返回列，与 FReturnArray 有关

<!-- tags: 查询 资产配置 -->

可见性：`public`

返回：array

### `GetWeightsTable()`

声明：function

权重汇总表

<!-- tags: 查询 组合权重 资产配置 表数据 二维表 -->

可见性：`public`

返回：array

### `GetWeightsTable2()`

声明：function

权重汇总表，指定返回列，与 FReturnArray 有关

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

可见性：`public`

返回：array

### `GetReturnAndDrawdown(cycle)`

声明：function

收益回撤表（同时包含组合收益序列和回撤序列）

<!-- tags: 查询 回报率 投资收益 最大回撤 亏损幅度 -->

可见性：`public`

| 参数    | 类型   | 说明           |
| ------- | ------ | -------------- |
| `cycle` | string | 行情或统计周期 |

返回：array

#### 示例

范例01：调用示例

```tsl
PortfolioData := Array(
       ("代码":"SZ000001","比例下界(%)":0,"比例上界(%)":40,"分组":"股票"),
       ("代码":"SZ000002","比例下界(%)":0,"比例上界(%)":40,"分组":"股票"),
       ("代码":"SH019547","比例下界(%)":0,"比例上界(%)":60,"分组":"债券"),
       ("代码":"SH019644","比例下界(%)":0,"比例上界(%)":60,"分组":"债券")
   );


   BegT := 20230101T;
   EndT := 20231231T;
   Cycle := cy_day();
   IndexId := "SH000300";
   ObjType := 1;

   Constr := array();

   // 设置大类资产约束
   GroupConStr := Array(
       ("分组":Array("股票"), "比例下界(%)":50, "比例上界(%)":70),
       ("分组":Array("债券"), "比例下界(%)":30, "比例上界(%)":50)




   );


   Config := array(("是否资产约束":1,"是否指标约束":0,"是否分组约束":1,"约束指标是
否年化":1,
   "分组字段名称":"分组","有效前沿个数":nil,"返回周期":"月线"));

   return
TSFL_ZHYH_GetAssetAllocationOptimizer(PortfolioData,BegT,EndT,Cycle,Index
Id,ObjType,
ConStr,GroupConstr,Config);
```

### `Tsfl_ZHYH_CompareAllocModels(portfolio_data, beg_t, end_t, cycle, index_id, config)`

声明：function

常用配置模型对比

<!-- tags: 比较 配置模型 组合优化 -->

可见性：`public`

| 参数             | 类型     | 说明                                                                                                                                                                                                                                                                                           |
| ---------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `portfolio_data` | array    | Array，优化样本                                                                                                                                                                                                                                                                                |
| `beg_t`          | datetime | 日期，开始日，如 20250101T                                                                                                                                                                                                                                                                     |
| `end_t`          | datetime | 日期，截止日，如 20251231T                                                                                                                                                                                                                                                                     |
| `cycle`          | string   | 周期，如 cy_day()                                                                                                                                                                                                                                                                              |
| `index_id`       | string   | 字符串，指数代码，如"SH000300"                                                                                                                                                                                                                                                                 |
| `config`         | array    | 可选。Array，高级选项，控制优化方法及返回配置，举例 array(("优化模版序号 ":array(1,2,3,4,5),"返回周期":"月线"))，可选字段如下 字段 类型 默认值 说明 优化模版序号 数组 Array(1,2,3,4,5) 返回周期 周期 月线 优化模版序号可选如下 序号 优化模板名称 风险 等级 核心约束（生产典型值） 适用产品场景 |

#### 示例

范例01：调用示例

```tsl
PortfolioData := Array(
      ("代码":"SZ000001","比例下界(%)":0,"比例上界(%)":60),
      ("代码":"SZ000002","比例下界(%)":0,"比例上界(%)":60),
      ("代码":"SH600000","比例下界(%)":0,"比例上界(%)":60));

   BegT := 20230101T;
   EndT := 20231231T;
   Cycle := cy_day();




   IndexId := "SH000300";

   Config := array(("优化模版序号":array(1,2,3,4,5),"返回周期":"月线"));

   return
TSFL_ZHYH_CompareAllocModels(PortfolioData,BegT,EndT,Cycle,IndexId,Config
);
```
