Files
playbook/skills/tsl-api-reference/workflows/classification-codes.md
T

168 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 分类属性代码(行业与基金分类)
天软把「个券归属会随时间变更」的分类维护成**分类属性**,用一套属性代码
(如 `SWHY210000`)标识。分类目录本身和个券归属分别放在不同的字典表里,
取数入口也不同。本页收拢这类分类的代码体系与取数路径。
本页是手写整理页,不由字典生成器产出;`references/data_dictionary/` 下的页面
是生成产物,不要把这里的内容写回那些页面。
## 目前维护的分类属性
| 资产 | 所属属性代码 | 分类名称 | 级数 | 备注 |
| ---- | ------------ | ------------------ | ---- | --------------------------- |
| 股票 | `SWHY` | 申万行业 | 三级 | |
| 股票 | `CAPCHY` | 中上协行业 | 二级 | 2024-02-19 起接替证监会行业 |
| 股票 | `CSRCHY` | 证监会行业 | 二级 | **2024-02-19 起不再维护** |
| 基金 | `YHFL` | 银河基金分类 | 二级 | 数据起始 2021-01-04 |
| 基金 | `TSJJ02` | 投资风格 | 二级 | |
| 基金 | `TSJJ03` | 净值增长率计算方法 | 二级 | |
属性代码的构成是「所属属性代码 + 层级编号」,例如 `SWHY``SWHY210000`(申万采掘,
一级)→ 其下二级、三级继续细分;`CSRCHY``CSRCHYA`(农、林、牧、渔业)→
`CSRCHYA01`(农业)。
## 两类表:分类目录 vs 个券归属
分类目录(有哪些分类、上下级关系、启用与剔除日期)和个券归属(某只券在某段时间属于
哪个分类)是两张不同的表,访问代码不同:
| 表 ID | 表名 | 访问代码 | 用途 |
| ----- | --------------------- | ------------------------------------- | ------------------ |
| 138 | 股票.股票行业分类信息 | **属性代码**,如 `SWHY``SWHY110000` | 股票分类目录 |
| 355 | 基金.基金分类信息 | **属性代码**,如 `YHFL``YHFL010000` | 基金分类目录 |
| 356 | 基金.基金分类 | **基金代码**,如 `OF000316` | 单只基金的分类归属 |
138 与 355 的字段结构一致:`属性代码``属性名称``级数``上级属性代码`
`上级属性名称``入选日期``剔除日期``最新标识``所属属性代码`
传错访问代码是这里最常见的错误:把基金代码传给 355、或把属性代码传给 356,都不会报错,
只会返回空表。字段清单与取数示例见字典页,用
`dictionary_lookup.py --query 股票行业分类信息` / `--query 基金分类信息` 取回。
## 取分类目录
按属性代码取某个分类节点及其记录:
```tsl
// 申万行业分类目录(全部层级)
return select * from infotable 138 of "SWHY" end;
```
`getbk(板块名)` 可以一次取回某个分类下的全部属性代码,再喂给 `infotable`
```tsl
// 申万行业的全部分类属性代码,按级数分组展示
codes := getbk("申万行业");
t := select * from infotable 138 of codes end;
return select ['级数'], select * from thisgroup end as '分类列表'
from t group by ['级数'] order by ['级数'] end;
```
`getbk("属性代码")` 是跨资产的总入口,同时覆盖股票与基金两侧:
```tsl
codes := getbk("属性代码");
t1 := select "股票" as '资产', * from infotable 138 of codes end;
t2 := select "基金" as '资产', * from infotable 355 of codes end;
return t1 union t2;
```
`getbk` 取的是**最新**成分,且入参是板块名称而非代码;签名与板块名约束见
`lookup.py --name getbk`
## 沿层级向下走
分类属性代码后缀 `.N` 表示「该属性下的所有下级分类属性代码」:
```tsl
// 指定日所有申万一级行业代码
return getbkbydate("SWHY.N", 20210423T);
// 指定一级行业下的二级行业代码
return getbkbydate("SWHY210000" $ ".N", 20210423T);
```
三级同理,用二级代码加 `.N`。也有直接返回下级列表的函数,签名用
`lookup.py --name stockIndustryLowerArr` / `--name fundYHIndustryArr` 取回。
## 取分类成分
不带 `.N` 时,`getBkByDate` 把属性代码当分类节点,返回该分类在指定日的成分券:
```tsl
return getbkbydate("SWHY740000", 20220101T); // 申万煤炭成分股
return getbkbydate("CAPCHYD", 20240219T); // 中上协:电力、热力、燃气及水
return getbkbydate("YHFL030000", 20220101T); // 银河债券型成分基金
return getbkbydate("TSJJ0201", 20220101T); // 投资风格:股票型
```
`getBkByDate` 的字典条目只描述了指数代码入参,分类属性代码入参同样成立;两种入参
共用一个函数。签名与 `extype` 参数见 `lookup.py --name getBkByDate`
## 行业分类代码 ≠ 行业指数代码
同一个申万行业有两套代码,用途不同,混用会取到空结果:
| 用途 | 代码形态 | 示例 |
| -------------------- | ------------------------ | ----------------------------- |
| 行业**分类**属性代码 | `SWHY` + 层级编号 | `SWHY210000` 申万采掘 |
| 行业**指数**代码 | `SWHY00000N`N 为级数) | `SWHY000001` 申万一级行业指数 |
取行业指数代码序列走指数侧:
```tsl
// 指定日所有申万一级行业指数代码
return getbkbydate("SWHY000001", 20190201T);
// 最新的行业指数序列也可按板块名取
return getbk("申万一级行业指数");
```
二级、三级分别对应 `SWHY000002` / `SWHY000003`,板块名分别是
`申万二级行业指数` / `申万三级行业指数`。代码转名称用
`lookup.py --name stockName`
## 反查:个券在指定日属于哪个分类
申万各级有成对的名称/编码查询函数,与系统参数「证券」「日期」相关:
```tsl
setSysParam(pn_stock(), "SZ000002");
setSysParam(pn_date(), 20200101T);
return array("一级名称": stockSWIndustryName1(),
"一级编码": stockSWIndustryID1(),
"二级名称": stockSWIndustryName2(),
"二级编码": stockSWIndustryID2(),
"三级名称": stockSWIndustryName3(),
"三级编码": stockSWIndustryID3());
```
批量反查配合 `spec(...)` 逐券切换系统参数:
```tsl
endt := 20240103T;
stocks := getbkbydate("SH000016", endt);
setSysParam(pn_date(), endt);
return select thisRow as "sid",
spec(stockSWIndustryName1(), thisRow) as "一级行业名称",
spec(stockSWIndustryID1(), thisRow) as "一级行业编码"
from stocks end;
```
这六个函数无参数,签名逐个用 `lookup.py --name stockSWIndustryName1` 等确认。
按板块分类批量反查另有 `stocksbklist`,其 `bktype` 是整数板块类别,取值不在本页
事实范围内,用前先确认。
## 其它取数代码
少量非个券维度的数据也用代码位取:`HG000001` 宏观数据表格,`HG000001``HG000004`
分别对应港股通(沪)、沪股通、港股通(深)、深股通方向。其余特别数据(如国债收益率
曲线)按字典页或专题文档确认,不在本页枚举。
## 事实边界
本页只给代码体系与取数路径。函数签名、参数类型、返回形态一律以
`lookup.py --name` 的条目正文为准,本页示例不作为签名依据。具体分类下有哪些属性代码
会随上游调整,不在本页硬编码;用上面的 `getbk` + `infotable` 组合在运行时取回当前列表。