一句话回答: 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_datejoin。 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、价差才可信。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart

