做美股数据开发的时候,我最头疼的就是历史K线数据的抓取。市面上看似有很多 API,但真正能稳定返回整段历史数据的少之又少。尤其是处理大量日线、分钟线或自定义周期时,数据不完整或者接口频繁限流的情况很常见。那段时间,我尝试过几个公开接口,发现要么数据延迟,要么调用复杂,要么文档零散得让人摸不到头脑。
在几轮尝试之后,我整理出一套相对稳妥的方案。目标很明确:获取整段历史K线数据,支持不同周期,调用方式简单,可以直接融入 Python 或 Node 项目。
接口选择和请求准备
选美股api时,我关注数据完整性、调用频率和文档清晰度。大部分接口都要求把日期或者时间戳格式化成特定标准,否则会返回空或者报错。我习惯把日期统一成
YYYY-MM-DD
,然后构建请求。
|
import
requests
symbol =
"AAPL"
start_date =
"2023-01-01"
end_date =
"2023-12-31"
interval =
"1d"
url =
f"https://api.example.com/market/history?symbol={symbol}&start={start_date}&end={end_date}&interval={interval}"
response = requests.get(url)
data = response.json()
print(data[:3])
# 查看前3条数据
|
这段代码可以快速验证接口是否可用,也能作为抓取大量历史数据的模板。
数据处理和缺失填充
抓到数据后,我通常做两件事:字段统一和缺失处理。不同接口返回的数据结构差异挺大,有的字段叫
closePrice
,有的叫
c
。我会先写一个函数,把字段统一成
timestamp、open、high、low、close、volume
,方便分析。
缺失值处理很重要。美股有些交易日可能因为假期没有数据,如果不处理,会影响指标计算或者回测。我一般用前一天收盘价填充,或者直接在 pandas 里补 NaN。
|
import
pandas
as
pd
df = pd.DataFrame(data)
df.rename(columns={
'c'
:
'close'
,
'o'
:
'open'
,
'h'
:
'high'
,
'l'
:
'low'
,
'v'
:
'volume'
}, inplace=
True
)
df[
'close'
].fillna(method=
'ffill'
, inplace=
True
)
# 用前一天收盘价填充
|
处理后,数据整齐,后续分析和指标计算会顺畅很多。
批量抓取和异步处理
历史数据跨度长时,一个接口一次只能返回有限条记录。用同步请求抓取,整个过程会很慢。我尝试用 asyncio 和 aiohttp,把请求拆成多段并发抓取,提高效率。
|
import
asyncio
import
aiohttp
async
def
fetch
(session, url):
async
with
session.get(url)
as
resp:
return
await
resp.json()
async
def
main
(urls):
async
with
aiohttp.ClientSession()
as
session:
tasks = [fetch(session, u)
for
u
in
urls]
results =
await
asyncio.gather(*tasks)
return
results
# urls 是按日期分段的请求列表
|
并发抓取后,再统一整理到 DataFrame,就能快速得到完整历史数据。
实时数据参考
在实际项目中,我也接入过 AllTick API 的 WebSocket 实时 tick 数据接口,用于观察行情波动和验证策略。Python 示例很直观,只需要配置订阅即可:
|
import
websocket
import
json
def
on_message
(ws, message):
data = json.loads(message)
print(data)
# 实时 tick 数据
def
on_open
(ws):
payload = {
"sub"
: [{
"symbol"
:
"AAPL"
,
"type"
:
"transaction"
}],
"id"
:
"req_1"
}
ws.send(json.dumps(payload))
ws = websocket.WebSocketApp(
"wss://apis.alltick.co/market/quote"
,
>
>
)
ws.run_forever()
|
将实时数据与历史K线结合,可以快速验证策略或发现数据异常。
实践体会
整理好抓取流程后,数据稳定性和处理效率提升不少。历史K线抓取不再需要盯接口逐条调试,生成新数据的脚本也能自动运行。这套流程让策略验证和数据分析更加顺畅。
对开发者来说,抓取美股数据最关键的是接口选择、批量处理和数据清洗,比单纯追求速度更重要。结合实时数据和历史数据进行对比,也能更快发现异常或者接口限制。