跳转至

← 返回接口目录

7709-本地复权系数

作用

根据 0x000f 返回的标签 1 权息事件,生成每个除权事件日期对应的前复权和后复权仿射系数。将这些系数按日期应用到本地保存的不复权 OHLC,即可得到复权价格。

项目 内容
主要调用 client.corporate.adjustment_factors(code, anchor_date=None, *, start_date=None, batch_size=75)
唯一数据源 0x000f
单只返回 AdjustmentFactorResponse
批量返回 AdjustmentFactorBatch
返回粒度 每个除权事件日期一行,不是每个交易日一行

直接获取服务端 K 线时,使用 client.bars.get()adjust="none""qfq""hfq";本接口用于本地计算、公式审计和结果核验。

为什么叫“系数”

现金分红和配股会产生加法项,复权不是简单的“原价乘以一个因子”,而是完整的仿射变换:

adjusted = round(raw * scale + offset, 2)

因此文档称为“本地复权系数”,每种复权方式都同时返回 scaleoffset。Python 方法名 adjustment_factors() 沿用常见的 adjustment factor 叫法,但返回值不能只取 scale

获取系数

from eltdx import TdxClient

with TdxClient(timeout=3) as client:
    factors = client.corporate.adjustment_factors("sz000858")
    batch = client.corporate.adjustment_factors(["sz000001", "sh600000", "bj920000"])

接口会:

  1. 保留有日期的标签 1 记录;
  2. 按事件日期排序,同一天多条记录保持服务端原始顺序;
  3. 将同一日期的多条事件复合成一行;
  4. 计算该日期对应的前复权和后复权 scale + offset

参数

参数 含义
code 一个证券代码,或证券代码列表
anchor_date 前复权事件截止日期;默认包含全部标签 1 事件,按自然日期比较
start_date 可选事件起点;早于此日期的记录不参与计算,可传上市首个交易日排除预发行记录
batch_size 列表输入时每个权息查询批次的代码数,默认 75,范围 1..200

start_dateanchor_date 只用于筛选 0x000f 已返回的权息事件,接口不会额外请求 K 线来推断这两个日期。两者都不传时,使用全部有日期的标签 1 事件。验证或应用一段完整日 K 时,可以从已有 K 线中传入首、末交易日,既排除上市前记录,也避免把晚于该 K 线区间的事件计入前复权:

start_date = raw.bars[0].time.date()
anchor_date = raw.bars[-1].time.date()
factors = client.corporate.adjustment_factors(
    code,
    anchor_date=anchor_date,
    start_date=start_date,
)

传入代码列表时,接口调用批量 capital_changes():默认每批 75 只,可通过 batch_size 调整为 1..200。超量批次按连接池 Slot 数并发请求,然后为每个返回块在本地计算系数。它不会为列表中的每只股票分别发送请求。批量结果的 responses 按股票块顺序保存 AdjustmentFactorResponse

单次事件公式

标签 1 的字段含义:

D = c1_value  每十股现金分红
P = c2_value  配股价格
S = c3_value  每十股送转数量
R = c4_value  每十股配股数量

m = (10 + S + R) / 10
c = (D - R * P) / 10

单次前复权:

qfq_scale  = 1 / m
qfq_offset = -c / m
qfq_price  = raw * qfq_scale + qfq_offset

单次后复权:

hfq_scale  = m
hfq_offset = c
hfq_price  = raw * hfq_scale + hfq_offset

真实配股事件 000858 / 20010219 的四字段为 0, 25, 0, 2,因此:

m = 1.2
c = -5

前复权 = raw / 1.2 + 5 / 1.2
后复权 = raw * 1.2 - 5

系数行的日期含义

items 按事件日期升序排列,每个事件日期只有一行。

模式 为某根 K 线选哪一行 没有匹配行
前复权 第一条满足 bar_date < factor.date 的行 使用 scale=1, offset=0
后复权 最后一条满足 factor.date <= bar_date 的行 使用 scale=1, offset=0

前复权行已经按日期从早到晚复合该日期至 anchor_date 的事件;后复权行已经按日期从晚到早复合 start_date 至该日期的事件。相同日期始终保持服务端顺序,计算过程中不舍入。

应用到 K 线

from datetime import date


def coefficients_for_bar(factors, bar_date: date, mode: str) -> tuple[float, float]:
    if mode == "qfq":
        row = next((item for item in factors.items if bar_date < item.date), None)
        return (1.0, 0.0) if row is None else (row.qfq_scale, row.qfq_offset)

    if mode == "hfq":
        row = next((item for item in reversed(factors.items) if item.date <= bar_date), None)
        return (1.0, 0.0) if row is None else (row.hfq_scale, row.hfq_offset)

    raise ValueError("mode must be qfq or hfq")


def adjusted_price(raw: float, scale: float, offset: float) -> float:
    return round(raw * scale + offset, 2)

对每根不复权 K 线的 open/high/low/close 使用同一组系数,完成全部事件复合后再保留两位小数。

独立验证 0x052d

本地系数只来自 0x000f,因此可以独立验证 0x052d 的服务端复权 K 线:

with TdxClient(timeout=3) as client:
    raw = client.bars.get(code, period="day", adjust="none", all_pages=True)
    server_qfq = client.bars.get(code, period="day", adjust="qfq", all_pages=True)
    server_hfq = client.bars.get(code, period="day", adjust="hfq", all_pages=True)

    factors = client.corporate.adjustment_factors(
        code,
        anchor_date=raw.bars[-1].time.date(),
        start_date=raw.bars[0].time.date(),
    )

验证程序按日期对齐三组 K 线,对不复权 OHLC 应用本地系数,再分别比较 server_qfqserver_hfq0x052d 只在验证程序中提供输入价格和期望结果,不参与系数计算。

返回字段

AdjustmentFactorResponse 含义
exchange / market_id / code / full_code 市场和代码
anchor_date 用户指定的前复权事件截止自然日期;未指定时为 None
start_date 用户指定的事件起点;未指定时为 None
items / count 事件日期系数及数量
AdjustmentFactor 含义
date / time 除权事件日期及其 15:00 时间
qfq_scale / qfq_offset 适用于该日期之前区间的累计前复权系数
hfq_scale / hfq_offset 适用于该日期及之后区间的累计后复权系数

返回样本

真实事件公式节选 · 000858 / 20010219

采样标的sz000858
真实权息事件2001-02-19:0, 25, 0, 2

真实采样事件的单次变换节选;完整接口返回还会按所选日期范围复合该股票的其他标签 1 事件。

{
  "exchange": "sz",
  "market_id": 0,
  "code": "000858",
  "anchor_date": "2001-02-19",
  "start_date": "2001-02-19",
  "items": [
    {
      "date": "2001-02-19",
      "qfq_scale": 0.8333333333333334,
      "qfq_offset": 4.166666666666667,
      "hfq_scale": 1.2,
      "hfq_offset": -5.0
    }
  ]
}