如何对齐 A 股/美股/港股的交易日历做跨市场分析?

用户头像sh_*2176oo
2026-09-08 发布

一句话回答: A 股、美股、港股的休市日不一样(国庆 A 股休、感恩节美股休……),直接把两地价格按行号并排就会错位,算出来的相关性全是假的。正确做法是用 AlphaFeed 分别取各市场 K 线、从数据本身推导真实交易日历,再按交易日交集对齐后计算——几行 pandas 就能做对。

为什么会有这个问题

跨市场做联动、对冲、相关性时,最常见的错误是"两个序列长度不同就截齐、或直接 reset_index 后相减"。但:

  • A 股独有假期:春节、国庆长假期间 A 股休市,美股照常。
  • 美股独有假期:感恩节、马丁·路德·金日、阵亡将士纪念日等,A 股照常。
  • 港股又是一套:兼有内地与西方假期。

不对齐日历,收益率序列会整体"串行",相关系数、beta、价差都不可信。

分步骤解决

第 1 步:分别取各市场 K 线,推导交易日历

AlphaFeed 的 K 线里 trade_date 就是该市场的真实交易日(有数据=当天开市),据此直接得到各市场日历:

from alphafeed import AlphaFeed
import pandas as pd

af = AlphaFeed()  # 读取 ALPHAFEED_API_KEY

a  = af.klines.get("600519.SH", period="1d", count=250, to_dataframe=True)   # A 股
us = af.klines.get("AAPL.US",   period="1d", count=250, to_dataframe=True)   # 美股
hk = af.klines.get("00700.HK",  period="1d", count=250, to_dataframe=True)   # 港股

cal_a, cal_us, cal_hk = set(a["trade_date"]), set(us["trade_date"]), set(hk["trade_date"])
print("A 交易日:", len(cal_a), "US:", len(cal_us), "HK:", len(cal_hk))

各市场 count=250 覆盖的自然时间范围不同(因为休市日不同),所以下一步要先裁到共同区间再比较。

第 2 步:裁到共同区间,看日历差异

lo = max(min(cal_a), min(cal_us), min(cal_hk))
hi = min(max(cal_a), max(cal_us), max(cal_hk))
fa = {d for d in cal_a if lo <= d <= hi}
fu = {d for d in cal_us if lo <= d <= hi}

print("A 开市但美股休市:", sorted(fa - fu)[:6])
print("美股开市但 A 股休市:", sorted(fu - fa)[:6])

实测(约一年窗口)差异样例:

差异类型 数量(示例窗口) 典型日期 原因
A 开市 / 美股休 6 11-27、12-25、01-19、04-03 感恩节、圣诞、MLK 日、耶稣受难日
美股开市 / A 股休 16 10-01~10-08 A 股国庆长假
三地共同交易日 230 用于跨市场对齐的可靠集合

第 3 步:用交易日交集对齐后再计算

不要按行号对齐,要按 trade_date inner join(交集),只在两地都开市的日子比较:

la = a[["trade_date", "close"]].rename(columns={"close": "a_close"})
lu = us[["trade_date", "close"]].rename(columns={"close": "us_close"})

merged = pd.merge(la, lu, on="trade_date", how="inner").sort_values("trade_date")
merged["a_ret"]  = merged["a_close"].pct_change()
merged["us_ret"] = merged["us_close"].pct_change()

corr = merged[["a_ret", "us_ret"]].dropna().corr().iloc[0, 1]
print(f"共同交易日: {len(merged)}  A/US 日收益相关系数: {corr:.3f}")

关键点:how="inner" 自动丢掉任一方休市的日子,剩下的才是可比的同步样本。

第 4 步:注意"隔夜时差"——是否要错位一天

A 股白天收盘时,美股尚未开盘(当日美股是北京时间当晚才交易)。研究"美股隔夜 → 次日 A 股"的传导时,应把美股收益滞后一天再对齐:

merged["us_ret_lag1"] = merged["us_ret"].shift(1)  # 昨夜美股 -> 今日A股
lead = merged[["a_ret", "us_ret_lag1"]].dropna().corr().iloc[0, 1]
print(f"昨夜美股 vs 今日A股 相关: {lead:.3f}")

是否错位取决于你的研究问题:同步联动用当日对齐,跨市场传导/择时用滞后对齐。别把两者混为一谈。

关键坑与注意事项

  • 不要按行号/长度截齐:各市场交易日不同,行号对齐必然错位。永远按 trade_date join。
  • trade_date 是各市场的本地交易日:无需自己维护假期表,有 K 线数据的那天就是开市日。
  • 时区:日线用本地交易日对齐即可;只有做分钟级跨市场同步时才需要把 timestamp(毫秒 UTC)转到统一时区处理。
  • 停牌 vs 休市:个股停牌(volume=0)与整个市场休市不同,跨市场对齐用指数/宽基或多只票求并集更稳。
  • 美股/港股 K 线 amount=0(用 volume),跨市场比成交额时要注意口径。

常见问题(FAQ)

Q:我需要自己维护各国交易日历吗?
A:不用。AlphaFeed K 线的 trade_date 就是该市场真实开市日,直接从数据推导日历、取交集即可。

Q:为什么两地 count=250 拿回来日期对不齐?
A:因为休市日不同,同样 250 根 K 线覆盖的自然日区间不同。先裁到共同区间 [lo, hi] 再比较。

Q:算相关性该用当日还是滞后对齐?
A:研究同步联动用当日 inner join;研究"隔夜传导/择时信号"把先行市场收益 shift(1) 再对齐。

Q:需要付费吗?
A:跨市场 K 线(A/美/港)属基础能力,有免费额度;大规模批量与全市场池见 Starter 及以上,详见定价页。

小结

跨市场分析的第一道坎不是模型,而是交易日历对齐。用 AlphaFeed 各市场 K 线的 trade_date 推导真实日历、按交易日交集 inner join,再决定是否按隔夜时差错位一天——把对齐做对,相关性、beta、价差才可信。

参考

评论