趋势指标类因子 (cn_stock_factors_ta_trend)

数据描述: 趋势指标类技术指标因子

文档
数据简介

--- title: 趋势指标类技术指标因子(cn_stock_factors_ta_trend) source: bigfactorwarehouse / cn_stock / cn_stock_factors_ta_trend format: markdown --- # 趋势指标类技术指标因子(cn_stock_factors_ta_trend) > 刻画价格相对均线的偏离方向与趋势强度:乖离率(BIAS)衡量价格偏离均线的幅度,多头排列判别均线的方向一致性,TRIX/MATRIX 用三重指数平滑滤掉噪声后度量趋势变化率,BBI/DMA/SAR/B3612 从多均线组合、均线差、抛物线转向等角度补充趋势判别。 > > - **因子数量**:26 个因子 / 27 个数据列 > - **主键**:`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. 因子清单(27 列) | # | 因子中文名 | 字段名 | 参数 | 因子逻辑 | 所属因子族 | |---|---|---|---|---|---| | 1 | 5 日乖离率 | `bias_ma5` | 5 | 收盘价偏离 5 日均线的幅度 | BIAS 乖离率族 | | 2 | 12 日乖离率 | `bias_ma12` | 12 | 收盘价偏离 12 日均线的幅度 | BIAS 乖离率族 | | 3 | 20 日乖离率 | `bias_ma20` | 20 | 收盘价偏离 20 日均线的幅度 | BIAS 乖离率族 | | 4 | 60 日乖离率 | `bias_ma60` | 60 | 收盘价偏离 60 日均线的幅度 | BIAS 乖离率族 | | 5 | 120 日乖离率 | `bias_ma120` | 120 | 收盘价偏离 120 日均线的幅度 | BIAS 乖离率族 | | 6 | 短周期均线多头排列 | `bull_arrange_51020` | 5/10/20 | MA5>MA10>MA20 为 1,否则 0 | 均线多头排列族 | | 7 | 中周期均线多头排列 | `bull_arrange_102060` | 10/20/60 | MA10>MA20>MA60 为 1,否则 0 | 均线多头排列族 | | 8 | 长周期均线多头排列 | `bull_arrange_2060120` | 20/60/120 | MA20>MA60>MA120 为 1,否则 0 | 均线多头排列族 | | 9 | 三重指数平滑 | `trix12` | 12 | 均线变缓程度,12 周期 | TRIX 三重指数平滑族(单参数档) | | 10 | 三重指数平滑 | `trix15` | 15 | 均线变缓程度,15 周期 | TRIX 三重指数平滑族(单参数档) | | 11 | 三重指数平滑 | `trix30` | 30 | 均线变缓程度,30 周期 | TRIX 三重指数平滑族(单参数档) | | 12 | 多空指数 | `bbi` | 3/6/12/24 | 3/6/12/24 日均线等权平均 | BBI / DMA / SAR / B3612 组合 | | 13 | 平均线差 | `dma` | 10/50/10 | 短长均线差再平滑 | BBI / DMA / SAR / B3612 组合 | | 14 | 抛物线转向指标 | `sar` | 0.02/0.2 | 抛物线止损转向点 | BBI / DMA / SAR / B3612 组合 | | 15 | 三减六日乖离 | `b36` | 3/6 | MA3 − MA6 | BBI / DMA / SAR / B3612 组合 | | 16 | 六减十二日乖离 | `b612` | 6/12 | MA6 − MA12 | BBI / DMA / SAR / B3612 组合 | | 17 | 乖离率 | `bias_10` | 10 | 当前价格与最近 n1 期平均价格的偏离程度 | 乖离率族(TA-Lib 算子) | | 18 | 乖离率 | `bias_250` | 250 | 当前价格与最近 n1 期平均价格的偏离程度 | 乖离率族(TA-Lib 算子) | | 19 | 三重指数平均线TRIX | `trix_5_3` | 5/3 | 收盘价三次指数平滑后的一日变化率 | TRIX 三重指数平滑族(双参数档,仅输出 TRIX) | | 20 | 三重指数平均线TRIX | `trix_7_4` | 7/4 | 收盘价三次指数平滑后的一日变化率 | TRIX 三重指数平滑族(双参数档,仅输出 TRIX) | | 21 | 三重指数平均线TRIX | `trix_20_12` | 20/12 | 收盘价三次指数平滑后的一日变化率 | TRIX 三重指数平滑族(双参数档,仅输出 TRIX) | | 22 | 三重指数平均线TRIX | `trix_60_20` | 60/20 | 收盘价三次指数平滑后的一日变化率 | TRIX 三重指数平滑族(双参数档,仅输出 TRIX) | | 23 | 三重指数平均线MATRIX | `matrix_5_3` | 5/3 | TRIX 的 n2 日移动平均 | MATRIX 均线族 | | 24 | 三重指数平均线MATRIX | `matrix_7_4` | 7/4 | TRIX 的 n2 日移动平均 | MATRIX 均线族 | | 25 | 三重指数平均线MATRIX | `matrix_12_9` | 12/9 | TRIX 的 n2 日移动平均 | MATRIX 均线族 | | 26 | 三重指数平均线MATRIX | `matrix_20_12` | 20/12 | TRIX 的 n2 日移动平均 | MATRIX 均线族 | | 27 | 三重指数平均线MATRIX | `matrix_60_20` | 60/20 | TRIX 的 n2 日移动平均 | MATRIX 均线族 | --- ## 3. 因子族公式与 DAI SQL ### 3.1 BIAS 乖离率族 **公式**:BIAS_N = (Close − MA_N(Close)) / MA_N(Close) × 100 **输出列(5)**:`bias_ma5`、`bias_ma12`、`bias_ma20`、`bias_ma60`、`bias_ma120` ```sql SELECT date, instrument, (close - m_avg(close, 5)) / NULLIF(m_avg(close, 5), 0) * 100 AS bias_ma5, (close - m_avg(close, 12)) / NULLIF(m_avg(close, 12), 0) * 100 AS bias_ma12, (close - m_avg(close, 20)) / NULLIF(m_avg(close, 20), 0) * 100 AS bias_ma20, (close - m_avg(close, 60)) / NULLIF(m_avg(close, 60), 0) * 100 AS bias_ma60, (close - m_avg(close, 120)) / NULLIF(m_avg(close, 120), 0) * 100 AS bias_ma120 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.2 均线多头排列族 **公式**:多头排列 = 1(短均线 > 中均线 > 长均线),否则 0 **输出列(3)**:`bull_arrange_51020`、`bull_arrange_102060`、`bull_arrange_2060120` ```sql SELECT date, instrument, if(m_avg(close, 5) > m_avg(close, 10) AND m_avg(close, 10) > m_avg(close, 20), 1, 0) AS bull_arrange_51020, if(m_avg(close, 10) > m_avg(close, 20) AND m_avg(close, 20) > m_avg(close, 60), 1, 0) AS bull_arrange_102060, if(m_avg(close, 20) > m_avg(close, 60) AND m_avg(close, 60) > m_avg(close, 120), 1, 0) AS bull_arrange_2060120 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.3 TRIX 三重指数平滑族(单参数档) **公式**:TR = EMA(EMA(EMA(Close, N), N), N);TRIX = (TR − 昨日TR) / 昨日TR × 100 **输出列(3)**:`trix12`、`trix15`、`trix30` ```sql SELECT date, instrument, m_ta_trix(close, 12) AS trix12, m_ta_trix(close, 15) AS trix15, m_ta_trix(close, 30) AS trix30 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.4 BBI / DMA / SAR / B3612 组合 **公式**:BBI = (MA3+MA6+MA12+MA24)/4;DMA = MA10(MA10 − MA50);SAR 为 TA-Lib 抛物线转向(0.02/0.2);B36 = MA3 − MA6;B612 = MA6 − MA12 **输出列(5)**:`bbi`、`dma`、`sar`、`b36`、`b612` ```sql SELECT date, instrument, (m_avg(close, 3) + m_avg(close, 6) + m_avg(close, 12) + m_avg(close, 24)) / 4 AS bbi, m_avg(m_avg(close, 10) - m_avg(close, 50), 10) AS dma, m_ta_sar(high, low) AS sar, m_avg(close, 3) - m_avg(close, 6) AS b36, m_avg(close, 6) - m_avg(close, 12) AS b612 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.5 乖离率族(TA-Lib 算子) **公式**:BIAS_N = m_ta_bias(close, N) **输出列(2)**:`bias_10`、`bias_250` ```sql SELECT date, instrument, m_ta_bias(close, 10) AS bias_10, m_ta_bias(close, 250) AS bias_250 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.6 TRIX 三重指数平滑族(双参数档,仅输出 TRIX) **公式**:TR = EMA(EMA(EMA(close, n1), n1), n1);TRIX = (TR − 昨日TR)/昨日TR×100(n2 仅用于 MATRIX 平滑) **输出列(4)**:`trix_5_3`、`trix_7_4`、`trix_20_12`、`trix_60_20` ```sql SELECT date, instrument, m_ta_trix(close, 5) AS trix_5_3, m_ta_trix(close, 7) AS trix_7_4, m_ta_trix(close, 20) AS trix_20_12, m_ta_trix(close, 60) AS trix_60_20 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` ### 3.7 MATRIX 均线族 **公式**:MATRIX = SMA(TRIX(n1), n2) **输出列(5)**:`matrix_5_3`、`matrix_7_4`、`matrix_12_9`、`matrix_20_12`、`matrix_60_20` ```sql SELECT date, instrument, m_ta_sma(m_ta_trix(close, 5), 3) AS matrix_5_3, m_ta_sma(m_ta_trix(close, 7), 4) AS matrix_7_4, m_ta_sma(m_ta_trix(close, 12), 9) AS matrix_12_9, m_ta_sma(m_ta_trix(close, 20), 12) AS matrix_20_12, m_ta_sma(m_ta_trix(close, 60), 20) AS matrix_60_20 FROM cn_stock_bar1d WHERE close IS NOT NULL ORDER BY date, instrument ``` --- ## 4. 数据加工说明 ### 4.1 加工链路 ``` cn_stock_bar1d(后复权,WHERE close IS NOT NULL) → 7 组因子族 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` | **1400 个自然日**(≈ 935 个交易日) | 本表最长窗口 / 预热需求约 250 个交易日 | 多读一段历史不改变任何输出值(窗口算子只向前看),只是把区间首日的"本可避免的缺失"消掉。 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 本表实现要点 - TRIX 为三重 EMA 嵌套(等效窗口约 3×n1),`trix_60_20` 的等效窗口约 180 个交易日,故回溯冗余取 1400 个自然日(约 930 个交易日)。 - `matrix_*` 在上游工程代码中与 `trix_*` 别名冲突(同名覆盖),本表按因子文档统一命名为 `matrix_*`。 - `bias_ma5/20/60/120` 与 `bias_10/250` 分属两族写法:前者用 `m_avg` 手写乖离率并 ×100,后者用 TA-Lib 移植算子 `m_ta_bias`;同参数档位已在因子文档中去重,本表不重复收录。 - `b3612` 为一因子两列输出(`b36`、`b612`)。 --- ## 5. 覆盖度实测 实测区间 **2026-09-07 ~ 2026-09-17**(9 个交易日、50052 行,已按 `cn_stock_instruments` 对齐全市场标的): | 指标 | 数值 | |---|---| | 因子列数 | 27 | | 最低覆盖度 | **96.90%**(bias_250) | | 中位覆盖度 | 99.44% | | 最高覆盖度 | 99.79% | | 覆盖度 < 85% 的列数 | 0 | | `tester.py` 关键测试点 | ✅ 通过 | 覆盖度最低的三列:`bias_250`(96.9%)、`matrix_60_20`(97.4%)、`trix_60_20`(97.6%)。缺失主要来自**上市不足窗口长度的新股**与**当日停牌**,逐列明细见 `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. **无未来函数**:全部因子只用当期与历史滚动数据;回测时注意前向收益口径(建议用次日开盘价), 收盘价口径会系统性高估短周期反转类因子的收益。

用例
表结构
字段 字段类型 字段描述
instrument string 证券代码
bull_arrange_2060120 double 长周期均线多头排列(参数 20/60/120)。MA20>MA60>MA120 为 1,否则 0。计算式:if(m_avg(close, 20) > m_avg(close, 60) AND m_avg(close, 60) > m_avg(close, 120), 1, 0)
bull_arrange_102060 double 中周期均线多头排列(参数 10/20/60)。MA10>MA20>MA60 为 1,否则 0。计算式:if(m_avg(close, 10) > m_avg(close, 20) AND m_avg(close, 20) > m_avg(close, 60), 1, 0)
bull_arrange_51020 double 短周期均线多头排列(参数 5/10/20)。MA5>MA10>MA20 为 1,否则 0。计算式:if(m_avg(close, 5) > m_avg(close, 10) AND m_avg(close, 10) > m_avg(close, 20), 1, 0)
__PARTITION__ int64 -
matrix_60_20 double 三重指数平均线MATRIX(参数 60/20)。TRIX 的 n2 日移动平均。计算式:m_ta_sma(m_ta_trix(close, 60), 20)
matrix_20_12 double 三重指数平均线MATRIX(参数 20/12)。TRIX 的 n2 日移动平均。计算式:m_ta_sma(m_ta_trix(close, 20), 12)
matrix_12_9 double 三重指数平均线MATRIX(参数 12/9)。TRIX 的 n2 日移动平均。计算式:m_ta_sma(m_ta_trix(close, 12), 9)
bias_ma5 double 5 日乖离率(参数 5)。收盘价偏离 5 日均线的幅度。计算式:(close - m_avg(close, 5)) / NULLIF(m_avg(close, 5), 0) * 100
trix_5_3 double 三重指数平均线TRIX(参数 5/3)。收盘价三次指数平滑后的一日变化率。计算式:m_ta_trix(close, 5)
trix_7_4 double 三重指数平均线TRIX(参数 7/4)。收盘价三次指数平滑后的一日变化率。计算式:m_ta_trix(close, 7)
bias_ma12 double 12 日乖离率(参数 12)。收盘价偏离 12 日均线的幅度。计算式:(close - m_avg(close, 12)) / NULLIF(m_avg(close, 12), 0) * 100
bias_ma20 double 20 日乖离率(参数 20)。收盘价偏离 20 日均线的幅度。计算式:(close - m_avg(close, 20)) / NULLIF(m_avg(close, 20), 0) * 100
bias_ma60 double 60 日乖离率(参数 60)。收盘价偏离 60 日均线的幅度。计算式:(close - m_avg(close, 60)) / NULLIF(m_avg(close, 60), 0) * 100
bias_ma120 double 120 日乖离率(参数 120)。收盘价偏离 120 日均线的幅度。计算式:(close - m_avg(close, 120)) / NULLIF(m_avg(close, 120), 0) * 100
b36 double 三减六日乖离(参数 3/6)。MA3 − MA6。计算式:m_avg(close, 3) - m_avg(close, 6)
bbi double 多空指数(参数 3/6/12/24)。3/6/12/24 日均线等权平均。计算式:(m_avg(close, 3) + m_avg(close, 6) + m_avg(close, 12) + m_avg(close, 24)) / 4
dma double 平均线差(参数 10/50/10)。短长均线差再平滑。计算式:m_avg(m_avg(close, 10) - m_avg(close, 50), 10)
sar double 抛物线转向指标(参数 0.02/0.2)。抛物线止损转向点。计算式:m_ta_sar(high, low)
b612 double 六减十二日乖离(参数 6/12)。MA6 − MA12。计算式:m_avg(close, 6) - m_avg(close, 12)
trix12 double 三重指数平滑(参数 12)。均线变缓程度,12 周期。计算式:m_ta_trix(close, 12)
trix15 double 三重指数平滑(参数 15)。均线变缓程度,15 周期。计算式:m_ta_trix(close, 15)
trix30 double 三重指数平滑(参数 30)。均线变缓程度,30 周期。计算式:m_ta_trix(close, 30)
bias_10 double 乖离率(参数 10)。当前价格与最近 n1 期平均价格的偏离程度。计算式:m_ta_bias(close, 10)
bias_250 double 乖离率(参数 250)。当前价格与最近 n1 期平均价格的偏离程度。计算式:m_ta_bias(close, 250)
trix_60_20 double 三重指数平均线TRIX(参数 60/20)。收盘价三次指数平滑后的一日变化率。计算式:m_ta_trix(close, 60)
trix_20_12 double 三重指数平均线TRIX(参数 20/12)。收盘价三次指数平滑后的一日变化率。计算式:m_ta_trix(close, 20)
matrix_7_4 double 三重指数平均线MATRIX(参数 7/4)。TRIX 的 n2 日移动平均。计算式:m_ta_sma(m_ta_trix(close, 7), 4)
matrix_5_3 double 三重指数平均线MATRIX(参数 5/3)。TRIX 的 n2 日移动平均。计算式:m_ta_sma(m_ta_trix(close, 5), 3)
date timestamp[ns] 日期

表名:cn_stock_factors_ta_trend

起始时间:

最近更新时间: