AI 原生量化投研平台AI-native quantitative research platform
正在加载…Loading…
页面仍在加载,可以继续等待,或重新加载。The page is still loading. You can keep waiting or reload.
部分页面资源未能加载,请重新加载。Some page resources could not load. Please reload.
设备当前处于离线状态,恢复连接后可以继续等待或重新加载。Your device is offline. Once connected, you can keep waiting or reload.
沪深北A股日频证券资料:身份属性、交易状态、指数成分。
32 个字段 · 主键 date + instrument
沪深北A股日频证券资料:身份属性、交易状态、指数成分。
证券资料表 cn_stock_factors_security_profile 以「交易日期 + 证券代码」为主键,把一只股票在某个交易日的身份属性和交易属性汇总到一行,共 30 个字段。
这张表回答的是「这只股票当天是什么」这类问题:
所有字段都是状态量而非价格量,主要用于选股前的股票池过滤、回测中的可交易性约束以及分组统计,通常不直接作为打分因子使用。
| 项目 | 说明 |
|---|---|
| 数据表名称 | 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 日的行情成交,避免在涨跌停或停牌日产生无法成交的信号。
import dai
df = dai.query( "SELECT * FROM cn_stock_factors_security_profile", filters={"date": ["2025-01-01", "2025-06-30"]},).df()import dai
sql = """SELECT date, instrument, nameFROM cn_stock_factors_security_profileWHERE 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()SELECT date, instrument, name, list_sector, list_days, st_status, suspended, price_limit_statusFROM cn_stock_factors_security_profileWHERE instrument = '000001.SZ'ORDER BY dateSELECT b.date, b.instrument, b.close, p.name, p.is_hs300, p.margin_trading_statusFROM cn_stock_bar1d AS bLEFT JOIN cn_stock_factors_security_profile AS p ON b.date = p.date AND b.instrument = p.instrumentWHERE p.suspended = 0 AND p.st_status = 0 AND p.line_price_limit = 0SELECT 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_profileGROUP BY dateORDER BY date展示最新一日数据的前 5 行和后 5 行
{{sample_data}}
SELECT date, instrument, name, list_sector, list_date, list_days, is_sh FROM cn_stock_factors_security_profile WHERE date >= '2026-10-06' ORDER BY date LIMIT 100
SELECT date, instrument, name, list_sector, list_date, list_days, is_sh FROM cn_stock_factors_security_profile WHERE date >= '2026-10-06' ORDER BY date LIMIT 100