--- title: 布林带类技术指标因子(cn_stock_factors_ta_bbands) source: bigfactorwarehouse / cn_stock / cn_stock_factors_ta_bbands format: markdown --- # 布林带类技术指标因子(cn_stock_factors_ta_bbands) > 布林带三轨(中轨 / 上轨 / 下轨)在 (5, 10, 20) 周期 × (1.5σ, 2σ, 2.5σ) 共 9 档参数下的绝对轨道价,共 27 列。与通道与位置类的 `boll_pos_*`(%B 相对位置)互补:本表给出轨道价本身,适合做突破判别、止损线、通道宽度(上轨−下轨)等二次加工。 > > - **因子数量**:27 个因子 / 27 个数据列 > - **主键**:`date` + `instrument`(按 `cn_stock_instruments` 对齐全市场标的) > - **数据起始**:2010-01-01,日频增量更新 > - **复权口径**:后复权(`cn_stock_bar1d` 全表统一) --- ## 1. 上游依赖(基础数据表) | 上游表 | 用途 | 本表用到的字段 | |---|---|---| | `cn_stock_bar1d` | 后复权日行情,全部因子的计算输入 | `date`, `instrument`, `low`, `close` | | `cn_stock_instruments` | 全市场标的清单,决定本表每日的 `date` / `instrument` 组合 | `date`, `instrument` | > `cn_stock_bar1d` 为分区表,SQL 的 date 过滤由 `dai.query(filters={"date": [...]})` 下推完成。 --- ## 2. 因子清单(27 列) | # | 因子中文名 | 字段名 | 参数 | 因子逻辑 | 所属因子族 | |---|---|---|---|---|---| | 1 | 布林带中轨 | `bbands_middle_5_1d5` | 5/1.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 2 | 布林带中轨 | `bbands_middle_10_1d5` | 10/1.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 3 | 布林带中轨 | `bbands_middle_20_1d5` | 20/1.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 4 | 布林带中轨 | `bbands_middle_5_2` | 5/2 | n1 周期收盘价 SMA | 布林带中轨族 | | 5 | 布林带中轨 | `bbands_middle_10_2` | 10/2 | n1 周期收盘价 SMA | 布林带中轨族 | | 6 | 布林带中轨 | `bbands_middle_20_2` | 20/2 | n1 周期收盘价 SMA | 布林带中轨族 | | 7 | 布林带中轨 | `bbands_middle_5_2d5` | 5/2.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 8 | 布林带中轨 | `bbands_middle_10_2d5` | 10/2.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 9 | 布林带中轨 | `bbands_middle_20_2d5` | 20/2.5 | n1 周期收盘价 SMA | 布林带中轨族 | | 10 | 布林带上轨 | `bbands_upper_5_1d5` | 5/1.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 11 | 布林带上轨 | `bbands_upper_10_1d5` | 10/1.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 12 | 布林带上轨 | `bbands_upper_20_1d5` | 20/1.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 13 | 布林带上轨 | `bbands_upper_5_2` | 5/2 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 14 | 布林带上轨 | `bbands_upper_10_2` | 10/2 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 15 | 布林带上轨 | `bbands_upper_20_2` | 20/2 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 16 | 布林带上轨 | `bbands_upper_5_2d5` | 5/2.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 17 | 布林带上轨 | `bbands_upper_10_2d5` | 10/2.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 18 | 布林带上轨 | `bbands_upper_20_2d5` | 20/2.5 | 中轨 + n2 × 标准差 | 布林带上轨族 | | 19 | 布林带下轨 | `bbands_lower_5_1d5` | 5/1.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 20 | 布林带下轨 | `bbands_lower_10_1d5` | 10/1.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 21 | 布林带下轨 | `bbands_lower_20_1d5` | 20/1.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 22 | 布林带下轨 | `bbands_lower_5_2` | 5/2 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 23 | 布林带下轨 | `bbands_lower_10_2` | 10/2 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 24 | 布林带下轨 | `bbands_lower_20_2` | 20/2 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 25 | 布林带下轨 | `bbands_lower_5_2d5` | 5/2.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 26 | 布林带下轨 | `bbands_lower_10_2d5` | 10/2.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | | 27 | 布林带下轨 | `bbands_lower_20_2d5` | 20/2.5 | 中轨 − n2 × 标准差 | 布林带下轨族 | --- ## 3. 因子族公式与 DAI SQL ### 3.1 布林带中轨族 **公式**:中轨 = SMA(close, n1) **输出列(9)**:`bbands_middle_5_1d5`、`bbands_middle_10_1d5`、`bbands_middle_20_1d5`、`bbands_middle_5_2`、`bbands_middle_10_2`、`bbands_middle_20_2`、`bbands_middle_5_2d5`、`bbands_middle_10_2d5`、`bbands_middle_20_2d5` ```sql SELECT date, instrument, m_ta_bbands_m(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_middle_5_1d5, m_ta_bbands_m(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_middle_10_1d5, m_ta_bbands_m(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_middle_20_1d5, m_ta_bbands_m(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_middle_5_2, m_ta_bbands_m(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_middle_10_2, m_ta_bbands_m(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_middle_20_2, m_ta_bbands_m(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_middle_5_2d5, m_ta_bbands_m(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_middle_10_2d5, m_ta_bbands_m(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_middle_20_2d5 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.2 布林带上轨族 **公式**:上轨 = SMA(close, n1) + n2 × STD(close, n1) **输出列(9)**:`bbands_upper_5_1d5`、`bbands_upper_10_1d5`、`bbands_upper_20_1d5`、`bbands_upper_5_2`、`bbands_upper_10_2`、`bbands_upper_20_2`、`bbands_upper_5_2d5`、`bbands_upper_10_2d5`、`bbands_upper_20_2d5` ```sql SELECT date, instrument, m_ta_bbands_u(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_upper_5_1d5, m_ta_bbands_u(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_upper_10_1d5, m_ta_bbands_u(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_upper_20_1d5, m_ta_bbands_u(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_upper_5_2, m_ta_bbands_u(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_upper_10_2, m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_upper_20_2, m_ta_bbands_u(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_upper_5_2d5, m_ta_bbands_u(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_upper_10_2d5, m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_upper_20_2d5 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.3 布林带下轨族 **公式**:下轨 = SMA(close, n1) − n2 × STD(close, n1) **输出列(9)**:`bbands_lower_5_1d5`、`bbands_lower_10_1d5`、`bbands_lower_20_1d5`、`bbands_lower_5_2`、`bbands_lower_10_2`、`bbands_lower_20_2`、`bbands_lower_5_2d5`、`bbands_lower_10_2d5`、`bbands_lower_20_2d5` ```sql SELECT date, instrument, m_ta_bbands_l(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_lower_5_1d5, m_ta_bbands_l(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_lower_10_1d5, m_ta_bbands_l(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) AS bbands_lower_20_1d5, m_ta_bbands_l(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_lower_5_2, m_ta_bbands_l(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_lower_10_2, m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) AS bbands_lower_20_2, m_ta_bbands_l(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_lower_5_2d5, m_ta_bbands_l(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_lower_10_2d5, m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) AS bbands_lower_20_2d5 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` --- ## 4. 数据加工说明 ### 4.1 加工链路 ``` cn_stock_bar1d(后复权,WHERE close IS NOT NULL) → 3 组因子族 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 个交易日) | 本表最长窗口 / 预热需求约 20 个交易日 | 多读一段历史不改变任何输出值(窗口算子只向前看),只是把区间首日的"本可避免的缺失"消掉。 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 本表实现要点 - 小数参数按上游工程别名规则写入列名:1.5 → `1d5`,2.5 → `2d5`,2 → `2`。 - `m_ta_bbands_*` 的周期与倍数必须用命名参数传入(`timeperiod:=` / `nbdevup:=` / `nbdevdn:=` / `matype:=`),位置参数写法在 DAI 中会报 `Binder Error`;`matype:=0` 表示中轨用 SMA。 - 同一参数档的中轨在三个族中重复计算,SQL 层各族独立执行以便并行,落库后三轨可直接相减得到带宽。 --- ## 5. 覆盖度实测 实测区间 **2026-09-07 ~ 2026-09-17**(9 个交易日、50052 行,已按 `cn_stock_instruments` 对齐全市场标的): | 指标 | 数值 | |---|---| | 因子列数 | 27 | | 最低覆盖度 | **99.50%**(bbands_middle_20_1d5) | | 中位覆盖度 | 99.63% | | 最高覆盖度 | 99.72% | | 覆盖度 < 85% 的列数 | 0 | | `tester.py` 关键测试点 | ✅ 通过 | 覆盖度最低的三列:`bbands_middle_20_1d5`(99.5%)、`bbands_middle_20_2`(99.5%)、`bbands_upper_20_1d5`(99.5%)。缺失主要来自**上市不足窗口长度的新股**与**当日停牌**,逐列明细见 `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. **无未来函数**:全部因子只用当期与历史滚动数据;回测时注意前向收益口径(建议用次日开盘价), 收盘价口径会系统性高估短周期反转类因子的收益。
布林带因子 (cn_stock_factors_ta_bbands)
数据描述: 布林带类技术指标因子
文档
用例
表结构
| 字段 | 字段类型 | 字段描述 |
| bbands_lower_20_2d5 | double | 布林带下轨(参数 20/2.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_middle_5_1d5 | double | 布林带中轨(参数 5/1.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| instrument | string | 证券代码 |
| bbands_upper_10_1d5 | double | 布林带上轨(参数 10/1.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_upper_10_2d5 | double | 布林带上轨(参数 10/2.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_upper_20_1d5 | double | 布林带上轨(参数 20/1.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_upper_20_2d5 | double | 布林带上轨(参数 20/2.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_middle_10_1d5 | double | 布林带中轨(参数 10/1.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_middle_10_2d5 | double | 布林带中轨(参数 10/2.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_middle_20_1d5 | double | 布林带中轨(参数 20/1.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_middle_20_2d5 | double | 布林带中轨(参数 20/2.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=20, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| date | timestamp[ns] | 日期 |
| bbands_middle_5_2d5 | double | 布林带中轨(参数 5/2.5)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_lower_5_1d5 | double | 布林带下轨(参数 5/1.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_lower_5_2 | double | 布林带下轨(参数 5/2)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_upper_5_2 | double | 布林带上轨(参数 5/2)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_lower_10_2 | double | 布林带下轨(参数 10/2)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_lower_20_2 | double | 布林带下轨(参数 20/2)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_middle_5_2 | double | 布林带中轨(参数 5/2)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=5, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_upper_10_2 | double | 布林带上轨(参数 10/2)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_upper_20_2 | double | 布林带上轨(参数 20/2)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) |
| __PARTITION__ | int64 | - |
| bbands_lower_5_2d5 | double | 布林带下轨(参数 5/2.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_middle_10_2 | double | 布林带中轨(参数 10/2)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=10, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_middle_20_2 | double | 布林带中轨(参数 20/2)。n1 周期收盘价 SMA。计算式:m_ta_bbands_m(close, timeperiod:=20, nbdevup:=2, nbdevdn:=2, matype:=0) |
| bbands_upper_5_1d5 | double | 布林带上轨(参数 5/1.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=5, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_upper_5_2d5 | double | 布林带上轨(参数 5/2.5)。中轨 + n2 × 标准差。计算式:m_ta_bbands_u(close, timeperiod:=5, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_lower_10_1d5 | double | 布林带下轨(参数 10/1.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=10, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
| bbands_lower_10_2d5 | double | 布林带下轨(参数 10/2.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=10, nbdevup:=2.5, nbdevdn:=2.5, matype:=0) |
| bbands_lower_20_1d5 | double | 布林带下轨(参数 20/1.5)。中轨 − n2 × 标准差。计算式:m_ta_bbands_l(close, timeperiod:=20, nbdevup:=1.5, nbdevdn:=1.5, matype:=0) |
表名:cn_stock_factors_ta_bbands
起始时间:
最近更新时间: