Files
playbook/skills/tsl-api-reference/workflows/code-sequences.md
T

195 lines
8.8 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.
# 证券代码序列取数
「先拿到一批证券代码,再逐个取指标」是天软里最常见的起手动作。代码序列有三条互不
等价的取数路径,选错路径会静默拿到错误的样本集:
| 路径 | 函数 | 时点语义 | 入参 |
| ----------------- | -------------- | ------------------ | -------------------------- |
| 板块最新成分 | `getbk` | **最新**,不带日期 | 板块中文名 |
| 板块历史成分 | `getAbkbyDate` | 指定日 | 板块中文名(仅限部分板块) |
| 指数/分类历史成分 | `getBkByDate` | 指定日 | 指数代码或分类属性代码 |
`getbk` 没有日期入参,拿到的永远是当前成分;做历史回测时用它会引入前视偏差。
签名与各自的适用范围用 `lookup.py --name getbk` / `--name getAbkbyDate` /
`--name getBkByDate` 取回。
本页是手写整理页,不由字典生成器产出。
## 板块名是复合的
多个板块名用英文分号拼接,一次传入:
```tsl
return getbk("深证A股;上证A股"); // 只要主板
return getbk("A股;暂停上市;终止上市"); // 含退市与暂停上市
return getbk("港股;终止上市港股"); // 全部港股
return getbk("上市指数;退市指数"); // 全部指数
return getbk("上证基金;深证基金"); // 在市基金交易代码
```
`A股` 本身就是复合板块,等于 `深证A股;上证A股;创业板;科创板;北证A股`。需要单独一个
板块时直接写该板块名,不要在 `A股` 结果上二次过滤。
板块划分会随上游调整:港股在 2026-06-25 之前全部在「港股」板块内,之后拆出
「终止上市港股」。依赖板块名的代码在跨越这类调整时要复核。
具体有哪些板块名不在本页事实范围内;`getbk` 要求名称与板块管理中的名称完全一致,
先在客户端板块管理里确认。
## 指定日的市场板块成分
`getAbkbyDate(bk_name, endt)` 按板块中文名取指定日成分,并剔除暂停上市:
```tsl
return getAbkbyDate("A股", 20200210T);
return getAbkbyDate("深证A股;上证A股;北证A股", 20200210T);
```
它只支持市场板块(`A股``上证A股``深证A股``北证A股``创业板``科创板`
`中小企业板`),其它板块名不支持。
另一条等价路径是用天软自编的市场板块**指数**代码走 `getBkByDate`
| 代码 | 板块 | 代码 | 板块 |
| ----------- | ------- | ----------- | ------- |
| `TSI000001` | A股 | `TSI000006` | 北证A股 |
| `TSI000002` | 上证A股 | `TSI000007` | B股 |
| `TSI000003` | 科创板 | `TSI000008` | 上证B股 |
| `TSI000004` | 深证A股 | `TSI000009` | 深证B股 |
| `TSI000005` | 创业板 | | |
```tsl
return getbkbydate("TSI000001", 20230810T); // A股板块 20230810 成分
```
## 指数成分必须用指数代码
指数成分来源于指数成份变更表(`infotable 752` 指数.指数成份),与板块来源不同,
只能用指数代码取:
```tsl
return getbkbydate("SH000300", 20210908T); // 沪深300 指定日成分
```
板块名传给 `getBkByDate` 不会报错,只会返回空表。字段清单用
`dictionary_lookup.py --query 指数成份` 取回。
## 行业分类与行业指数是两套代码
`getbkbydate("SWHY740000", ...)` 取的是**行业分类**成分(来源:个股所属行业),
`getbkbydate("SW801150", ...)` 取的是**行业指数**成分(来源:指数成份表)。两者
样本可能不同。先用 `SWHY00000N` 拿到该级全部行业指数代码,再逐个取成分:
```tsl
idx := getbkbydate("SWHY000001", 20190201T); // 所有申万一级行业指数代码
return getbkbydate(idx[0], 20190201T); // 其中一个的成分股
```
分类属性代码体系见 [`classification-codes.md`](classification-codes.md)。
## 沪深港通
沪深港通合资格名单也记在 `infotable 752`,用四个方向虚拟代码取:
| 代码 | 方向 | 代码 | 方向 |
| ---------- | ------------ | ---------- | ------------ |
| `HG000001` | 港股通(沪) | `HG000003` | 港股通(深) |
| `HG000002` | 沪股通 | `HG000004` | 深股通 |
```tsl
// 指定日北向(A股)合资格名单
return getbkbydate("HG000002", 20240701T) union2 getbkbydate("HG000004", 20240701T);
// 指定日南向(港股)合资格名单
return getbkbydate("HG000001", 20240701T) union2 getbkbydate("HG000003", 20240701T);
// 曾经进过港股通的全部港股代码
return sselect distinct ["证券代码"]
from infotable 752 of array("HG000001", "HG000003") end;
```
## 基金:在市与运作状态是两回事
板块决定「是否上市」,运作状态要另外筛:
```tsl
return getbk("上市基金"); // 当前在市
return getbk("已退市基金"); // 已退市
return getbkall("普通股票型"); // 某分类全部,含已停止运作
return fundOperateFundsbyBkname("上市基金;已退市基金", 20200924T); // 指定日仍在运作
return fundsOperateFunds(getbkall("股票型"), 20200101T); // 对给定列表筛运作中
```
`getBkAll` 返回板块全部样本含退市,但对一批板块不适用(A股类、指数成份类、概念板块
等),限制清单见 `lookup.py --name getBkAll` 的条目正文。
按基金分类取指定日成分优先走分类属性代码:
```tsl
return getbkbydate("TSJJ0201", 20220101T); // 投资风格:股票型
```
一级市场代码与二级市场(交易)代码不同:`getbk("上证基金;深证基金")` 取的是交易代码,
两者可通过基金基本信息表里的交易代码字段互转。
## 债券
```tsl
return getbk("深交所债券;上交所债券;银行间债券"); // 当前在市全部债券
return getbk("可转债"); // 当前在市可转债
return getbk("可转债;退市可转债"); // 含退市
return getbkall("可转债"); // 同上,走 getBkAll
return bondConvertibleBonds2(); // 专用函数:所有可转债
return cb_getTradeMarkByDate(20210813T); // 指定日有交易的转债
```
券种板块名(`国债``企业债` 等)走同一套 `getbk` 路径。两个专用函数的签名见
`lookup.py --name bondConvertibleBonds2` / `--name cb_getTradeMarkByDate`
## 期货
期货有「合约」和「品种」两层,代码序列要分清取哪一层:
```tsl
return getbk("上市期货"); // 当前在市合约
return getbk("上市期货;退市期货"); // 含退市合约
return getbk("期货品种代码"); // 品种代码(CU、IF 这类)
return getbk("期货品种代码;退市期货品种代码");
return getbk("期货主力"); // 主力线;期货连续/次主力/指数线同理
return getFuturesBkbydate("上市期货;退市期货", 20251218T); // 指定日在市合约
return getFuturesBkbydate("郑州商品交易所;中国金融期货交易所", 20240508T);
```
`getFuturesBkbydate` 的板块名可以是交易所名、期货类别(`股指期货``商品期货`
`农产品期货`)或品种名,签名见 `lookup.py --name getFuturesBkbydate`
品种代码与主力/次主力/指数线/连续代码的对照关系在 `infotable 708`
(期货.期货品种代码对照表),任一形态的代码都能查到其余形态;访问代码与字段用
`dictionary_lookup.py --query 期货品种` 取回。按品种取全部合约要先把品种代码换成
品种名称再走 `getBkAll`
## 期权
```tsl
return getbk("上市期权"); // 当前在市合约
return getbk("ETF期权"); // 按标的类型
return getbk("华泰柏瑞沪深300ETF期权"); // 按标的名称
```
## 其它代码位
`HG000001` 也用作宏观数据表格的取数代码位(如国内生产总值 816 表、居民消费价格
822 表)。其余特别数据(国债收益率曲线等)按字典页确认。
## 事实边界
本页只给取数路径与代码位体系。函数签名、参数类型、返回形态一律以
`lookup.py --name` 的条目正文为准。板块名清单、分类代码清单会随上游调整,不在本页
硬编码,用运行时取回。
FAQ 中出现但当前 API 索引查不到的名称(`GetETFListByDate``GetFuturesID`)不作为
可用 API;需要时先用 `lookup.py --kw` 确认存在再使用,查不到就按 SKILL.md 的
CHECKPOINT 停止。上表中 `getbk` 系列、`getAbkbyDate``getBkByDate``getBkAll`
`getFuturesBkbydate``fundOperateFundsbyBkname``fundsOperateFunds`
`bondConvertibleBonds2``cb_getTradeMarkByDate` 均已在索引中核对存在。