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";本接口用于本地计算、公式审计和结果核验。
为什么叫“系数”¶
现金分红和配股会产生加法项,复权不是简单的“原价乘以一个因子”,而是完整的仿射变换:
因此文档称为“本地复权系数”,每种复权方式都同时返回 scale 和 offset。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记录; - 按事件日期排序,同一天多条记录保持服务端原始顺序;
- 将同一日期的多条事件复合成一行;
- 计算该日期对应的前复权和后复权
scale + offset。
参数¶
| 参数 | 含义 |
|---|---|
code |
一个证券代码,或证券代码列表 |
anchor_date |
前复权事件截止日期;默认包含全部标签 1 事件,按自然日期比较 |
start_date |
可选事件起点;早于此日期的记录不参与计算,可传上市首个交易日排除预发行记录 |
batch_size |
列表输入时每个权息查询批次的代码数,默认 75,范围 1..200 |
start_date 和 anchor_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
单次前复权:
单次后复权:
真实配股事件 000858 / 20010219 的四字段为 0, 25, 0, 2,因此:
系数行的日期含义¶
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_qfq 和 server_hfq。0x052d 只在验证程序中提供输入价格和期望结果,不参与系数计算。
返回字段¶
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
真实采样事件的单次变换节选;完整接口返回还会按所选日期范围复合该股票的其他标签 1 事件。