## 数据简介 证券资料表 `cn_stock_factors_security_profile` 以「交易日期 + 证券代码」为主键,把一只股票在某个交易日的**身份属性**和**交易属性**汇总到一行,共 30 个字段。 这张表回答的是「这只股票当天是什么」这类问题: - **它是谁**:证券简称、上市板块、上市日期、已上市天数; - **它在哪里交易**:上交所 / 深交所 / 北交所,主板 / 创业板 / 科创板; - **它当天能不能交易**:停牌、ST、风险警示、涨跌停、一字涨跌停、是否为两融标的; - **它被谁持有、被谁收录**:是否为 11 只主流宽基指数的成分股,社保基金和保险资金是否位列十大股东。 所有字段都是**状态量**而非价格量,主要用于选股前的股票池过滤、回测中的可交易性约束以及分组统计,通常不直接作为打分因子使用。 ## 数据表基本信息 | 项目 | 说明 | |---|---| | 数据表名称 | `cn_stock_factors_security_profile` | | 数据粒度 | 日频,股票维度 | | 主键字段 | `date`、`instrument` | | 标的范围 | 沪深北全部 A 股,与 `cn_stock_instruments` 严格对齐(**包含北交所**) | | 数据开始日期 | **2010-01-01**(部分字段的有效起点更晚,见「数据开始日期」一节) | | 数据结束日期 | 最新交易日,每日增量更新 | | 字段数量 | 30 个 | ## 数据开始日期 本表历史数据从 **2010-01-01** 开始,之前的日期查不到任何数据。 这个起点由上游决定,不是随意取的:`cn_stock_instruments` 和 `cn_stock_status` 这两张基准表的最早可用年份都是 2010 年,本表以它们为骨架逐日 `LEFT JOIN` 加工,因此起点与之保持一致。对应到代码里就是 builder 的 `history_start_year = 2010`。 需要注意的是,表内有数据不等于每个字段都有意义。下面这几个字段的**有效起点晚于 2010-01-01**,在各自的生效日之前恒为 0: | 字段 | 有效起点 | 说明 | |---|---|---| | `margin_trading_status` | 2010-03 | 两融业务 2010 年 3 月开闸,此前无标的名单 | | `holding_by_social_security`、`holding_by_insurance` | 2010 年首个披露日之后 | `cn_stock_shareholder_top10` 最早报告期为 2009-12-31,需等到实际披露后才有值 | | `is_kc50` | 2020-07 | 科创 50 指数发布日之后 | | `is_bz50` | 2022-11 | 北证 50 指数发布日之后 | | `is_zz1000`、`is_cybz` 等 | 各指数发布日之后 | 早于发布日的区间恒为 0 | 另有一个方向相反的例外:`is_zz100` 的上游成分数据止于 **2024-11-05**,之后该字段恒为 0,回测区间跨过这个日期时请留意。 因此取数时的一般建议是:整体区间不早于 2010-01-01;若用到两融或机构持仓字段,起点放到 2010 年下半年之后更稳妥;若依赖某个指数成分,起点放到该指数发布日之后。 ## 字段说明 ### 基础资料 | 字段名 | 类型 | 含义 | 取值说明 | |---|---|---|---| | `date` | TIMESTAMP_NS | 日期 | 主键 | | `instrument` | VARCHAR | 证券代码 | 主键,形如 `000001.SZ` | | `name` | VARCHAR | 证券简称 | 当日简称,随更名变化 | | `list_sector` | TINYINT | 上市板块代码 | 0-未知;1-主板;2-创业板;3-科创板;4-北交所 | | `list_date` | TIMESTAMP_NS | 上市日期 | — | | `list_days` | BIGINT | 已上市天数(按自然日) | = 当前日期 - 上市日期 | ### 交易所与板块 | 字段名 | 类型 | 含义 | 取值说明 | |---|---|---|---| | `is_sh` | INTEGER | 是否为上交所 | 1-是;0-否 | | `is_sz` | INTEGER | 是否为深交所 | 1-是;0-否 | | `is_bj` | INTEGER | 是否为北交所 | 1-是;0-否 | | `is_shzb` | INTEGER | 是否为上交所主板 | 1-是;0-否 | | `is_kcb` | INTEGER | 是否为科创板 | 1-是;0-否 | | `is_szzb` | INTEGER | 是否为深交所主板 | 1-是;0-否 | | `is_cyb` | INTEGER | 是否为创业板 | 1-是;0-否 | ### 交易状态 | 字段名 | 类型 | 含义 | 取值说明 | |---|---|---|---| | `line_price_limit` | INTEGER | 一字涨跌停 | 0-正常;1-一字涨停;2-一字跌停 | | `st_status` | TINYINT | ST 状态 | 0-正常;1-ST;2-*ST | | `is_risk_warning` | TINYINT | 风险警示 | 0-正常;1-风险警示 | | `suspended` | TINYINT | 停牌标记 | 0-正常;1-停牌 | | `price_limit_status` | TINYINT | 收盘涨跌停状态 | 1-跌停;2-非涨跌停;3-涨停 | | `margin_trading_status` | INTEGER | 两融标的 | 0-不属于;1-属于 | ### 指数成分 | 字段名 | 类型 | 含义 | 取值说明 | |---|---|---|---| | `is_szzs` | INTEGER | 属于上证指数 | 0-不属于;1-属于 | | `is_sh50` | INTEGER | 属于上证 50 | 0-不属于;1-属于 | | `is_hs300` | INTEGER | 属于沪深 300 | 0-不属于;1-属于 | | `is_kc50` | INTEGER | 属于科创 50 | 0-不属于;1-属于 | | `is_zz1000` | INTEGER | 属于中证 1000 | 0-不属于;1-属于 | | `is_zz100` | INTEGER | 属于中证 100 | 0-不属于;1-属于 | | `is_zz500` | INTEGER | 属于中证 500 | 0-不属于;1-属于 | | `is_szcz` | INTEGER | 属于深证成指 | 0-不属于;1-属于 | | `is_cybz` | INTEGER | 属于创业板指 | 0-不属于;1-属于 | | `is_sz100` | INTEGER | 属于深证 100 | 0-不属于;1-属于 | | `is_bz50` | INTEGER | 属于北证 50 | 0-不属于;1-属于 | ### 机构持仓 | 字段名 | 类型 | 含义 | 取值说明 | |---|---|---|---| | `holding_by_social_security` | INTEGER | 社保基金位列十大股东 | 0-未持有;1-持有 | | `holding_by_insurance` | INTEGER | 保险资金位列十大股东 | 0-未持有;1-持有 | ## 依赖的原始数据表 本表不含任何自有原始数据,30 个字段全部由下面 7 张上游表加工而来。任一张表停更或回补,本表对应字段都会跟着变化。 | 原始数据表 | 提供的字段 | 角色 | |---|---|---| | `cn_stock_instruments` | `date`、`instrument`、`name` | **基准表**,决定输出的股票池与行数 | | `cn_stock_basic_info` | `list_sector`、`list_date`、`list_days` | 上市资料 | | `cn_stock_status` | `st_status`、`is_risk_warning`、`suspended`、`price_limit_status` | 交易状态 | | `cn_stock_real_bar1d` | `line_price_limit` | 未复权行情,用于判断一字涨跌停 | | `cn_stock_margin_trading_detail` | `margin_trading_status` | 两融标的名单 | | `cn_stock_index_component` | 11 个 `is_xxx` 指数成分字段 | 指数成分明细 | | `cn_stock_shareholder_top10` | `holding_by_social_security`、`holding_by_insurance` | 十大股东名单 | `is_sh`、`is_sz`、`is_bj`、`is_shzb`、`is_kcb`、`is_szzb`、`is_cyb` 这 7 个板块字段不依赖额外的表,直接由 `instrument` 的代码前后缀推导。 ## 加工逻辑说明 以 `cn_stock_instruments` 作为基准股票池,确定输出的 `(date, instrument)` 粒度,其余数据表一律 `LEFT JOIN`,因此本表的行数与 `cn_stock_instruments` 严格一致,不会多出已退市标的。 | 字段 | 来源表 | 加工方式 | |---|---|---| | `name` | `cn_stock_instruments` | 直接取当日简称 | | `list_sector`、`list_date` | `cn_stock_basic_info` | 按 `instrument` 关联 | | `list_days` | `cn_stock_basic_info` | `datediff('day', list_date, date)` | | `is_sh` 等 7 个板块字段 | — | 由证券代码的后缀(`.SH`/`.SZ`/`.BJ`)与前缀(`60`/`68`/`00`/`30`)判断 | | `line_price_limit` | `cn_stock_real_bar1d` | 当日最高价与最低价同时等于涨停价记 1,同时等于跌停价记 2,其余记 0 | | `st_status` 等 4 个状态字段 | `cn_stock_status` | 直接取自源表,不做二次加工 | | `margin_trading_status` | `cn_stock_margin_trading_detail` | 出现在明细表中记 1,未出现补 0 | | 11 个指数成分字段 | `cn_stock_index_component` | 按 `date, member_code` 分组,`max(if(name = 指数名, 1, 0))` 聚合,同一天可同时属于多个指数 | | `holding_by_social_security`、`holding_by_insurance` | `cn_stock_shareholder_top10` | 先把十大股东名单 `string_agg` 成一个字符串,再用 `ASOF JOIN` 匹配到最近一次已披露的名单,最后用关键词判断 | 机构持仓的关键词口径: - 社保基金:名单中包含「社保基金」; - 保险资金:名单中包含「保险」「人寿」「财险」「养老险」中的任意一个。 ## 使用注意事项 ### 板块判断口径 创业板包含 `300`、`301`、`302` 开头的代码,科创板包含 `688`、`689` 开头的代码,因此本表用 `30%` 和 `68%` 前缀判断,而不是 `300%` 和 `688%`。若只用 `300%` 会漏掉约 440 只 `301`/`302` 开头的创业板股票。 可用如下关系自查:`is_sh + is_sz + is_bj = 1`、`is_shzb + is_kcb = is_sh`、`is_szzb + is_cyb = is_sz`。 ### 机构持仓存在前视偏差 `holding_by_social_security` 和 `holding_by_insurance` 默认按十大股东的**报告期**(`end_date`)做 `ASOF JOIN`,与原始设计文档口径一致。但报告期结束到实际公告之间通常间隔一至三个月,例如 3 月 31 日的报告期要到 4 月下旬才披露,这意味着 4 月初读到的持仓信息在当时尚未公开。 用于回测时请注意这一点。如需 point-in-time 口径,把 builder 的 `holder_date_field` 改为 `publish_date` 后重新加工即可,SQL 无需改动。 从未披露过十大股东名单的标的(例如刚上市的股票)记为 0,表示「无法确认持有」,而非「确认未持有」。`cn_stock_shareholder_top10` 的最早报告期为 2009-12-31,因此本表起点附近这两个字段仍可能大面积为 0,详见「数据开始日期」。 ### 停牌日的字段取值 停牌日 `cn_stock_real_bar1d` 的最高价、最低价为空,`line_price_limit` 统一记为 0(正常),判断可交易性时应以 `suspended` 为准,不要依赖 `line_price_limit`。 ### 与行情表联用时的日期对齐 本表是 `T` 日的状态快照。常见做法是用 `T` 日的状态过滤股票池,再用 `T+1` 日的行情成交,避免在涨跌停或停牌日产生无法成交的信号。 ## 数据访问示例 ### Python:取某段区间的全部字段 ```python import dai df = dai.query( "SELECT * FROM cn_stock_factors_security_profile", filters={"date": ["2025-01-01", "2025-06-30"]}, ).df() ``` ### Python:构造可交易的沪深 300 股票池 ```python import dai sql = """ SELECT date, instrument, name FROM cn_stock_factors_security_profile WHERE is_hs300 = 1 -- 沪深300成分股 AND suspended = 0 -- 未停牌 AND is_risk_warning = 0 -- 非风险警示 AND st_status = 0 -- 非ST AND line_price_limit = 0 -- 非一字涨跌停 AND list_days > 365 -- 上市满一年 ORDER BY date, instrument """ df = dai.query(sql, filters={"date": ["2025-01-01", "2025-06-30"]}).df() ``` ### SQL:查询单只股票的历史资料 ```sql SELECT date, instrument, name, list_sector, list_days, st_status, suspended, price_limit_status FROM cn_stock_factors_security_profile WHERE instrument = '000001.SZ' ORDER BY date ``` ### SQL:与行情表关联,剔除不可交易的标的 ```sql SELECT b.date, b.instrument, b.close, p.name, p.is_hs300, p.margin_trading_status FROM cn_stock_bar1d AS b LEFT JOIN cn_stock_factors_security_profile AS p ON b.date = p.date AND b.instrument = p.instrument WHERE p.suspended = 0 AND p.st_status = 0 AND p.line_price_limit = 0 ``` ### SQL:统计每日各板块的股票数量 ```sql SELECT date, sum(is_shzb) AS 上交所主板, sum(is_kcb) AS 科创板, sum(is_szzb) AS 深交所主板, sum(is_cyb) AS 创业板, sum(is_bj) AS 北交所 FROM cn_stock_factors_security_profile GROUP BY date ORDER BY date ``` ## 示例数据 展示最新一日数据的前 5 行和后 5 行 {{sample_data}}
证券资料 (cn_stock_factors_security_profile)
数据描述: 沪深北A股日频证券资料:身份属性、交易状态、指数成分。
文档
用例
表结构
| 字段 | 字段类型 | 字段描述 |
| holding_by_insurance | int32 | 保险资金是否位列十大股东. 0: 未持有; 1: 持有 |
| margin_trading_status | int32 | 两融标的. 0: 不属于; 1: 属于 |
| holding_by_social_security | int32 | 社保基金是否位列十大股东. 0: 未持有; 1: 持有 |
| name | string | 证券简称 |
| instrument | string | 证券代码 |
| __PARTITION__ | int64 | - |
| suspended | int8 | 停牌标记. 0: 正常; 1: 停牌 |
| is_cyb | int32 | 是否为创业板. 0: 否; 1: 是 |
| list_date | timestamp[ns] | 上市日期 |
| is_bj | int32 | 是否为北交所. 0: 否; 1: 是 |
| is_sh | int32 | 是否为上交所. 0: 否; 1: 是 |
| is_sz | int32 | 是否为深交所. 0: 否; 1: 是 |
| date | timestamp[ns] | 日期 |
| is_kcb | int32 | 是否为科创板. 0: 否; 1: 是 |
| is_bz50 | int32 | 是否属于北证50成分股. 0: 不属于; 1: 属于 |
| is_cybz | int32 | 是否属于创业板指成分股. 0: 不属于; 1: 属于 |
| is_kc50 | int32 | 是否属于科创50成分股. 0: 不属于; 1: 属于 |
| is_sh50 | int32 | 是否属于上证50成分股. 0: 不属于; 1: 属于 |
| is_shzb | int32 | 是否为上交所主板. 0: 否; 1: 是 |
| is_szcz | int32 | 是否属于深证成指成分股. 0: 不属于; 1: 属于 |
| is_szzb | int32 | 是否为深交所主板. 0: 否; 1: 是 |
| is_szzs | int32 | 是否属于上证指数成分股. 0: 不属于; 1: 属于 |
| is_hs300 | int32 | 是否属于沪深300成分股. 0: 不属于; 1: 属于 |
| is_sz100 | int32 | 是否属于深证100成分股. 0: 不属于; 1: 属于 |
| is_zz100 | int32 | 是否属于中证100成分股. 0: 不属于; 1: 属于 |
| is_zz500 | int32 | 是否属于中证500成分股. 0: 不属于; 1: 属于 |
| is_zz1000 | int32 | 是否属于中证1000成分股. 0: 不属于; 1: 属于 |
| list_days | int64 | 已上市天数. 按自然日计算, = 当前日期 - 上市日期 |
| st_status | int8 | ST状态. 0: 正常; 1: ST; 2: *ST |
| list_sector | int8 | 上市板块代码. 0: 未知; 1: 主板; 2: 创业板; 3: 科创板; 4: 北交所 |
| is_risk_warning | int8 | 风险警示. 0: 正常; 1: 风险警示 |
| line_price_limit | int32 | 一字涨跌停. 0: 正常; 1: 一字涨停; 2: 一字跌停 |
| price_limit_status | int8 | 收盘涨跌停状态. 1: 跌停; 2: 非涨跌停; 3: 涨停 |
表名:cn_stock_factors_security_profile
起始时间:
最近更新时间: