EODHD 海外数据实操:把美股接进同一条流水线
系列·数据篇续集 — akshare 管 A 股,这篇把美股/全球日线接进同一个 SQLite,回测代码一行不改
📖 本篇是数据篇的海外续集,前置:akshare 数据实操(里面的 SQLite 增量落库骨架这篇直接复用)。
01 · 什么时候需要海外数据源
akshare 的主场是 A 股:免费、无需注册,聚合国内公开数据源。但两类需求它覆盖不了——做美股/全球市场的策略,以及需要官方契约的稳定接口(聚合爬虫接口偶尔会变,第三方付费源有正式的 API 合同)。EODHD 属于后者:一家 API 覆盖全球主要交易所的日线/分钟线,REST 直白,有免费档可以先把流程跑通, 适合个人研究者从 A 股流水线平滑扩展到海外市场。
选型口径:先想清楚市场,再选数据源——只做 A 股,akshare 够;要碰美股,HK、全球指数,再考虑付费源。
02 · 注册拿 Token
注册后进 dashboard 就能拿到自己的 api_token,所有请求都带它。官方还有个 DEMO token 供零注册试跑,但只能拉 AAPL 一只,正式使用换成自己的。免费档的额度以官网实时为准——本教程的代码 每天增量更新,免费档跑单只股票足够演示全流程。
03 · 第一个请求:拉苹果日线
美股代码要带 .US 后缀(AAPL → AAPL.US),其他交易所各有后缀规则,查不对接口会返回 空结果。以下代码本站实测可跑(2026-08 用 DEMO token 验证):
import requests
import pandas as pd
TOKEN = "你的token" # DEMO token 只能拉 AAPL,试跑可用
url = "https://eodhd.com/api/eod/AAPL.US"
params = {
"api_token": TOKEN,
"fmt": "json",
"order": "d", # 新日期在前(实测确认)
"from": "2026-01-01", # from/to 按日期过滤,增量更新的关键
"to": "2026-08-28",
}
data = requests.get(url, params=params, timeout=30).json()
df = pd.DataFrame(data)
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date").sort_index() # 落库前统一旧→新
print(df[["open", "high", "low", "close", "volume"]].tail())注意返回里有两列价格:close 是当时真实成交价,adjusted_close 是按拆股/分红复权后的价格——回测算收益用后者,看历史价位用前者,这和 akshare 篇的 qfq 是同一个问题换了张脸。
04 · 并进你已有的 SQLite 流水线
akshare 篇的 daily 表加两列来源字段,海外数据就能和 A 股数据同库共存,下游回测代码不用改:
import sqlite3
conn = sqlite3.connect("a_daily.db")
# 老库升级:补 source/exchange 两列(新库直接建表时带上)
cols = [r[1] for r in conn.execute("PRAGMA table_info(daily)")]
if "source" not in cols:
conn.execute("ALTER TABLE daily ADD COLUMN source TEXT DEFAULT 'akshare'")
conn.execute("ALTER TABLE daily ADD COLUMN exchange TEXT DEFAULT 'SSE/SZSE'")
out = df.reset_index()[["date", "open", "high", "low", "close", "volume"]].copy()
out["code"] = "AAPL"
out["source"] = "eodhd"
out["exchange"] = "US"
out.to_sql("daily", conn, if_exists="append", index=False)
conn.close()增量逻辑照抄 akshare 篇:库里查 MAX(date),把 from 设为缺失段起点。唯一区别是美股 收盘在北京时间早上,自动任务排北京时间上午跑昨日数据刚好定型(对应 akshare 篇的「18:30 盘后」)。
05 · 避坑清单(延续系列传统)
- 符号后缀查错 = 静默空结果 — 美股
.US、港股.HK,各交易所规则不同;接口对查 不到的代码可能返回空数组而不是报错,落库脚本要显式断言非空,不然你会以为任务跑成功了。 - 复权口径要全线统一 — 回测统一用
adjusted_close;和 qfq 一样,复权价会随未来分红整体 漂移,落库数据每隔几个月全量刷新一遍(akshare 篇同款纪律)。 - 额度与限频 — 免费档每天能拉多少次以官网为准;循环里
time.sleep礼貌限频,失败指数 退避,和 akshare 篇完全同款。 - 时区与交易日历 — 美股交易日和 A 股不同(感恩节/独立日 A 股照开),别用 A 股日历去判断美股缺数; 按
from/to拉区间、有啥存啥,缺的交易日就是休市。 - DEMO token 的幻觉 — 用 DEMO 调通了不代表正式 token 没问题:免费档/付费档能访问的数据范围不同, 正式跑之前先用自己的 token 把同样的请求过一遍。