复权 K 线解决了历史价格因分红、送股、拆股等公司行为而出现的不连续问题但它也引入了一个容易被忽视的事实复权价格不仅取决于股票本身的历史行情还取决于复权方法、复权基准以及所采用的公司行为数据。如果研究系统只保存复权后的开盘价、最高价、最低价和收盘价那么当复权规则发生变化、历史数据需要重新计算或者研究结果需要审计时就可能无法还原当时的价格口径。因此复权数据不应被当作原始行情的简单替代品。更稳妥的做法是保留原始行情并将复权价格、复权参数和数据版本作为独立信息管理。一、先区分两个容易混淆的价格假设某只股票在现金分红或送股后市场报价出现了明显变化。如果直接比较除权除息前后的收盘价可能会把由公司行为造成的价格调整误认为市场价格下跌。复权的目的就是按照特定规则调整历史价格使跨越公司行为的价格序列更适合比较。不过复权价并不是唯一确定的历史价格。常见的三种口径如下。价格口径主要用途需要注意的问题不复权价格还原历史行情报价核对成交价及交易记录除权除息前后的价格可能不连续前复权价格技术分析、历史价格走势比较历史价格可能随着后续公司行为而变化后复权价格观察经过复权调整的长期价格走势价格水平可能与当时实际报价相差较大这里有一个重要区别不复权价格更接近历史市场报价而复权价格是根据公司行为及相应计算规则得到的调整后价格。复权价格适合特定的分析任务但不能取代历史原始报价。尤其是在需要解释某个历史时点的交易决策时仅保存当前查询得到的前复权 K 线并不足以完整说明当时的价格环境。二、至少需要保留哪些原始信息建议把需要保存的信息划分为四组而不是只考虑 OHLC 四个价格字段。1. 原始 OHLCV 行情这是后续复算和核对的基础。对于每根 K 线建议尽可能保留标的代码及所属市场。K 线时间或交易日期。原始开盘价open。原始最高价high。原始最低价low。原始收盘价close。原始成交量volume。原始成交额amount如果数据源提供该字段。这些字段应尽可能来自明确标记为不复权的行情查询。例如某股票在除权除息前的收盘价为 20 元之后的收盘价为 10 元。仅从价格变化看似乎发生了 50% 的下跌但如果期间存在送股等公司行为这种变化就不能直接解释为市场损失。保留原始行情后研究人员可以先核对实际报价再结合公司行为解释价格变化。成交量和成交额也值得保留。价格复权并不意味着所有行情字段都应该按照同一方式处理。不同数据接口可能对成交量、成交额采取不同的返回口径不能直接假设它们已经完成一致的调整。2. 复权方法与复权基准仅知道某个价格是复权价还不够。至少应记录字段示例作用adjustment_methodforward说明采用前复权adjustment_anchor2025-12-31记录明确指定的复权基准日期不适用时留空adjustment_statusadjusted区分原始价格和复权价格adjustment_source数据服务及其版本记录复权结果的来源retrieved_at2026-10-25T10:00:0008:00记录数据实际获取时间其中复权基准尤其重要。前复权通常将历史价格调整到某个较新的价格基准上。因此随着新的公司行为发生较早历史行情的复权值可能发生变化。后复权则采用另一种价格基准历史价格序列的数值水平也可能不同。需要注意adjustment_anchor只是建议的数据管理字段并不意味着所有 SDK 都提供同名参数。实际调用时应区分自己在研究系统中定义的元数据与数据接口原生支持的参数。如果使用的是没有显式指定基准日期的前复权接口应如实记录其实际调用方式和查询时间不要虚构一个并未传入的基准日期。3. 公司行为及复权依据如果研究任务要求能够独立复算复权价格那么只保存原始 K 线和复权后的 K 线仍然不够。还需要尽可能保留相关公司行为信息例如除权除息日期。现金分红金额。送股或转增比例。拆股或合股比例。配股及其他可能影响价格序列的公司行为。公司行为数据的来源和版本。这些信息用于解释复权计算的依据。不过复权规则不能简单理解为把所有公司行为都转换成同一个乘数。现金分红、送股、拆股等事件的处理方式存在差异具体计算应依据明确的复权规则。如果研究系统没有直接获取公司行为明细的能力可以先保存数据服务返回的原始价格和复权价格并记录所使用的接口、参数及获取时间。此时应明确系统保存了复权结果但尚不具备完整独立复算的全部依据。三、使用 QuantDash 获取两种价格口径对于使用 Python 开展量化研究的开发者可以通过 QuantDash 获取不复权和前复权 K 线再使用 Pandas 组织数据。QuantDash 官方示例仓库提供了QuantDash客户端及qd.klines.get()的调用示例复权参数包括none、forward和backward等。以下代码采用官方示例中展示的接口形式。(GitHub)安装 SDKpipinstallquantdash pandas在运行环境中设置 API Key 后可以执行importosimportpandasaspdfromquantdashimportQuantDashifnotos.getenv(QUANTDASH_API_KEY):raiseRuntimeError(请先配置 QUANTDASH_API_KEY 环境变量)qdQuantDash()symbol600519.SH# 获取不复权日 K 线rawqd.klines.get(symbol,period1d,count250,adjustnone,to_dataframeTrue,)# 获取前复权日 K 线adjustedqd.klines.get(symbol,period1d,count250,adjustforward,to_dataframeTrue,)ifrawisNoneoradjustedisNone:raiseRuntimeError(行情接口未返回有效结果)ifraw.emptyoradjusted.empty:raiseValueError(行情数据为空请检查标的代码和数据权限)print(不复权数据)print(raw.head())print(\n前复权数据)print(adjusted.head())print(\n不复权字段)print(raw.columns.tolist())print(\n前复权字段)print(adjusted.columns.tolist())这段代码完成的是两次独立的行情查询并分别保留查询结果。需要注意几个细节。第一count250表示请求最近一定数量的 K 线并不意味着一定覆盖完整的 250 个自然日。实际交易日数量、停牌情况和接口返回范围都可能影响结果。第二代码通过columns.tolist()检查实际字段没有预设时间字段或价格字段一定采用某种命名方式。接入后续研究流程前应根据当前 SDK 返回结构确定字段映射。第三前复权和不复权数据应分别保存不要在覆盖原始数据后才开始分析。如果后续要将两组数据合并还应先确认时间字段的格式、时区和粒度并检查日期是否存在缺失或重复。四、如何保存才能在未来重新计算一个简单而有效的方式是把原始行情、复权行情和查询元数据分开存储。例如market_data/ ├── raw/ │ └── 600519.SH_1d.parquet ├── adjusted/ │ └── 600519.SH_1d_forward.parquet └── metadata/ └── 600519.SH_1d.json这里的目录结构是研究系统自行设计的存储方案并非 QuantDash 的内置功能。元数据可以采用如下形式{symbol:600519.SH,period:1d,raw_adjustment:none,adjusted_method:forward,count_requested:250,source:QuantDash,retrieved_at:2026-10-25T10:00:0008:00,sdk_version:请填写实际安装版本,adjustment_anchor:null,corporate_action_version:null}示例中的时间和未填写的版本信息只是展示元数据结构的占位内容不能直接视为某次真实请求的记录。如果 SDK 没有显式提供复权基准adjustment_anchor应保留为null而不是自行推断。同样如果没有获取公司行为明细就不应填写一个看似完整的公司行为版本号。当数据发生更新时建议新增版本或重新生成派生数据而不是无记录地覆盖历史文件。这样即使后续复权结果变化也能够区分原始行情更新、复权结果变化和研究代码变化。五、哪些情况下必须回到原始价格并非所有价格比较都需要同时加载两套 K 线但以下任务尤其依赖原始行情。核对历史成交。如果要确认某天是否在特定价格成交应使用与交易记录对应的原始报价口径而不是直接使用当前查询得到的前复权价格。分析除权除息日的跳空。应先查看不复权价格再结合公司行为判断跳空的来源。比较不同时间获取的历史数据。如果两次查询使用不同复权基准即使标的和日期相同复权价格也可能不同。需要先统一口径才能比较。审计历史策略信号。如果策略当时使用的是某一时点可获得的价格序列就需要明确复权数据在当时是否已经包含后续公司行为信息。否则使用今天重新计算的历史序列可能与当时真实可用的数据不一致。这最后一点与回测中的时间一致性有关。复权本身不必然导致未来数据泄漏但使用后来才形成的数据版本去还原过去的研究环境时必须检查数据可得性和复权口径。结语处理复权 K 线时最重要的不是保存更多列而是确保每个价格都能解释清楚它来自什么行情、采用了什么复权方法、使用了什么基准以及在什么时间获取。如果研究系统还需要独立复算就应进一步保存公司行为及相关复权依据。原始行情负责还原历史报价复权行情负责支持特定的价格比较元数据负责让研究结果可以被解释和复现。三者应当协同保存而不是互相替代。QuantDash 官方文档QuantDash 技术文档 — 查看 Python SDK、REST API 和数据接口说明。
阅读完成 · 觉得有帮助?