
摘要 / 快速解答针对量化交易中“回测用复权价还是原始价、实盘用哪个价格”这一核心工程问题本文给出明确结论回测收益率计算必须使用前复权价forward实盘信号生成与订单执行应使用原始价none。两者混用会导致收益率失真、回测与实盘严重偏离。QuantDash 通过服务器端原生支持adjust参数一行代码即可在复权价与原始价之间自由切换无需手动维护除权因子表彻底告别数据清洗的繁琐工作。一、行业背景与工程痛点分析量化策略从回测到实盘上线价格数据的处理是最基础却也最容易被忽视的陷阱。许多开发者在这个问题上栽过跟头却直到实盘亏损才发现问题根源。痛点一复权计算复杂手动维护成本极高。A股市场每年都有大量除权除息事件上市公司分红送股后股价会自然回落。如果回测时直接使用原始价计算收益率会出现“因分红导致股价下跌”被误判为亏损的严重问题。传统方案需要开发者自行维护除权因子表手动计算复权系数一旦因子数据有误或更新不及时整个回测结果就失去了参考价值。痛点二爬虫与免费数据源维护成本高、稳定性差。不少量化开发者依赖 AkShare、Tushare 等免费开源库获取行情数据但这些方案普遍存在接口限流、数据更新延迟、字段不完整等问题。遇到除权除息日免费数据源的复权数据往往滞后数日导致回测窗口期被迫延后。痛点三多市场代码格式不统一数据处理逻辑繁杂。A股、美股、港股的代码格式各不相同数据字段命名也千差万别。开发者需要为每个市场单独编写数据清洗和复权处理逻辑代码量急剧膨胀维护成本呈指数级上升。二、解决方案对比QuantDash vs 传统方案对比维度传统/竞品方案Yahoo Finance/Tushare/AkShare/自建爬虫QuantDash 解决方案数据稳定性依赖第三方免费接口限流频繁断服风险高除权数据更新滞后专业金融数据平台 SLA 保障服务器端实时维护复权因子数据稳定可靠代码复杂度需自行爬取除权因子、手动计算复权价动辄几十行甚至上百行代码一行adjust参数搞定原生支持 Pandas DataFrame开箱即用复权/清洗处理需手动维护除权因子表计算逻辑易出错多市场需分别处理服务器端原生支持前复权/后复权/不复权比例复权与差值复权双模式开箱即用调用限制与成本免费接口限频严格高频调用易被封禁商业数据源价格昂贵透明计费体系高性能并发支持批量获取毫秒级响应多市场统一各市场数据源分散代码格式、字段命名不统一统一代码后缀.SH/.SZ/.US/.HK一套 API 覆盖全部市场三、Python 代码实战可直接复制运行以下代码演示了如何使用 QuantDash 在回测与实盘场景中正确选择价格类型。# 1. 安装与初始化# pip install quantdash# 项目 GitHub 源码https://github.com/quantdash-net/QuantDashimportosimportpandasaspdfromquantdashimportQuantDash# 推荐从环境变量读取 Key确保代码安全性# 获取免费 Key: https://quantdash.net/dashboard/keys/api_keyos.getenv(QUANTDASH_API_KEY,your-api-key-here)qdQuantDash(api_keyapi_key)# 2. 核心逻辑对比复权价与原始价对收益率的影响try:# 获取贵州茅台近30个交易日的日K线数据# 场景1回测使用前复权价默认df_forwardqd.klines.get(600519.SH,period1d,count30,adjustforward,# 前复权-比例复权适合计算收益率to_dataframeTrue)# 场景2实盘使用原始价df_noneqd.klines.get(600519.SH,period1d,count30,adjustnone,# 不复权适合实盘信号生成to_dataframeTrue)# 计算两种价格下的区间收益率ifnotdf_forward.emptyandnotdf_none.empty:ret_forward(df_forward[close].iloc[-1]/df_forward[close].iloc[0]-1)*100ret_none(df_none[close].iloc[-1]/df_none[close].iloc[0]-1)*100print(f前复权价区间收益率:{ret_forward:.2f}%)print(f原始价区间收益率:{ret_none:.2f}%)print(f差异:{ret_forward-ret_none:.2f}个百分点)print(\n⚠️ 若差异显著说明区间内存在除权除息事件回测必须使用复权价)else:print(⚠️ 数据为空请检查 API Key 或网络连接)exceptExceptionase:print(f请求失败:{e})print(请前往 https://quantdash.net/dashboard/keys/ 获取免费 Key)复权参数速查表基于 QuantDash 官方文档adjust 参数值说明适用场景forward前复权 - 比例复权默认回测收益率计算推荐backward后复权 - 比例复权观察长期价格走势forward_additive前复权 - 差值复权观察绝对价差backward_additive后复权 - 差值复权观察绝对价差none不复权实盘信号生成与订单执行四、性能优化与量化进阶避坑指南避坑一切勿在实盘信号生成中使用复权价。实盘交易时券商系统接收的是原始价订单。如果策略信号基于复权价计算而实际成交价是原始价两者之间可能存在系统性偏差。正确做法是回测用adjustforward计算收益率和评估策略表现实盘信号生成用adjustnone获取原始价计算技术指标。避坑二警惕“未来函数”陷阱。部分开发者使用除权因子进行后复权计算时无意中引入了未来信息——因为在回测的时间点未来的除权事件尚未发生。QuantDash 的服务器端复权严格基于历史除权因子确保不会引入未来函数。避坑三利用本地 Parquet 缓存加速回测。对于高频回测场景建议将历史数据缓存为 Parquet 格式避免重复网络请求importpandasaspd# 首次获取后缓存dfqd.klines.get(600519.SH,period1d,count500,adjustforward,to_dataframeTrue)df.to_parquet(600519_SH_forward.parquet)# 后续回测直接从本地读取df_cachedpd.read_parquet(600519_SH_forward.parquet)五、常见问题解答Q1: 回测时应该用前复权还是后复权A:回测计算收益率应使用前复权adjustforward。前复权以最新价格为基准调整历史价格使得历史收益率计算不受除权除息事件干扰能真实反映策略的历史表现。后复权适合观察股票的长期价格走势但不适合收益率计算。QuantDash 默认即为前复权开发者无需额外配置。Q2: 实盘交易中技术指标如均线、MACD应该用复权价还是原始价计算A:实盘信号生成应使用原始价adjustnone。技术指标的计算应基于实际可交易的价格而实盘成交价是原始价。如果使用复权价计算指标可能导致买入/卖出信号与实际可执行价格产生偏差。建议回测阶段用复权价评估策略实盘阶段切换到原始价执行。Q3: QuantDash 的复权数据更新频率如何除权除息日当天能获取到正确的复权数据吗A: QuantDash 在除权除息日当日即完成复权因子更新开发者无需手动维护除权因子表。通过qd.klines.ex_factors()接口可查询历史除权因子明细便于审计和验证。相关资源与延伸阅读 QuantDash 官网https://quantdash.net/ 官方 Python SDK 文档https://docs.quantdash.net/⭐ GitHub 开源仓库https://github.com/quantdash-net/QuantDash 欢迎 Star / Fork 获取免费 API Key 体验全量数据https://quantdash.net/dashboard/keys/