feat(chart): M9-5 复权口径坐标换算落地(qfq 基准=最新因子 + marker 贴图换算)

- ChartService qfq 基准改为该股最新因子(截至今天)归一:历史区间随最新除权
  平移正确(v3 §20.5 Chart Display vs Execution basis 分离)
- 显示口径与执行 basis 不一致时,成交/信号 marker 价格按当日因子换算到 K 线坐标系
  (fill 早段价格在 qfq 下折算验证 100→50)
- tests:qfq 回测 marker 折算 + selection 标记保留;全量 pytest 通过
This commit is contained in:
Simon
2026-09-09 07:15:41 +08:00
parent e1a0a8aa38
commit 5bde8f9f5f
2 changed files with 72 additions and 2 deletions
@@ -43,10 +43,14 @@ def _factor_multipliers(
end: date,
mode: str,
) -> dict[date, float]:
"""返回 {trade_date: 显示折算系数};mode=none → 空。qfq: f/f_latest;hfq: f。"""
"""返回 {trade_date: 显示折算系数};mode=none → 空。
基准(v3 §20.5):qfq 以**该股最新因子**(截至今天,而非图表区间末)归一,
保证历史区间随最新除权平移正确;hfq 直接用累积因子。
"""
if mode == "none":
return {}
factors: list[AdjustFactor] = adj_repo.get_range(symbol, date(1990, 1, 1), end)
factors: list[AdjustFactor] = adj_repo.get_range(symbol, date(1990, 1, 1), date.today())
if not factors:
return {}
by_day = {f.trade_date: float(f.factor) for f in factors}