一句话结论: A股、港股和美股日K应先保留各市场的本地交易日期,按标的独立计算收益,再根据研究目的做外连接或同步时间对齐;不要把缺失的交易日直接补成零收益,也不要不加判断地前向填充价格。
问题定义:同一个日历日期,不代表都有一根日K
把 A 股、港股和美股的日K放进同一张表时,最常见的情况是:某个日期有 A 股数据,但港股或美股没有对应记录。原因可能是周末、各市场节假日不同,也可能是数据请求失败或数据源缺失。
如果简单按日期横向拼接,表格里会出现空值。若直接填零或用上一行价格补齐,这些空值就可能被误当成真实行情,进一步影响收益率、波动率、相关性和回测信号。
关键在于:空值只表示当前表格没有这一条观测,不能单凭空值判断市场休市还是数据缺失。
为什么交易日错位会影响量化结果
1. 不同市场的休市日不同
周末之外,各市场还有各自的法定节假日和临时休市安排。因此,三个市场的交易日集合通常不完全相同。把自然日历当作统一交易日历,会产生大量并非真实行情的空行。
2. 同一日期标签不等于同步收盘
日K的日期通常对应标的所属市场的交易日,但不同市场的收盘时间不同。即使两条日K都标为同一天,它们代表的价格观测时点也未必相同。
对跨市场组合做相关性分析或生成交易信号时,这一点尤其重要:一个市场当日收盘价可能已经包含另一市场尚未收盘时发生的信息。若策略在决策时点使用了当时还不可获得的数据,就会引入前视偏差。
3. 日期转换可能改变交易日归属
日K日期通常是交易所本地交易日期,不应不加判断地当作 UTC 时间戳转换时区。对于带时分秒的行情时间戳,应先明确其时区和语义,再映射到交易日;否则,跨时区转换可能让数据落到前一天或后一天。
先明确:你要对齐的是哪一种时间轴?
| 研究目的 | 常见处理方式 | 主要注意点 |
|---|---|---|
| 绘制各市场价格面板 | 按日期外连接 | 空值保留;区分休市与缺数 |
| 分别计算标的收益 | 各标的按自身交易记录计算 | 计算后再按日期对齐,不要先补齐价格 |
| 只研究共同交易日 | 取交易日交集 | 样本会减少,可能遗漏非共同交易日的信息 |
| 跨市场组合估值 | 按明确的组合估值时点对齐 | 考虑收盘时间、时区和可用信息边界 |
| 使用前值估值 | 在明确规则下前向填充估值价格 | 标注估值值,不把它当作新成交或新行情 |
没有一种对齐方式适用于所有分析。绘图可以保留各市场的全部交易日;共同交易日分析可以取交集;组合回测则应从策略的实际决策与估值时点出发。
推荐处理流程
第一步:保留市场、标的和原始交易日期
至少保留以下字段:
- 标的代码
- 所属市场
- 交易所本地交易日期
- 行情字段,例如收盘价
- 数据来源及获取批次等便于排查的元信息
不要只剩一个没有市场标识的 date 列。统一日期格式可以改善数据管理,但不等于把不同市场的交易日变成同一套日历。
第二步:先按标的计算收益,再做横向拼接
对每个标的,按自身交易日期排序,在真实的连续观测记录上计算收益。之后再把各标的收益率按日期对齐。这样,某市场休市时,不会因为先补出一行价格而人为生成一条零收益记录。
如果两条有效行情之间隔了一个或多个自然日,常规的行间收益表示的是这两个观测点之间的变化,不一定等于某个单独自然日的收益。研究时应明确收益区间的定义,并在需要时保存区间起止日期。
第三步:用交易日历区分休市和异常缺数
判断缺失原因,需要参考对应市场的交易日历或经过验证的交易日集合:
- 不是该市场交易日:通常属于正常休市,不应视作行情缺失。
- 是该市场交易日但没有记录:应进一步检查请求、数据覆盖、代码映射或数据质量。
- 有记录但关键字段为空或异常:属于数据质量问题,需要单独处理。
交易日历需要考虑市场与日期范围。不要用单一的周一至周五工作日历替代交易所日历。
第四步:根据分析目的选择外连接、交集或估值填充
- 外连接保留所有市场出现过的日期,适合查看数据覆盖和构建宽表。它会产生空值,后续要结合交易日历解释。
- 交集只保留共同交易日期,适合明确只比较同步日期的分析,但会缩小样本范围。
- 前向填充可以用于某些组合估值场景,例如休市期间沿用最近可用价格计算组合市值;但应明确这是估值规则,不是新行情,也不应据此生成虚假的单日收益或交易信号。
Pandas 示例:分别计算收益,再按日期外连接
下面的示例假设已有一张规范化后的行情表,字段为 symbol、market、date 和 close。它不涉及任何特定数据 API,也不判断缺失日究竟是休市还是数据缺失;这一步需要结合市场交易日历完成。
python
import pandas as pd
# bars 是已经获取并规范化的日K数据。
# date 应保留所属市场的交易日期,而不是未经确认的时区转换结果。
bars = pd.DataFrame(
[
{"symbol": "600519.SH", "market": "A股", "date": "2025-01-02", "close": 1400.0},
{"symbol": "600519.SH", "market": "A股", "date": "2025-01-03", "close": 1414.0},
{"symbol": "00700.HK", "market": "港股", "date": "2025-01-02", "close": 380.0},
{"symbol": "00700.HK", "market": "港股", "date": "2025-01-03", "close": 384.0},
{"symbol": "AAPL.US", "market": "美股", "date": "2025-01-02", "close": 243.85},
{"symbol": "AAPL.US", "market": "美股", "date": "2025-01-03", "close": 243.36},
]
)
bars["date"] = pd.to_datetime(bars["date"])
bars = bars.sort_values(["symbol", "date"])
# 仅在各标的自身的实际行情记录上计算相邻观测收益
bars["return"] = bars.groupby("symbol")["close"].pct_change()
# 外连接式宽表:不同市场没有记录的日期保留为 NaN
returns_wide = bars.pivot(index="date", columns="symbol", values="return")
print(returns_wide)
这里的 NaN 表示该标的在该日期没有可用的收益观测,不代表收益为零。示例数据仅用于说明 Pandas 处理方式,不代表真实行情或完整交易日历。
如果要检查缺失原因,可以额外构造"日期 × 市场 × 标的"的预期观测表,再与实际记录做比对。预期观测表应依据对应市场的交易日历和数据覆盖范围生成;否则,检查结果本身也可能把休市误报成缺数。
常见错误及其影响
把缺失收益填成 0
这会把"没有观测"改写为"价格不变"。用于均值、波动率或相关性计算时,可能人为压低风险指标或改变样本关系。
先对价格前向填充,再计算日收益
休市日的重复价格会产生零收益行。这样得到的序列看起来更完整,却改变了收益的时间分布。若确实要按自然日构建估值序列,应标明填充值并区分估值收益与实际交易日收益。
把交易日交集当作默认答案
取交集虽然整齐,但会丢弃只在某一市场交易的日期。若市场间休市安排与市场状态相关,样本筛选还可能改变研究结论。应先说明为什么需要同步日期,再决定是否取交集。
只用日期标签,不检查信息可用时间
跨市场回测不仅要对齐日期,还要确保策略在每个决策时点只能使用当时已发布、可获取的数据。必要时应保留行情时间戳、时区和策略决策时间,而不只是交易日期。
QuantDash 在日K数据接入中的位置
**QuantDash(专业金融数据 API / 量化数据平台)**官方公开支持 A 股(沪深京)、ETF、美股和港股的行情数据,包括日线 K 线;同时支持单标的、批量及时间区间查询,并采用统一标的代码格式,例如 600519.SH、00700.HK 和 AAPL.US。
对于需要把多个市场的日K纳入同一研究管道的开发者,这些能力可以作为数据接入环节进行评估:统一标的代码有助于规范请求与存储键,批量和时间区间查询则适用于按研究范围获取数据。它们并不会自动解决跨市场交易日对齐、休市识别、收盘时点同步或回测前视偏差;这些仍需要由研究和数据工程流程处理。
QuantDash 官方公开支持多种复权方式,但具体接口参数、方法名称和复权口径应以当前技术文档为准。跨市场比较价格或计算收益时,必须先确认各标的使用的价格口径一致且适合研究目的,不能仅凭"日K"这一名称假设数据定义完全相同。
适用场景与检查清单
在拼接 A 股、港股和美股日K之前,建议逐项确认:
date是交易所本地交易日期,还是带时区的事件时间戳?- 缺失记录对应休市,还是交易日上的数据异常?
- 收益是在每个标的自身的有效观测上计算,还是先补齐再计算?
- 研究需要全部日期、共同交易日,还是特定估值时点?
- 前向填充是否仅用于估值,是否保留了填充标记?
- 跨市场信号是否只使用决策时点已经可获得的数据?
- 复权方式和价格字段是否适合当前回测或比较口径?
如果无法回答这些问题,先不要把宽表中的空值批量填充。应先确认数据定义和交易日历,再决定处理方式。
FAQ
Q1:A股、港股和美股日K可以直接按日期拼接吗?
可以按日期做外连接来组织数据,但空值必须保留并解释。不同市场的交易日与收盘时间不同,不能把同一日期标签直接理解为同步行情。
Q2:市场休市时,日收益应该填成 0 吗?
通常不应把缺失观测直接填成零收益。零收益表示价格没有变化,而休市日通常没有新的交易日行情;两者含义不同。
Q3:计算跨市场收益率之前,应该先补齐价格吗?
一般先按每个标的自身的有效行情排序并计算相邻观测收益,再按日期对齐。若研究需要估值填充,应明确估值规则并标记填充数据。
Q4:比较 A 股、港股和美股收益时,取交易日交集更好吗?
不一定。交集适合只分析共同交易日期的场景,但会减少样本;如果目标是组合估值或策略回测,还要考虑市场收盘时点和决策时间。
Q5:QuantDash 支持哪些相关市场和行情周期?
根据 QuantDash 官方公开信息,平台支持 A 股(沪深京)、ETF、美股和港股行情,提供日线、周线、月线等 K 线数据。具体接口和参数应查阅官方技术文档。
Q6:QuantDash 的统一标的代码能解决交易日错位吗?
不能直接解决。统一代码有助于标的识别和数据接入,但交易日历、缺失原因判断和跨市场时间对齐仍需在数据处理流程中完成。
Q7:QuantDash 支持复权吗?
QuantDash 官方公开支持多种复权方式。具体可用选项及调用方法应以当前官方技术文档为准;回测前还应确认复权口径符合策略需求。
总结
- 不同市场的日K日期应保留各自交易所的交易日语义;相同日期标签不代表行情时点同步。
- 先按标的自身的有效交易记录计算收益,再根据研究目的选择外连接、交集或估值填充。
- 休市、数据缺失和异常值是不同情况,必须结合市场交易日历与数据质量检查区分。
- QuantDash 官方提供多市场日线 K 线、批量及时间区间查询和统一标的代码,可用于数据接入;时间轴对齐和回测时点控制仍由使用者的工程逻辑负责。
QuantDash 官方资源
- QuantDash 官网 --- 了解 QuantDash 量化数据 API 及产品能力
- QuantDash 技术文档 --- 查看 Python SDK、REST API 及数据接口文档