---
title: A 股技术指标正式来源对齐
doc_type: feature-implementation
domain: market
keywords:
  - A股技术指标
  - stk_factor_pro
  - 自定义EMA
  - 个股详情
  - 行情页
summary: 固定桌面端 A 股技术指标的正式来源、落点和补齐口径，对齐原后端的 factor_pro + 自定义 EMA13/34/120 设计。
when_to_read:
  - 要改个股详情/行情页技术指标
  - 要改 Tushare stk_factor_pro 落库与消费
  - 要排查 MA、MACD、KDJ、EMA 指标缺失
read_next:
  - ./ema-tracker-materialization.md
  - ../business/data-fetch-tasks.md
  - ../overview/architecture.md
---
# A 股技术指标正式来源对齐

这篇文档说明桌面端 A 股技术指标现在以什么为正式真值、哪些数据落到哪里，以及为什么最近交易日不再允许被本地短窗口重算冲成空壳。

如果你关心的是“个股详情为什么没有 MA/MACD/KDJ”，或者“`stk_factor_pro` 到底是正式单日快照还是正式指标源”，先看这里。读完后如果要看自定义 EMA 追踪任务，再看 `ema-tracker-materialization.md`。

## 现在的正式口径

A 股技术指标正式改成两段来源：

1. `api_tushare_stk_factor_pro`
   保存 Tushare `stk_factor_pro` 的正式消费字段，包含前复权 MA / EMA / MACD / KDJ / BOLL / RSI / WR / DMI / CCI / BIAS / PSY / ROC / CR 等原生指标值。
2. `stock_indicator_ema`
   继续承接本地自定义 `EMA13 / EMA34 / EMA120`，并在统一指标读模型里覆盖同名字段。

一句话：

`A 股正式技术指标 = factor_pro 原生指标 + 本地自定义 EMA13/34/120 覆盖`

## 表与职责

| 表 | 职责 | 不负责 |
| --- | --- | --- |
| `api_tushare_stk_factor_pro` | 保存 Tushare `stk_factor_pro` 原始指标字段与基础日线字段 | 不负责写业务派生 EMA13/34/120 |
| `stock_indicator_ema` | 保存本地自定义 `EMA13/34/120` | 不负责保存 MA/MACD/KDJ/BOLL 等原生 Tushare 指标 |
| `stock_tech_indicator_daily` | 非 A 股技术指标与本地重算排障载体 | 不参与 A 股详情 / 行情正式指标读取 |

## 查询链

```mermaid
flowchart LR
    A["api_tushare_stk_factor_pro\nA股 factor_pro 原生指标"] --> C["get_tech_indicator_daily\n统一指标读模型"]
    D["stock_indicator_ema\n自定义 EMA13/34/120"] --> C
    B["stock_tech_indicator_daily\n非A股 / 排障重算"] -.-> C
    C --> E["StockDetailView / StockQuoteView"]
```

查询规则：

- A 股详情 / 行情查询只读取 `api_tushare_stk_factor_pro` 的原生指标行。
- `stock_indicator_ema` 最后叠加，覆盖 `ema13 / ema34 / ema120`，必要时也可补 `ema5 / ema10 / ema20 / ema30 / ema60`。
- 如果 `factor_pro` 某些日期或某些字段缺失，页面直接暴露缺口，不再回退 `stock_tech_indicator_daily` 掩盖上游问题。

## 同步与补齐口径

```mermaid
flowchart LR
    A["tushare.stk_factor_pro.sync"] --> B["api_tushare_stk_factor_pro\n基础日线 + factor_pro 原生指标"]
    B --> C["ensure_stock_bundle / indicator.calc\n补本地重算指标与自定义 EMA"]
    C --> D["stock_tech_indicator_daily\n仅非A股 / 排障使用"]
    C --> E["stock_indicator_ema\n自定义 EMA13/34/120"]
    B --> F["A股个股详情 / 行情页指标读取"]
    E --> F
```

正式边界：

- `tushare.stk_factor_pro.sync` 不再只是“日线快照同步”，同时承接 A 股正式技术指标原生字段。
- `indicator.calc` / `ensure_stock_bundle` 仍然可以本地重算，但 A 股详情 / 行情正式读取不再消费 `stock_tech_indicator_daily`。
- `indicator.calc` 的本地重算必须先带 warmup 窗口，再只写目标区间，禁止用 7 天短窗口直接覆盖最近交易日。
- A 股页面如果出现 MA / MACD / KDJ / RSI 等缺口，应优先排查 `api_tushare_stk_factor_pro` 上游字段是否已落库，而不是在查询层做回退兼容。

## 为什么这么做

之前桌面端有两个问题：

1. `stk_factor_pro` 只保留了基础日线字段，没有把原生 MA/MACD/KDJ/BOLL 等指标一起落库。
2. `indicator.calc` 会拿最近 7 天窗口重算本地指标，导致最近交易日被写成只有 `close + trade_date` 的空壳 payload。

这次对齐后：

- 详情页/行情页的 A 股技术指标回到原后端口径。
- 自定义 `EMA13/34/120` 继续保持桌面端本地计算优势。
- 短窗口重算不再把最近交易日的 MA/MACD/KDJ 等正式结果冲掉。

## 验收要点

- `api_tushare_stk_factor_pro` 新同步行应携带 MA/MACD/KDJ/BOLL/RSI/WR/DMI/CCI/BIAS/PSY/ROC/CR 等前复权指标列。
- `get_tech_indicator_daily` 查询 A 股时，只返回 `tushare:stk_factor_pro + stock_indicator_ema` 的正式组合结果。
- `ema13 / ema34 / ema120` 必须来自 `stock_indicator_ema` 的本地自定义结果，而不是直接回 Tushare 原生字段。
- 如果 `factor_pro` 某交易日缺少 `MACD / RSI / WR` 等字段，详情页 / 行情页应直接表现为指标缺口，不允许回退本地 `stock_tech_indicator_daily` 把缺口补平。
