通道与位置类因子 (cn_stock_factors_ta_channel)

数据描述: 通道与位置类相关的技术分析指标因子

文档
数据简介

--- title: 通道与位置类技术指标因子(cn_stock_factors_ta_channel) source: bigfactorwarehouse / cn_stock / cn_stock_factors_ta_channel format: markdown --- # 通道与位置类技术指标因子(cn_stock_factors_ta_channel) > 描述收盘价在各类价格通道中的相对位置,以及通道自身的支撑压力轨道价。布林带 %B 与唐奇安位置为归一化到 0~1 的相对位置(可直接跨股比较),BBIBOLL / CDP / ENV / MIKE 为绝对轨道价(同一股票内可比,跨股需先做量纲处理)。 > > - **因子数量**:10 个因子 / 24 个数据列 > - **主键**:`date` + `instrument`(按 `cn_stock_instruments` 对齐全市场标的) > - **数据起始**:2010-01-01,日频增量更新 > - **复权口径**:后复权(`cn_stock_bar1d` 全表统一) --- ## 1. 上游依赖(基础数据表) | 上游表 | 用途 | 本表用到的字段 | |---|---|---| | `cn_stock_bar1d` | 后复权日行情,全部因子的计算输入 | `date`, `instrument`, `high`, `low`, `close` | | `cn_stock_instruments` | 全市场标的清单,决定本表每日的 `date` / `instrument` 组合 | `date`, `instrument` | > `cn_stock_bar1d` 为分区表,SQL 的 date 过滤由 `dai.query(filters={"date": [...]})` 下推完成。 --- ## 2. 因子清单(24 列) | # | 因子中文名 | 字段名 | 参数 | 因子逻辑 | 所属因子族 | |---|---|---|---|---|---| | 1 | 布林带位置 %B | `boll_pos_20` | 20, 2σ | 收盘价在 20 日布林带内的相对位置 | 布林带位置 %B 族 | | 2 | 布林带位置 %B | `boll_pos_26` | 26, 2σ | 收盘价在 26 日布林带内的相对位置 | 布林带位置 %B 族 | | 3 | 布林带位置 %B | `boll_pos_60` | 60, 2σ | 收盘价在 60 日布林带内的相对位置 | 布林带位置 %B 族 | | 4 | 唐奇安通道位置 | `donchian_pos_10` | 10 | 收盘价在 10 日高低区间内的位置 | 唐奇安通道位置族 | | 5 | 唐奇安通道位置 | `donchian_pos_20` | 20 | 收盘价在 20 日高低区间内的位置 | 唐奇安通道位置族 | | 6 | 唐奇安通道位置 | `donchian_pos_60` | 60 | 收盘价在 60 日高低区间内的位置 | 唐奇安通道位置族 | | 7 | 包络线中轨 | `env_mid` | 14 | 14 日均线 | ENV 包络线 | | 8 | 包络线上轨 | `env_upper` | 14, +6% | 14 日均线 × 1.06 | ENV 包络线 | | 9 | 包络线下轨 | `env_lower` | 14, −6% | 14 日均线 × 0.94 | ENV 包络线 | | 10 | 多空布林线中轴 | `bbiboll_mid` | 3/6/12/24 | BBI 中轴 | BBIBOLL 多空布林线 | | 11 | 多空布林线上轨 | `bbiboll_upper` | 10, +3σ | BBI + 3 倍 BBI 的 10 日标准差 | BBIBOLL 多空布林线 | | 12 | 多空布林线下轨 | `bbiboll_lower` | 10, −3σ | BBI − 3 倍 BBI 的 10 日标准差 | BBIBOLL 多空布林线 | | 13 | 逆势操作系统中价 | `cdp` | 1 | 当日 (高+低+收)/3 | CDP 逆势操作系统 | | 14 | 最高值 AH | `cdp_ah` | 1 | CDP + 前日振幅 | CDP 逆势操作系统 | | 15 | 近高值 NH | `cdp_nh` | 1 | 2×CDP − 当日最低价 | CDP 逆势操作系统 | | 16 | 近低值 NL | `cdp_nl` | 1 | 2×CDP − 当日最高价 | CDP 逆势操作系统 | | 17 | 最低值 AL | `cdp_al` | 1 | CDP − 前日振幅 | CDP 逆势操作系统 | | 18 | 麦克指标典型价 | `mike_typ` | 12 | (高+低+收)/3 | MIKE 麦克指标 | | 19 | 初级压力 WR | `mike_wr` | 12 | 2×TYP − 12 日最低价 | MIKE 麦克指标 | | 20 | 中级压力 MR | `mike_mr` | 12 | TYP + 12 日高低价差 | MIKE 麦克指标 | | 21 | 强力压力 SR | `mike_sr` | 12 | 2×12 日最高价 − 12 日最低价 | MIKE 麦克指标 | | 22 | 初级支撑 WS | `mike_ws` | 12 | 2×TYP − 12 日最高价 | MIKE 麦克指标 | | 23 | 中级支撑 MS | `mike_ms` | 12 | TYP − 12 日高低价差 | MIKE 麦克指标 | | 24 | 强力支撑 SS | `mike_ss` | 12 | 2×12 日最低价 − 12 日最高价 | MIKE 麦克指标 | --- ## 3. 因子族公式与 DAI SQL ### 3.1 布林带位置 %B 族 **公式**:%B = (Close − Lower) / (Upper − Lower);Upper/Lower = MA_N ± K·σ **输出列(3)**:`boll_pos_20`、`boll_pos_26`、`boll_pos_60` ```sql SELECT date, instrument, (close - m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0), 0) AS boll_pos_20, (close - m_ta_bbands_l(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0), 0) AS boll_pos_26, (close - m_ta_bbands_l(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0), 0) AS boll_pos_60 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.2 唐奇安通道位置族 **公式**:Pos = (Close − MIN_N(Low)) / (MAX_N(High) − MIN_N(Low)) **输出列(3)**:`donchian_pos_10`、`donchian_pos_20`、`donchian_pos_60` ```sql SELECT date, instrument, (close - m_min(low, 10)) / NULLIF(m_max(high, 10) - m_min(low, 10), 0) AS donchian_pos_10, (close - m_min(low, 20)) / NULLIF(m_max(high, 20) - m_min(low, 20), 0) AS donchian_pos_20, (close - m_min(low, 60)) / NULLIF(m_max(high, 60) - m_min(low, 60), 0) AS donchian_pos_60 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.3 ENV 包络线 **公式**:中轨 = MA14;上轨 = MA14 × 1.06;下轨 = MA14 × 0.94 **输出列(3)**:`env_mid`、`env_upper`、`env_lower` ```sql SELECT date, instrument, m_avg(close, 14) AS env_mid, m_avg(close, 14) * 1.06 AS env_upper, m_avg(close, 14) * 0.94 AS env_lower FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.4 BBIBOLL 多空布林线 **公式**:中轴 = BBI;上轨 = BBI + 3×STD10(BBI);下轨 = BBI − 3×STD10(BBI) **输出列(3)**:`bbiboll_mid`、`bbiboll_upper`、`bbiboll_lower` ```sql WITH bbi_base AS ( SELECT date, instrument, (m_avg(close, 3) + m_avg(close, 6) + m_avg(close, 12) + m_avg(close, 24)) / 4 AS bbi FROM cn_stock_bar1d WHERE close IS NOT NULL ) SELECT date, instrument, bbi AS bbiboll_mid, bbi + 3 * m_stddev(bbi, 10) AS bbiboll_upper, bbi - 3 * m_stddev(bbi, 10) AS bbiboll_lower FROM bbi_base ORDER BY date, instrument ``` ### 3.5 CDP 逆势操作系统 **公式**:CDP = (H+L+C)/3;AH = CDP + (前H−前L);NH = 2·CDP − L;NL = 2·CDP − H;AL = CDP − (前H−前L) **输出列(5)**:`cdp`、`cdp_ah`、`cdp_nh`、`cdp_nl`、`cdp_al` ```sql WITH cdp_base AS ( SELECT date, instrument, high, low, close, m_lag(high, 1) AS pre_high, m_lag(low, 1) AS pre_low FROM cn_stock_bar1d WHERE close IS NOT NULL ) SELECT date, instrument, (high + low + close) / 3 AS cdp, (high + low + close) / 3 + (pre_high - pre_low) AS cdp_ah, (high + low + close) / 3 * 2 - low AS cdp_nh, (high + low + close) / 3 * 2 - high AS cdp_nl, (high + low + close) / 3 - (pre_high - pre_low) AS cdp_al FROM cdp_base ORDER BY date, instrument ``` ### 3.6 MIKE 麦克指标 **公式**:HV = MAX12(High),LV = MIN12(Low),TYP = (H+L+C)/3;WR = 2·TYP − LV;MR = TYP + HV − LV;SR = 2·HV − LV;WS = 2·TYP − HV;MS = TYP − HV + LV;SS = 2·LV − HV **输出列(7)**:`mike_typ`、`mike_wr`、`mike_mr`、`mike_sr`、`mike_ws`、`mike_ms`、`mike_ss` ```sql WITH mike_base AS ( SELECT date, instrument, high, low, close, m_max(high, 12) AS hv, m_min(low, 12) AS lv FROM cn_stock_bar1d WHERE close IS NOT NULL ) SELECT date, instrument, (high + low + close) / 3 AS mike_typ, (high + low + close) / 3 * 2 - lv AS mike_wr, (high + low + close) / 3 + hv - lv AS mike_mr, 2 * hv - lv AS mike_sr, (high + low + close) / 3 * 2 - hv AS mike_ws, (high + low + close) / 3 - hv + lv AS mike_ms, 2 * lv - hv AS mike_ss FROM mike_base ORDER BY date, instrument ``` --- ## 4. 数据加工说明 ### 4.1 加工链路 ``` cn_stock_bar1d(后复权,WHERE close IS NOT NULL) → 6 组因子族 SQL 并行执行(joblib loky, n_jobs=8) → 按 cn_stock_instruments 左连接对齐全市场标的 → schema 归一化(列序 / 类型 / 缺失值) → dai_write 按 date 的年份分区落库 ``` - 历史构建:`create()`,自 **2010-01-01** 起按 **2 年**一段滚动执行,每段结束后 `gc.collect()` 释放内存。 - 增量构建:`build()`,默认覆盖最近 5 个自然日;落库前跑 `tester.py`,落库后更新前端文档。 ### 4.2 回溯冗余(避免窗口未预热导致的缺失值) 窗口算子只在查询下推后的行集上计算,所以每次计算都会**向前多取一段行情**: | 参数 | 取值 | 说明 | |---|---|---| | `lookback_days` | **300 个自然日**(≈ 200 个交易日) | 本表最长窗口 / 预热需求约 60 个交易日 | 多读一段历史不改变任何输出值(窗口算子只向前看),只是把区间首日的"本可避免的缺失"消掉。 EMA / RSI / ATR / MACD / TRIX 属于 IIR 递推算子,理论上预热期无限长,因此这些表的冗余按 **约 5 倍最长周期**取值,而非刚好等于窗口长度。 ### 4.3 停牌空值行的处理 `cn_stock_bar1d` 在停牌日会保留一行、但 `open/high/low/close/amount` 全为 NULL、`volume` 为 0。 `m_ta_*` 递推类算子只要吃到一个 NULL,之后就永久输出 NULL。因此所有 SQL 统一加 `WHERE close IS NOT NULL`,把停牌行从计算输入中剔除(此时 `m_lag(close, 1)` 指向上一个**交易日**, 符合技术指标的常规口径)。 实测(2024-01 全市场,回溯起点 2021-06): | 处理方式 | bbands_middle_20 | atr14 | kdj_j_9 | macd_diff_12_26_9 | |---|---|---|---|---| | 不加过滤 | 88.3% | 88.3% | 88.4% | 88.1% | | **加 `WHERE close IS NOT NULL`** | **99.7%** | **99.7%** | **99.7%** | **99.5%** | ### 4.4 累计型因子的锚点 本表不含累计型因子,全部因子都是固定长度的滚动窗口计算,因此只受 `lookback_days` 影响。 ### 4.5 标的对齐与覆盖度 落库前以 `cn_stock_instruments` 为基准左连接,因此**每个交易日都是全市场标的的完整行**, 停牌股与上市不足窗口长度的新股在对应因子列上为 NULL。入库校验要求单因子整体覆盖度 ≥ 85% (`tester.py` 关键测试点),单日覆盖度 ≥ 80%(非关键,仅告警)。 ### 4.6 本表实现要点 - 本类共 10 个因子、24 个数据列:`bbiboll`(3 列)、`cdp`(5 列)、`env`(3 列)、`mike`(7 列)均为一因子多列输出。 - `bbiboll_mid` 即 BBI 中轴,与趋势指标类的 `bbi` 数值相同,此处保留是为了让通道三轨在同一张表内自洽。 - 轨道价类因子(`cdp_*`/`env_*`/`mike_*`/`bbiboll_*`)与价格同量纲,横截面使用前建议先除以收盘价或做截面标准化。 --- ## 5. 覆盖度实测 实测区间 **2026-09-07 ~ 2026-09-17**(9 个交易日、50052 行,已按 `cn_stock_instruments` 对齐全市场标的): | 指标 | 数值 | |---|---| | 因子列数 | 24 | | 最低覆盖度 | **98.99%**(boll_pos_60) | | 中位覆盖度 | 99.60% | | 最高覆盖度 | 99.79% | | 覆盖度 < 85% 的列数 | 0 | | `tester.py` 关键测试点 | ✅ 通过 | 覆盖度最低的三列:`boll_pos_60`(99.0%)、`donchian_pos_60`(99.0%)、`bbiboll_upper`(99.3%)。缺失主要来自**上市不足窗口长度的新股**与**当日停牌**,逐列明细见 `testdata/coverage_report.md`,数据示例见 `testdata/sample_data.csv`。 --- ## 6. 示例数据 {{sample_data}} --- ## 7. 使用建议 1. **横截面标准化**:本表含绝对量纲列(价位、波幅、成交量等),跨股票比较前建议用 `c_zscore(因子, group=date)` 或 `c_rank(因子, group=date)` 处理,或改用同族的比值型因子。 2. **去极值**:比值类因子分母虽已做 `NULLIF` 保护,但小分母仍会放大尾部,建议按日做分位数截断。 3. **冗余筛选**:同一指标的多参数档位之间相关性很高,建模前建议按 IC / 相关性 / 特征重要性做筛选, 而不是把全部列直接喂给模型。 4. **无未来函数**:全部因子只用当期与历史滚动数据;回测时注意前向收益口径(建议用次日开盘价), 收盘价口径会系统性高估短周期反转类因子的收益。

用例
表结构
字段 字段类型 字段描述
mike_ss double 强力支撑 SS(参数 12)。2×12 日最低价 − 12 日最高价。计算式见 ta_channel_formula.py 中 mike 族 SQL
mike_wr double 初级压力 WR(参数 12)。2×TYP − 12 日最低价。计算式见 ta_channel_formula.py 中 mike 族 SQL
mike_ws double 初级支撑 WS(参数 12)。2×TYP − 12 日最高价。计算式见 ta_channel_formula.py 中 mike 族 SQL
mike_typ double 麦克指标典型价(参数 12)。(高+低+收)/3。计算式见 ta_channel_formula.py 中 mike 族 SQL
env_lower double 包络线下轨(参数 14, −6%)。14 日均线 × 0.94。计算式:m_avg(close, 14) * 0.94
env_upper double 包络线上轨(参数 14, +6%)。14 日均线 × 1.06。计算式:m_avg(close, 14) * 1.06
bbiboll_mid double 多空布林线中轴(参数 3/6/12/24)。BBI 中轴。计算式见 ta_channel_formula.py 中 bbiboll 族 SQL
boll_pos_20 double 布林带位置 %B(参数 20, 2σ)。收盘价在 20 日布林带内的相对位置。计算式:(close - m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0), 0)
boll_pos_26 double 布林带位置 %B(参数 26, 2σ)。收盘价在 26 日布林带内的相对位置。计算式:(close - m_ta_bbands_l(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=26, nbdevup:=2, nbdevdn:=2, matype:=0), 0)
boll_pos_60 double 布林带位置 %B(参数 60, 2σ)。收盘价在 60 日布林带内的相对位置。计算式:(close - m_ta_bbands_l(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0)) / NULLIF(m_ta_bbands_u(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0) - m_ta_bbands_l(close, timeperiod:=60, nbdevup:=2, nbdevdn:=2, matype:=0), 0)
bbiboll_lower double 多空布林线下轨(参数 10, −3σ)。BBI − 3 倍 BBI 的 10 日标准差。计算式见 ta_channel_formula.py 中 bbiboll 族 SQL
date timestamp[ns] 日期
donchian_pos_10 double 唐奇安通道位置(参数 10)。收盘价在 10 日高低区间内的位置。计算式:(close - m_min(low, 10)) / NULLIF(m_max(high, 10) - m_min(low, 10), 0)
donchian_pos_20 double 唐奇安通道位置(参数 20)。收盘价在 20 日高低区间内的位置。计算式:(close - m_min(low, 20)) / NULLIF(m_max(high, 20) - m_min(low, 20), 0)
donchian_pos_60 double 唐奇安通道位置(参数 60)。收盘价在 60 日高低区间内的位置。计算式:(close - m_min(low, 60)) / NULLIF(m_max(high, 60) - m_min(low, 60), 0)
bbiboll_upper double 多空布林线上轨(参数 10, +3σ)。BBI + 3 倍 BBI 的 10 日标准差。计算式见 ta_channel_formula.py 中 bbiboll 族 SQL
__PARTITION__ int64 -
instrument string 证券代码
cdp double 逆势操作系统中价(参数 1)。当日 (高+低+收)/3。计算式见 ta_channel_formula.py 中 cdp 族 SQL
cdp_ah double 最高值 AH(参数 1)。CDP + 前日振幅。计算式见 ta_channel_formula.py 中 cdp 族 SQL
cdp_al double 最低值 AL(参数 1)。CDP − 前日振幅。计算式见 ta_channel_formula.py 中 cdp 族 SQL
cdp_nh double 近高值 NH(参数 1)。2×CDP − 当日最低价。计算式见 ta_channel_formula.py 中 cdp 族 SQL
cdp_nl double 近低值 NL(参数 1)。2×CDP − 当日最高价。计算式见 ta_channel_formula.py 中 cdp 族 SQL
env_mid double 包络线中轨(参数 14)。14 日均线。计算式:m_avg(close, 14)
mike_mr double 中级压力 MR(参数 12)。TYP + 12 日高低价差。计算式见 ta_channel_formula.py 中 mike 族 SQL
mike_ms double 中级支撑 MS(参数 12)。TYP − 12 日高低价差。计算式见 ta_channel_formula.py 中 mike 族 SQL
mike_sr double 强力压力 SR(参数 12)。2×12 日最高价 − 12 日最低价。计算式见 ta_channel_formula.py 中 mike 族 SQL

表名:cn_stock_factors_ta_channel

起始时间:

最近更新时间: