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.
超买超卖类技术指标因子
33 个字段 · 主键 date + instrument
以 RSI、KDJ、威廉指标(WR)为主的超买超卖族。RSI 度量区间内涨跌力量对比(0~100);KDJ 由未成熟随机值 RSV 经两次平滑得到 K、D,再派生 J = 3K − 2D,对拐点最敏感;WR 反向刻画收盘价在高低区间中的位置(值越大越接近区间低位)。
- 因子数量:31 个因子 / 31 个数据列
- 主键:
date+instrument(按cn_stock_instruments对齐全市场标的)- 数据起始:2010-01-01,日频增量更新
- 复权口径:后复权(
cn_stock_bar1d全表统一)
| 上游表 | 用途 | 本表用到的字段 |
|---|---|---|
cn_stock_bar1d | 后复权日行情,全部因子的计算输入 | date, instrument, high, low, close |
cn_stock_instruments | 全市场标的清单,决定本表每日的 date / instrument 组合 | date, instrument |
cn_stock_bar1d为分区表,SQL 的 date 过滤由dai.query(filters={"date": [...]})下推完成。
| # | 因子中文名 | 字段名 | 参数 | 因子逻辑 | 所属因子族 |
|---|---|---|---|---|---|
| 1 | 相对强弱指标 | rsi6 | 6 | 短周期 RSI,灵敏超买超卖 | RSI 相对强弱族 |
| 2 | 相对强弱指标 | rsi14 | 14 | 标准 RSI | RSI 相对强弱族 |
| 3 | 相对强弱指标 | rsi24 | 24 | 长周期 RSI,趋势性更强 | RSI 相对强弱族 |
| 4 | KDJ J 值(快) | kdj_j_9 | 9/3/3 | 快 KDJ 超买超卖与拐点 | KDJ J 值族(快 / 慢) |
| 5 | KDJ J 值(慢) | kdj_j_21 | 21/3/3 | 慢 KDJ,信号更平滑 | KDJ J 值族(快 / 慢) |
| 6 | 威廉指标 | wr9 | 9 | 收盘价在 9 日区间内位置(同花顺 LWR) | 威廉指标族 |
| 7 | 威廉指标 | wr10 | 10 | 收盘价在 10 日区间内位置,反向指标 | 威廉指标族 |
| 8 | 威廉指标 | wr14 | 14 | 收盘价在 14 日区间内位置,反向指标 | 威廉指标族 |
| 9 | KDJ未成熟随机值 | kdj_rsv_9_3_3 | 9/3/3 | (收盘价 − n1 日内最低价)/(n1 日内最高价 − n1 日内最低价),仅 n1 生效 | KDJ 未成熟随机值族 |
| 10 | KDJ未成熟随机值 | kdj_rsv_14_3_3 | 14/3/3 | (收盘价 − n1 日内最低价)/(n1 日内最高价 − n1 日内最低价),仅 n1 生效 | KDJ 未成熟随机值族 |
| 11 | KDJ未成熟随机值 | kdj_rsv_5_3_3 | 5/3/3 | (收盘价 − n1 日内最低价)/(n1 日内最高价 − n1 日内最低价),仅 n1 生效 | KDJ 未成熟随机值族 |
| 12 | KDJ未成熟随机值 | kdj_rsv_10_3_6 | 10/3/6 | (收盘价 − n1 日内最低价)/(n1 日内最高价 − n1 日内最低价),仅 n1 生效 | KDJ 未成熟随机值族 |
| 13 | KDJ未成熟随机值 | kdj_rsv_20_5_5 | 20/5/5 | (收盘价 − n1 日内最低价)/(n1 日内最高价 − n1 日内最低价),仅 n1 生效 | KDJ 未成熟随机值族 |
| 14 | KDJ的K值 | kdj_k_9_3_3 | 9/3/3 | RSV 的 n2 日移动平均 | KDJ K 值族 |
| 15 | KDJ的K值 | kdj_k_14_3_3 | 14/3/3 | RSV 的 n2 日移动平均 | KDJ K 值族 |
| 16 | KDJ的K值 | kdj_k_5_3_3 | 5/3/3 | RSV 的 n2 日移动平均 | KDJ K 值族 |
| 17 | KDJ的K值 | kdj_k_10_3_6 | 10/3/6 | RSV 的 n2 日移动平均 | KDJ K 值族 |
| 18 | KDJ的K值 | kdj_k_20_5_5 | 20/5/5 | RSV 的 n2 日移动平均 | KDJ K 值族 |
| 19 | KDJ的D值 | kdj_d_9_3_3 | 9/3/3 | K 值的 n3 日移动平均 | KDJ D 值族 |
| 20 | KDJ的D值 | kdj_d_14_3_3 | 14/3/3 | K 值的 n3 日移动平均 | KDJ D 值族 |
| 21 | KDJ的D值 | kdj_d_5_3_3 | 5/3/3 | K 值的 n3 日移动平均 | KDJ D 值族 |
| 22 | KDJ的D值 | kdj_d_10_3_6 | 10/3/6 | K 值的 n3 日移动平均 | KDJ D 值族 |
| 23 | KDJ的D值 | kdj_d_20_5_5 | 20/5/5 | K 值的 n3 日移动平均 | KDJ D 值族 |
| 24 | KDJ的J值 | kdj_j_14_3_3 | 14/3/3 | 3K − 2D 派生值 | KDJ J 值族(多参数档) |
| 25 | KDJ的J值 | kdj_j_5_3_3 | 5/3/3 | 3K − 2D 派生值 | KDJ J 值族(多参数档) |
| 26 | KDJ的J值 | kdj_j_10_3_6 | 10/3/6 | 3K − 2D 派生值 | KDJ J 值族(多参数档) |
| 27 | KDJ的J值 | kdj_j_20_5_5 | 20/5/5 | 3K − 2D 派生值 | KDJ J 值族(多参数档) |
| 28 | 相对强弱指数 | rsi_12 | 12 | n1 周期内涨跌强弱,0~100 | RSI 相对强弱指数族 |
| 29 | 相对强弱指数 | rsi_48 | 48 | n1 周期内涨跌强弱,0~100 | RSI 相对强弱指数族 |
| 30 | 相对强弱指数 | rsi_60 | 60 | n1 周期内涨跌强弱,0~100 | RSI 相对强弱指数族 |
| 31 | 相对强弱指数 | rsi_120 | 120 | n1 周期内涨跌强弱,0~100 | RSI 相对强弱指数族 |
公式:RSI_N = 100 × SMA_N(MAX(Close−前Close, 0)) / SMA_N(|Close−前Close|)
输出列(3):rsi6、rsi14、rsi24
SELECT date, instrument, m_ta_rsi(close, 6) AS rsi6, m_ta_rsi(close, 14) AS rsi14, m_ta_rsi(close, 24) AS rsi24FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:RSV = (Close − MIN_N(Low))/(MAX_N(High) − MIN_N(Low))×100;K = SMA(RSV, M1);D = SMA(K, M2);J = 3K − 2D
输出列(2):kdj_j_9、kdj_j_21
SELECT date, instrument, m_ta_kdj_j(high, low, close, fastk_period:=9, slowk_period:=3, slowd_period:=3) AS kdj_j_9, m_ta_kdj_j(high, low, close, fastk_period:=21, slowk_period:=3, slowd_period:=3) AS kdj_j_21FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:WR_N = (MAX_N(High) − Close) / (MAX_N(High) − MIN_N(Low)) × 100
输出列(3):wr9、wr10、wr14
SELECT date, instrument, (m_max(high, 9) - close) / NULLIF(m_max(high, 9) - m_min(low, 9), 0) * 100 AS wr9, (m_max(high, 10) - close) / NULLIF(m_max(high, 10) - m_min(low, 10), 0) * 100 AS wr10, (m_max(high, 14) - close) / NULLIF(m_max(high, 14) - m_min(low, 14), 0) * 100 AS wr14FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:RSV = (close − MIN(low, n1)) / (MAX(high, n1) − MIN(low, n1))
输出列(5):kdj_rsv_9_3_3、kdj_rsv_14_3_3、kdj_rsv_5_3_3、kdj_rsv_10_3_6、kdj_rsv_20_5_5
SELECT date, instrument, (close - m_min(low, 9)) / NULLIF(m_max(high, 9) - m_min(low, 9), 0) AS kdj_rsv_9_3_3, (close - m_min(low, 14)) / NULLIF(m_max(high, 14) - m_min(low, 14), 0) AS kdj_rsv_14_3_3, (close - m_min(low, 5)) / NULLIF(m_max(high, 5) - m_min(low, 5), 0) AS kdj_rsv_5_3_3, (close - m_min(low, 10)) / NULLIF(m_max(high, 10) - m_min(low, 10), 0) AS kdj_rsv_10_3_6, (close - m_min(low, 20)) / NULLIF(m_max(high, 20) - m_min(low, 20), 0) AS kdj_rsv_20_5_5FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:K = SMA(RSV, n2)
输出列(5):kdj_k_9_3_3、kdj_k_14_3_3、kdj_k_5_3_3、kdj_k_10_3_6、kdj_k_20_5_5
SELECT date, instrument, m_ta_kdj_k(high, low, close, fastk_period:=9, slowk_period:=3, slowd_period:=3) AS kdj_k_9_3_3, m_ta_kdj_k(high, low, close, fastk_period:=14, slowk_period:=3, slowd_period:=3) AS kdj_k_14_3_3, m_ta_kdj_k(high, low, close, fastk_period:=5, slowk_period:=3, slowd_period:=3) AS kdj_k_5_3_3, m_ta_kdj_k(high, low, close, fastk_period:=10, slowk_period:=3, slowd_period:=6) AS kdj_k_10_3_6, m_ta_kdj_k(high, low, close, fastk_period:=20, slowk_period:=5, slowd_period:=5) AS kdj_k_20_5_5FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:D = SMA(K, n3)
输出列(5):kdj_d_9_3_3、kdj_d_14_3_3、kdj_d_5_3_3、kdj_d_10_3_6、kdj_d_20_5_5
SELECT date, instrument, m_ta_kdj_d(high, low, close, fastk_period:=9, slowk_period:=3, slowd_period:=3) AS kdj_d_9_3_3, m_ta_kdj_d(high, low, close, fastk_period:=14, slowk_period:=3, slowd_period:=3) AS kdj_d_14_3_3, m_ta_kdj_d(high, low, close, fastk_period:=5, slowk_period:=3, slowd_period:=3) AS kdj_d_5_3_3, m_ta_kdj_d(high, low, close, fastk_period:=10, slowk_period:=3, slowd_period:=6) AS kdj_d_10_3_6, m_ta_kdj_d(high, low, close, fastk_period:=20, slowk_period:=5, slowd_period:=5) AS kdj_d_20_5_5FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:J = 3K − 2D
输出列(4):kdj_j_14_3_3、kdj_j_5_3_3、kdj_j_10_3_6、kdj_j_20_5_5
SELECT date, instrument, m_ta_kdj_j(high, low, close, fastk_period:=14, slowk_period:=3, slowd_period:=3) AS kdj_j_14_3_3, m_ta_kdj_j(high, low, close, fastk_period:=5, slowk_period:=3, slowd_period:=3) AS kdj_j_5_3_3, m_ta_kdj_j(high, low, close, fastk_period:=10, slowk_period:=3, slowd_period:=6) AS kdj_j_10_3_6, m_ta_kdj_j(high, low, close, fastk_period:=20, slowk_period:=5, slowd_period:=5) AS kdj_j_20_5_5FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrument公式:RSI_N = m_ta_rsi(close, N)
输出列(4):rsi_12、rsi_48、rsi_60、rsi_120
SELECT date, instrument, m_ta_rsi(close, 12) AS rsi_12, m_ta_rsi(close, 48) AS rsi_48, m_ta_rsi(close, 60) AS rsi_60, m_ta_rsi(close, 120) AS rsi_120FROM cn_stock_bar1dWHERE close IS NOT NULLORDER BY date, instrumentcn_stock_bar1d(后复权,WHERE close IS NOT NULL) → 8 组因子族 SQL 并行执行(joblib loky, n_jobs=8) → 按 cn_stock_instruments 左连接对齐全市场标的 → schema 归一化(列序 / 类型 / 缺失值) → dai_write 按 date 的年份分区落库create(),自 2010-01-01 起按 2 年一段滚动执行,每段结束后 gc.collect() 释放内存。build(),默认覆盖最近 5 个自然日;落库前跑 tester.py,落库后更新前端文档。窗口算子只在查询下推后的行集上计算,所以每次计算都会向前多取一段行情:
| 参数 | 取值 | 说明 |
|---|---|---|
lookback_days | 900 个自然日(≈ 601 个交易日) | 本表最长窗口 / 预热需求约 120 个交易日 |
多读一段历史不改变任何输出值(窗口算子只向前看),只是把区间首日的"本可避免的缺失"消掉。 EMA / RSI / ATR / MACD / TRIX 属于 IIR 递推算子,理论上预热期无限长,因此这些表的冗余按 约 5 倍最长周期取值,而非刚好等于窗口长度。
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% |
本表不含累计型因子,全部因子都是固定长度的滚动窗口计算,因此只受 lookback_days 影响。
落库前以 cn_stock_instruments 为基准左连接,因此每个交易日都是全市场标的的完整行,
停牌股与上市不足窗口长度的新股在对应因子列上为 NULL。入库校验要求单因子整体覆盖度 ≥ 85%
(tester.py 关键测试点),单日覆盖度 ≥ 80%(非关键,仅告警)。
m_ta_kdj_*(high, low, close, fastk_period:=, slowk_period:=, slowd_period:=),参数顺序与部分上游因子表的 (close, high, low) 写法不同,且周期必须用命名参数;本表按 DAI 签名实现。kdj_rsv_* 输出 0kdj_k/d/j_* 的 0kdj_rsv_* 只有 n1 参与计算,n2/n3 仅用于与同族 K/D/J 的命名对齐。rsi_120 的预热较长,回溯冗余取 900 个自然日(约 600 个交易日)。kdj_j_9(9/3/3)与 kdj_j_9_3_3 在因子文档中已去重,本表只保留 kdj_j_9、kdj_j_21 两列作为“KDJ J 值族”,另按 (14,3,3)/(5,3,3)/(10,3,6)/(20,5,5) 四档收录 kdj_j_*_*_*。实测区间 2026-09-07 ~ 2026-09-17(9 个交易日、50052 行,已按 cn_stock_instruments 对齐全市场标的):
| 指标 | 数值 |
|---|---|
| 因子列数 | 31 |
| 最低覆盖度 | 98.18%(rsi_120) |
| 中位覆盖度 | 99.54% |
| 最高覆盖度 | 99.72% |
| 覆盖度 < 85% 的列数 | 0 |
tester.py 关键测试点 | ✅ 通过 |
覆盖度最低的三列:rsi_120(98.2%)、rsi_60(99.0%)、rsi_48(99.1%)。缺失主要来自上市不足窗口长度的新股与当日停牌,逐列明细见 testdata/coverage_report.md,数据示例见 testdata/sample_data.csv。
{{sample_data}}
c_zscore(因子, group=date) 或 c_rank(因子, group=date) 处理,或改用同族的比值型因子。NULLIF 保护,但小分母仍会放大尾部,建议按日做分位数截断。SELECT date, instrument, rsi6, rsi14, rsi24, kdj_j_9, kdj_j_21 FROM cn_stock_factors_ta_overbought WHERE date >= '2026-10-06' ORDER BY date LIMIT 100
SELECT date, instrument, rsi6, rsi14, rsi24, kdj_j_9, kdj_j_21 FROM cn_stock_factors_ta_overbought WHERE date >= '2026-10-06' ORDER BY date LIMIT 100