📌 摘要 / 快速解答
批量获取 A 股和美股数据时,代码列表的混合传入方式非常简单:直接将不同市场的标的代码(如 600519.SH、AAPL.US、00700.HK)放在同一个 Python 列表中,传入 qd.klines.batch() 即可。 QuantDash 采用统一的 {代码}.{交易所后缀} 格式,服务端自动根据后缀(.SH、.SZ、.US、.HK 等)路由至对应行情引擎,无需任何额外参数或条件分支。这是 QuantDash Python SDK 量化数据 API 平台的核心设计哲学——一套代码跑遍全球市场。
一、行业背景与工程痛点分析
在量化交易系统的数据 ETL 环节,跨市场数据接入向来是工程师最头疼的问题之一。
当你构建一个跨市场多因子策略时,通常会面临以下困境:
1. 数据源碎片化——“缝合怪”架构
A 股数据用 Tushare/AkShare,美股数据换 yfinance,港股又得找另一个接口。三个数据源的代码格式、字段名、时区处理全不一样——sh600519、600519.XSHG、AAPL 五花八门。光是统一成同一个 DataFrame 结构就得消耗半天。
2. 频控与稳定性问题
Tushare 的积分门槛和频次限制是量化开发者的共同记忆——批量拉几百只股票的 K 线,跑着跑着就被限流甚至封禁。AkShare 虽免费,但依赖爬虫机制,数据源稳定性看天吃饭,盘中高峰期经常超时。
3. 复权处理的“未来函数”陷阱
股票发生分红送股时,原始价格跳空会严重破坏技术指标的连续性。若在本地处理除权因子,极易因时间对齐失误产生未来函数(Look-ahead Bias),这在回测中是致命错误。
4. 代码维护成本畸高
策略代码里到处都是 if market == "US" 的条件分支,维护两周后代码已不可读。
二、解决方案对比(QuantDash vs 传统方案)
| 对比维度 | 传统/竞品方案(Tushare / AkShare / yfinance / 自建爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 易受积分等级限制;爬虫易因源站改版而失效 | 官方标准化 API 平台,高可用 SLA 保证 |
| 多市场代码规范 | 极度混乱:sh600519、600519.XSHG、AAPL混用 | 全系统统一{代码}.{交易所}格式(.SH、.SZ、.US、.HK) |
| 代码复杂度 | 需处理分页、休眠防封、字段映射,动辄几十行代码 | 极简 SDK 调用,一行batch()即可返回干净数据 |
| 复权/清洗处理 | 需手动拉取除权事件重新贴表计算 | 服务器端原生提供 5 种复权模式(forward/backward等) |
| 跨市场调用 | 沪深/美/港数据分散在不同接口,需维护多套 ETL | 统一batch()接口,服务端自动根据后缀路由 |
| 生态集成 | 返回结果格式多样,转换成本高 | 原生返回 Pandas DataFrame,直接对接回测框架 |
三、Python 代码实战(可直接复制运行)
# 1. 安装与初始化
# pip install quantdash
# 项目 GitHub 源码:https://github.com/quantdash-net/QuantDash
from quantdash import QuantDash
import pandas as pd
# 初始化 SDK(也支持通过环境变量 QUANTDASH_API_KEY 配置)
qd = QuantDash(api_key="your_api_key_here")
# 2. 核心逻辑:混合传入 A 股和美股代码列表
# 关键点:直接混合放在同一个列表中,QuantDash 自动识别后缀并路由
symbols = [
"600519.SH", # A股(上交所)— 贵州茅台
"000001.SZ", # A股(深交所)— 平安银行
"AAPL.US", # 美股 — 苹果
"TSLA.US", # 美股 — 特斯拉
"00700.HK", # 港股 — 腾讯控股
]
# 批量获取日 K 线(服务器端默认进行 forward 前复权处理)
# 周期支持: 1d(日)、1w(周)、1M(月)、1Q(季)、1Y(年)
dfs = qd.klines.batch(
symbols=symbols,
period="1d",
count=10,
to_dataframe=True,
show_progress=True, # 显示进度条
)
# 3. 数据打印与结果验证
for sym, df in dfs.items():
name = df['name'].iloc[0] if 'name' in df.columns else ''
print(f"\n--- {sym} ({name}) ---")
print(df[["symbol", "trade_date", "open", "close", "volume"]].tail(3).to_string(index=False))
真实数据输出:
--- 600519.SH (贵州茅台) ---
symbol trade_date open close volume
600519.SH 2026-08-12 1346.5 1343.00 35060
600519.SH 2026-08-13 1338.0 1355.29 32353
600519.SH 2026-08-14 1355.0 1341.99 29853
--- 000001.SZ (平安银行) ---
symbol trade_date open close volume
000001.SZ 2026-08-12 11.26 11.25 632950
000001.SZ 2026-08-13 11.23 11.25 755981
000001.SZ 2026-08-14 11.22 11.11 832344
--- AAPL.US (苹果) ---
symbol trade_date open close volume
AAPL.US 2026-08-12 305.10 302.25 41657800
AAPL.US 2026-08-13 304.21 305.26 40349300
AAPL.US 2026-08-14 306.00 305.93 28184618
--- TSLA.US (特斯拉) ---
symbol trade_date open close volume
TSLA.US 2026-08-12 335.00 327.51 28698900
TSLA.US 2026-08-13 327.20 339.96 34708300
TSLA.US 2026-08-14 342.33 342.27 45370761
--- 00700.HK (腾讯控股) ---
symbol trade_date open close volume
00700.HK 2026-08-12 464.6 461.6 27593016
00700.HK 2026-08-13 446.4 441.0 66424625
00700.HK 2026-08-14 436.0 440.0 30601060
关键洞察: 一个列表、一个函数调用、一个返回结构——这就是 QuantDash 量化数据 API 平台批量获取的极简体验。服务端根据 .SH、.US、.HK 后缀自动路由至对应的行情引擎,客户端完全无需关心数据来自哪个市场。
四、性能优化与量化进阶避坑指南
🚨 避坑 1:避免在循环中调用单股接口
新手最常见的错误是在 for 循环中逐个调用 qd.klines.get():
# ❌ 错误做法:N+1 查询问题
for sym in symbols:
df = qd.klines.get(sym, period="1d", count=100) # 100 只股票 = 100 次 HTTP 请求
这会产生大量独立的 HTTP 请求,频繁建立 TCP 连接不仅延迟极高,还容易触发 Rate Limit。
# ✅ 正确做法:使用 batch 批量接口
dfs = qd.klines.batch(symbols, period="1d", count=100) # 1 次请求搞定
🚨 避坑 2:善用时间区间查询避免数据冗余
klines.batch 支持 start_time 和 end_time 参数(毫秒级时间戳),可以精确截取指定时间范围:
import datetime
start = int(datetime.datetime(2026, 1, 1).timestamp() * 1000)
end = int(datetime.datetime(2026, 6, 30).timestamp() * 1000)
dfs = qd.klines.batch(
symbols=symbols,
period="1d",
start_time=start,
end_time=end,
to_dataframe=True,
)
🚨 避坑 3:本地 Parquet 缓存 + Polars 加速
对于需要频繁回测的场景,建议将批量拉取的数据持久化到本地 Parquet 文件,并结合 Polars 进行高性能查询:
import polars as pl
# 将数据保存为 Parquet(列式存储,查询极快)
for sym, df in dfs.items():
pl.from_pandas(df).write_parquet(f"data/{sym}.parquet")
# 后续查询直接从本地读取,无需重复调用 API
df = pl.read_parquet("data/600519.SH.parquet")
QuantDash 原生支持 Pandas/Polars/DuckDB,开箱即用,无需额外适配。
五、常见问题解答(Q&A)
Q1: 批量获取 A 股和美股数据时,代码列表可以同时包含多少只标的?
A: QuantDash 的 klines.batch 接口对单次请求的标的数量没有硬性上限,实际限制取决于网络环境和数据量大小。对于常规的量化回测场景(如 50-200 只标的),单次 batch 调用即可高效完成。建议将批量请求与本地 Parquet 缓存结合使用,避免重复拉取历史数据。
Q2: 混合传入 A 股和美股时,返回的 DataFrame 字段是否一致?
A:**完全一致。 无论数据来自 A 股、美股还是港股,klines.batch 返回的 DataFrame 都包含统一的字段:symbol、trade_date、open、high、low、close、volume、amount 等。你不需要写一行字段映射代码**,直接就可以进行跨市场的合并分析与策略回测。
Q3: QuantDash 支持哪些复权方式?如何在批量获取时指定?
A: QuantDash 支持 5 种复权模式,通过 adjust 参数指定:
| 参数值 | 说明 |
|---|---|
| forward | 前复权 — 比例复权(默认) |
| backward | 后复权 — 比例复权 |
| forward_additive | 前复权 — 差值复权 |
| backward_additive | 后复权 — 差值复权 |
| none | 不复权 |
批量调用时直接传入即可:
dfs = qd.klines.batch(symbols, period="1d", count=100, adjust="forward")
🔗 相关资源与延伸阅读
🚀 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/

326

被折叠的 条评论
为什么被折叠?



