# 连板接力强势因子 · 文档 ## 1. 因子定位 **连板接力强势因子**(`alpha_lianban_relay`)是一个**事件驱动型强势接力因子**。 - **思路**:全市场扫描当日处于「连续涨停(连板)」状态的个股,再叠加《综合强历史行情排序.txt》 (综合强势接力盘后选股 V3.2)的封板质量与多维共振过滤,把「还在连板 + 至少有 5 组指标共振 + 封板形态健康」的票挑出来,因子值取其连板数。 - **取值**:`factor = 连板数`(仅当理论涨停口径连板数 ≥ 2 且 V3.2 命中),其余股票为 0; 值域 `{0, 2, 3, 4, 5, 6}`,非零样本每日仅个位数,属**稀疏事件因子**,方向为正 (`factor_direction = 1`,值越大代表接力强度越高)。 - **与本目录上级 `lianban_scan.py` 的关系**:本脚本是它的 **BigQuant 因子化改写版**—— 连板口径、V3.2 转换、结果列全部沿用,只把「打印结果」改成「落因子表 + 可选提交平台」。 > **本脚本不做本地因子回测**。IC/IR、分层收益、多空绩效等因子分析一律不在本地计算, > 由 AIStudio 平台的因子分析流程(AlphaMiner)在提交后基于因子表完成。 --- ## 2. 数据来源与计算链路 **数据来源**:行情**双源自动切换**(`--source`,默认 `auto`:检测到平台 SDK `dai` 走平台, 否则走本地 pytdx): | 源 | 取数方式 | 目标交易日缺省时 | | --- | --- | --- | | 平台(AIStudio) | `dai` 读平台原生日线表 `cn_stock_bar1d`(后复权);代码表 / 换手率 / 流通股本均取自该表 | 表内 `max(date)` | | 本地(无 `dai`) | `pytdx` 直连通达信行情服务器,读缓存 `_cache/mkt_<日期>.pkl`,无缓存则联网现取并回写 | 最新缓存日期 | 平台侧的字段映射:`stocks()` ← 目标日 `SELECT DISTINCT instrument, name`;日线 ← 同名字段 (`volume` 单位手、`amount` 单位元,表本身即后复权);流通股本(股)= `volume / turn × 10000` (由换手率反推,代入后 `HS ≡ turn`,换手口径与本地一致);一次取回整个回溯窗口(500 自然日, 覆盖 `REF(C,250)` / `HHV(H,250)`)的全市场日线后按 `instrument` 分组缓存,避免逐票 5000+ 次查询。 `cn_stock_bar1d` 按 `date` 分区,平台强制查询带分区范围,故每处 `dai.query` 都同时传 `filters={"date": [start, end]}`(日线窗口 `[目标日-500天, 目标日]`、代码表 `[目标日, 目标日]`、 最新交易日取最近 120 天),不使用 `full_db_scan=True`。 ``` 行情:平台 cn_stock_bar1d(后复权) / 本地 pytdx(_cache/mkt_<日期>.pkl) │ │ 1) as-of 截断:df[df.date <= 目标交易日],最后一根不是目标日的票(停牌/未上市)跳过 │ 2) StockSeries 构造:O/H/L/C/V(手)/AMOUNT(元)/CAPITAL(手)/HS(换手%) ▼ eval_stock(s) ── 理论涨停口径连板数 n、板型、首板日、区间换手/成交额/市值等明细 │ │ n >= min_board(默认2) ▼ formula_v32(s) ── V3.2 十项与门:真板 + 六组共振(>=5) + 动量续航门 + 分歧板闸门 │ + 修复2连闸门 + 连板高度帽(<=6) + 基础可交易过滤 ▼ factor = n(命中) / 0(未命中) → a_lianban_factor.csv(date/instrument/factor,增量去重) │ ├─▶ a_lianban_picks_YYYY-MM-DD.csv(当日选股名单,明细列,人工核对用) └─▶ [仅 AIStudio] dai.DataSource.write_bdb → factors.submit_factor(分析交平台) ``` 一次性遍历全市场(约 5200 只),每只票只用「目标日及之前」的 K 线,**无未来函数**。 本地缓存命中时实测约 2 秒/交易日;平台源多一次全市场行情查询(500 自然日窗口), 取数耗时取决于平台,逐票计算部分与本地相同。 --- ## 3. 因子定义 ### 3.1 连板口径:理论涨停价(`eval_stock` + `zt_mask`) ``` 涨停价 = floor(前收 × (1 + 涨跌幅上限) × 100 + 0.5) / 100 # 四舍五入到分 涨停 = |收盘 − 涨停价| < 0.005 连板数 = 以目标交易日为终点往前连续「涨停」的根数,断板即止 ``` 涨跌幅上限按板块自适应:主板 10%(ST 5%)、创业板/科创板(300/301/302/688/689)20%、 北交所(4/8 开头)30%。 > 用「理论涨停价」而不是「涨幅 ≥ 9.5%」,是为排除**收在最高价但并未封板的 9.5%~9.9% 假板** > (这类票会把连板数算多)。 ### 3.2 真板口径:V3.2 公式(`formula_v32`) ``` 涨停 = 涨幅 >= 9.5 # 进入涨停区(主板口径) 板面 = 收盘 >= 最高 × 0.995 # 收盘紧贴当日最高 真板 = 涨停 且 板面 # 价 + 封板形态双确认 连板 = 真板 ? BARSLAST(~真板) : 0 炸板 = (最高 >= 前收×(1+9.5%)) 且 非真板 ``` 两套口径**相近但不等价**:理论涨停价看「收盘是否精确落在涨停价」,真板看「涨幅 + 收盘贴最高」, 故结果同时给出两套连板数(`连板数` / `公式连板`)便于对照。 ### 3.3 V3.2 选股与门(XG,10 项全部成立才命中) | 序 | 与门 | 条件 | | --- | --- | --- | | 1 | 上市足 | `COUNT(V>0, 0) >= 60`(自上市起累计,即上市满 60 个交易日) | | 2 | 有量 | `V > 0` 且 成交额 ≥ 0.5 亿 | | 3 | 非一字 | `L < H`(当日盘中开过板;一字板必被剔除) | | 4 | 换手适 | 换手率 ∈ [2%, 40%] | | 5 | 不过高 | 公式口径连板数 ≤ 6 | | 6 | 连续大涨 | 公式口径连板数 ≥ 2 | | 7 | 动量门 | 连板数 ≥ 3,或(中期动量续航:`C>MA60 且 涨幅60>0`,且(`动量12_1>20%` 或 `距250日高≤15%` 或 `加速>3 且 涨幅60>10`)) | | 8 | 共振数 ≥ 5 | 六组共振(均线多头 / MACD 零轴上多头 / KDJ 强势 / RSI 短中强势 / 量价配合 / 位置强势+真板基因)命中数 ≥ 5 | | 9 | 分板闸门 | 非分歧板,或(连板 ≥ 4 且 共振数 ≥ 6) | | 10 | ~修复2连 | 排除「2 连板且前两日刚炸板」的形态 | **封板一致度分级**(由量比与换手率判定,用于第 9 项闸门与结果列): 缩量一致(量比 < 1.1 且 换手 ≤ 15%)→ 温和一致(量比 ≤ 2.5 且 换手 ≤ 24%)→ 分歧板。 ### 3.4 因子取值 ``` factor = 连板数(理论口径) 若 连板数 >= 2 且 V3.2 命中(XG = 1) factor = 0 其余股票(含未连板、连板但 V3.2 未命中) ``` 模板中其余参数:涨停线 9.5 / 额下限 5e7 / 放量倍-天量倍 1.1-7.0 / 追高线 65 / 高板限 6 / 板距帽 0.995 / 影帽 50 / 回撤帽 3 / 一致量1-一致换1 1.1-15 / 一致量2-一致换2 2.5-24。 --- ## 4. 因子分析(不本地回测,交平台) **本脚本刻意不做本地因子回测/分析**,具体表现: - 代码中**没有** IC/IR、分层收益、绩效、换手率、最大回撤、曲线与 HTML/JSON 报告等任何环节; - 提交因子时 `performance_report=""`(空串)、`performance_index` 只含因子口径参数, 不带任何本地计算的绩效指标; - 因子分析交由 AIStudio 平台的因子分析流程(AlphaMiner)在收到因子数据源后自行完成, 口径以平台为准。 因此本地唯一需要关注的产出是:**因子表数值是否正确**(见第 6 节产物与第 7 节核对方法)。 --- ## 5. 参数(`params`) 提交时 `performance_index` 即下面这份口径参数(`dict(params)`),供平台端因子分析使用: | 参数 | 默认值 | 含义 | | --- | --- | --- | | group_num | 10 | 因子分析分层组数 | | factor_field | "factor" | 因子值列名 | | instruments | "全市场" | 股票池 | | factor_direction | 1 | 因子方向(1 = 值越大越看多) | | benchmark | "中证500" | 基准 | | data_process | True | 平台端是否做去极值/标准化等数据预处理 | 命令行参数(`python lianban_factor.py --help`): | 参数 | 默认 | 含义 | | --- | --- | --- | | `--date` | 最新缓存日期 | 目标交易日 `YYYY-MM-DD` | | `--min` | 2 | 最少连板数(因子非零门槛) | | `--limit` | 0 | 只跑前 N 只(调试用;会禁用缓存) | | `--out` | `a_lianban_factor.csv` | 因子表 CSV 路径 | | `--no-cache` | 关 | 禁用缓存,强制联网现取 | | `--from-csv` | 关 | 不取行情,直接用已落盘因子表做落库/提交 | | `--no-submit` | 关 | 只算不提交(非 AIStudio 环境本就会自动跳过) | | `--group-num` | 10 | 分层组数(提交参数) | | `--instruments` | 全市场 | 股票池(提交参数) | | `--benchmark` | 中证500 | 基准(提交参数) | --- ## 6. 产物清单 | 产物 | 说明 | | --- | --- | | `a_lianban_factor.csv` | **主产物**,因子表 `date / instrument / factor`,按 `(date, instrument)` 去重后增量追加;每日新增一行/票(约 5200 行) | | `a_lianban_picks_YYYY-MM-DD.csv` | 当日选股名单(23 列明细,见「表结构」文档第 2 节),无命中则不生成 | | `lianban_factor.log` | 定时任务日志(由 `.bat` 追加写入) | > **所有 CSV 文件名一律以字母 `a` 开头**(`a_lianban_*`):中文或非 ASCII 文件名在上传/ > 打包链路上容易被截断或编码损坏,`a` 前缀同时保证在文件管理器中排序靠前、便于定位。 > 落盘编码统一 `utf-8-sig`(Excel 直接双击不乱码)。 --- ## 7. 定时运行(每天 20:45) - **计划任务名**:`LianbanFactor_DailyUpdate` - **触发时间**:每天 **20:45:00** - **执行脚本**:`run_lianban_daily.bat`(与本脚本同目录,**ASCII-only**) - **运行身份**:`SYSTEM`(`LogonType: ServiceAccount`、`RunLevel: Highest`),等价于任务计划程序里的 「**不管用户是否登录都要运行**」—— 不需要保存账户密码,注销 / 锁屏 / 未登录时到点照样触发。 - **补跑策略**:已勾选「**错过启动时间后尽快启动**」(`StartWhenAvailable = True`)—— 若 20:45 时机器处于关机 / 休眠状态,开机后会尽快自动补跑一次。 - **超时限制**:`ExecutionTimeLimit = PT2H`(本地无缓存联网现取全市场约 5~6 分钟,2 小时足够宽裕)。 - **注册状态**:**已注册**(`Status: Ready`,`Logon Mode: Interactive/Background`, `Run As User: SYSTEM`,`Next Run Time` 为当日/次日 20:45:00) - **注册 / 改造命令**(重建或换机器时,以管理员身份执行 PowerShell): ```powershell # 触发器 20:45 + SYSTEM 身份 + 错过补跑 + 2 小时超时 $set = New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries ` -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNew ` -ExecutionTimeLimit (New-TimeSpan -Hours 2) $p = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest $a = New-ScheduledTaskAction -Execute "c:\Users\Administrator\Documents\trae_projects\lianban_factor\run_lianban_daily.bat" $t = New-ScheduledTaskTrigger -Daily -At 20:45 Register-ScheduledTask -TaskName "LianbanFactor_DailyUpdate" -Action $a -Trigger $t ` -Settings $set -Principal $p -Force # 任务已存在时,只改运行身份与补充设置(触发器不动) Set-ScheduledTask -TaskName "LianbanFactor_DailyUpdate" -Settings $set -Principal $p # 手动触发一次验证链路(不影响原有触发器) schtasks /run /tn "LianbanFactor_DailyUpdate" ``` `.bat` 内的动作: ```bat cd /d "%~dp0" rem 切到脚本所在目录 for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd"') do set "TODAY=%%i" "%PY%" lianban_factor.py --date %TODAY% >>"%LOG%" 2>&1 ``` **为什么选 20:45**:交易所龙虎榜与当日行情数据在 18:00~20:00 陆续披露完毕,20:45 取到的 是**当日完整日线**;同时早于次日开盘,保证盘前可用。若当日为非交易日(周末/节假日), 目标日无 K 线,脚本会提示「因子表为空」并正常退出(`errorlevel 0`),不产生脏数据。 --- ## 8. 提交到 AIStudio ### 8.1 提交通路 ``` a_lianban_factor.csv (date/instrument/factor) │ dai.DataSource.write_bdb(id="alpha_lianban_relay_data", │ unique_together=["date","instrument"], indexes=["date"]) ▼ 平台数据源 alpha_lianban_relay_data(列 factor) │ factors.submit_factor(id="alpha_lianban_relay", datasource_id=..., datasource_column="factor") ▼ 因子 alpha_lianban_relay → 平台因子分析(AlphaMiner) ``` ### 8.2 `factors.submit_factor` 参数对照 | 参数 | 取值 | | --- | --- | | id | `alpha_lianban_relay` | | name | 连板接力强势因子 | | performance_index | `dict(params)`(第 5 节口径参数) | | performance_report | `""`(**本地不做回测**,故为空串) | | metadata | `{}` | | docs | `{"因子类型": "事件驱动/强势接力因子", "口径": "理论涨停口径连板数>=2 且 V3.2 公式命中,取值=连板数,其余为 0"}` | | desc | 因子描述(含口径概述与「不做本地回测,因子分析由平台完成」) | | factor_sql | `FACTOR_SQL`(DuckDB 方言,基于已开通的 `cn_stock_bar1d`,涨停用其 `upper_limit` 列判定;数值以数据源为准) | | datasource_id / datasource_column | `alpha_lianban_relay_data` / `factor` | | space_id | `""`(默认主站空间「我的因子」) | ### 8.3 提交前检查 1. `a_lianban_factor.csv` 已含目标交易日,且**非零行数与选股名单行数一致**; 2. `instrument` 带 `.SH/.SZ/.BJ` 后缀、`date` 可被解析为日期、`factor` 为数值; 3. `(date, instrument)` 无重复(重复执行也不会重复入库); 4. AIStudio 环境**只需上传本脚本一个文件**(`lianban_factor.py`)——脚本已把 8 个通达信 向量算子与 `StockSeries` 内联,且未依赖 `tdx_engine.py`(后者顶层 `import pytdx`,平台上 既未安装也连不通行情服务器),行情改由平台 `cn_stock_bar1d` 取得;`--source auto` 在平台自动选平台源,不必手动指定; 5. 本地无 `dai` / `bigalpha` SDK,故本地运行只会打印跳过提示,不报错;提交须在 AIStudio 环境执行。若只想用已有因子表提交,可加 `--from-csv` 跳过行情取数。 --- ## 9. 已知限制 1. **稀疏事件因子**:非零样本每日仅个位数(示例日 4 只),横截面上绝大多数为 0, 分层/IC 统计的有效样本有限,平台端分析建议放宽股票池或改用因子值=0/1 的二值口径观察。 2. **`FACTOR_SQL` 只覆盖一半口径**:平台原生日线表 `cn_stock_bar1d` 已开通,SQL 可直接 复算「理论涨停口径连板数 ≥ 2」(涨停用其 `upper_limit` 列判定),但 V3.2 的六组共振 / 封板一致度 / 动量续航等与门无法用 SQL 表达,故 SQL 查询结果**不等价于**提交的因子数值; 因子数值以 `alpha_lianban_relay_data.factor` 为准。 3. **本地缓存按交易日一份**:本地源的缓存交易日数量取决于历史运行次数,回补历史只能靠联网 现取;本脚本每次只算**一个**目标交易日,历史回补需按日期重复执行。平台源不受此限 (每次按 500 自然日窗口现取,可直接指定任意历史交易日)。 4. **两套涨停口径并存**:理论涨停价(精确到分)与 V3.2 真板(涨幅+封板形态)不等价, 因子值用前者、公式过滤用后者,属有意设计;如某日两者差异较大需人工复核。 5. **板块涨跌幅上限**:V3.2 的涨停线固定 9.5(主板口径),20CM/30CM 板块的高换手高涨幅 票可能被第 6 项与门(连续大涨)误伤,需要时按板块调整涨停线(源码注释已标明)。 6. **不做本地回测**:本地没有任何 IC/绩效校验环节,因子有效性完全依赖平台的因子分析结果。 7. **数据可得性**:20:45 时点已满足——平台源要求 `cn_stock_bar1d` 当日日线已入库(该表 日线当日盘后即更新),本地源要求通达信行情接口当日日线已可取;取不到的交易日会直接报错 退出而非静默出错,停牌/未上市股票会被跳过(该票当日不入因子表)。若平台表尚未更新到当日, 可显式指定 `--date <上一交易日>`,或用 `--source local` 走本地缓存。
连板接力强势因子 (alpha_lianban_relay_data)
数据描述: 连板接力强势因子(alpha_lianban_relay_data) 依赖于下面的因子库:cn_stock_bar1d,cn_stock_factors_base,cn_stock_index_bar1d,cn_stock_index_bar1d,cn_stock_industry_component,cn_stock_valuation,cn_stock_dragon_list,cn_option_dragon_list,cn_stock_real_bar1d,cn_stock_limit_price,cn_stock_index_component,cn_stock_factors_base、cn_stock_index_bar1d,cn_stock_valuation,cn_stock_industry_component,cn_stock_factors_base
文档
用例
表结构
| 字段 | 字段类型 | 字段描述 |
| factor | double | - |
| date | timestamp[ns] | - |
| instrument | string | - |
表名:alpha_lianban_relay_data
起始时间:
最近更新时间: