刚开始接触港股数据开发的朋友,常常会在第一步就卡住------不是代码写不出来,而是根本不知道从哪里找港股API,也不清楚拿到API之后应该怎么用。
这篇文章是专门为这类开发者写的。不管你是刚学Python的新手,还是做过其他市场数据接入、想快速了解港股的老手,读完这篇,你应该能完整走完「选API → 拿Key → 发请求 → 解析数据」的全流程。
一、什么是港股API?
API(Application Programming Interface)是软件之间交换数据的接口协议。港股API,就是专门提供香港股票市场实时行情数据的接口------你发一个HTTP请求过去,对方返回腾讯、阿里、美团等港股标的的最新成交价、K线、盘口信息。
港股API的典型使用场景:
- 自建行情看板:在网页或App里显示实时港股价格
- 量化策略研究:拉取历史K线数据做回测
- 交易提醒工具:当某只股票价格触碰预设区间时发通知
- 选股模型:批量获取多只港股数据,筛选符合条件的标的
- 数据分析报告:定期抓取港股数据生成图表
和在财经网站上手动查价格不同,通过港股实时行情API,你可以用程序自动、批量、实时地拿到数据,完全不需要人工操作。
二、接入港股API之前,先弄清楚这三件事
2.1 港股交易时间
港股的实时行情只在交易时间内更新。香港联合交易所(HKEX)的正常交易日时间如下(时区:UTC+8):
| 时段 | 时间 |
|---|---|
| 早盘竞价 | 09:00 -- 09:30 |
| 上午交易 | 09:30 -- 12:00 |
| 午休 | 12:00 -- 13:00 |
| 下午交易 | 13:00 -- 16:00 |
| 收盘竞价 | 16:00 -- 16:10 |
交易日为周一至周五,香港公众假期停市。非交易时间调用接口,返回的通常是最后一个交易日的收盘数据,不是实时报价。
这个时间点很重要。如果你在写定时任务或监控脚本,需要考虑是否在交易时间内------否则拉回来的数据毫无意义。
2.2 数据类型:成交价、K线、盘口有什么区别?
港股数据API通常提供三类核心数据,对应不同的使用场景:
① 实时成交(Trade Data)
最新一笔成交的价格和成交量。适合做价格监控、触发交易提醒。每次成交都会产生一条新记录,交易活跃的股票一秒内可能产生多笔。
② K线数据(Kline / OHLCV)
把一段时间内的成交汇总成一根K线,包含开盘价(O)、最高价(H)、最低价(L)、收盘价(C)、成交量(V)。周期可以是1分钟、5分钟、日K、周K等。适合做图表展示和技术分析。
③ 盘口数据(Order Book Depth)
当前市场的买卖挂单分布,通常提供五档或十档的买价/卖价和对应挂单量。适合需要分析市场供需关系或做高频策略的场景。
新手建议先从实时成交价 和日K线入手,理解了数据结构之后再扩展到分钟K线和盘口。
2.3 REST API 还是 WebSocket?
接入港股行情API有两种主流方式:
| 方式 | 工作原理 | 适合场景 |
|---|---|---|
| REST API | 你主动发请求,服务器返回当前数据 | 低频查询、历史K线、页面初始化加载 |
| WebSocket | 建立长连接,服务器主动推送最新数据 | 实时监控、交易提醒、高频更新面板 |
对新手来说,REST API更容易上手 ------就是一个普通的HTTP请求,用Python的requests库几行代码就能跑起来。WebSocket稍微复杂一些,涉及异步和连接维护,建议先跑通REST再考虑。
三、如何选择港股数据API?
市面上获取港股行情数据的方式主要有四种:
方案一:直连香港交易所
HKEX官方提供授权数据服务,数据质量最高,但成本极高。实时L1行情的授权费用通常在6万到12万人民币/年,还需要申请企业资质、签署数据分发协议,通常只有有一定规模的券商或机构才会走这条路。对于个人开发者和小团队,基本不用考虑。
方案二:免费接口(Yahoo Finance等)
Yahoo Finance、东方财富等平台的接口可以查到部分港股数据,但有几个硬伤:
- 延迟15分钟以上,无法用于实时应用
- 频繁被限速或封IP
- 数据格式不稳定,随时可能变动
- 覆盖范围有限,小市值股票容易缺数据
免费接口适合做偶尔的数据查询,不适合构建稳定运行的应用。
方案三:第三方港股数据API
第三方数据服务商统一采购交易所授权,以更合理的价格向开发者分发数据。这是大多数开发者的实际选择,兼顾了数据质量、稳定性和成本。港股实时行情API通常通过这类服务商获取。
方案四:自建爬虫
技术上可行,但维护成本极高------财经网站频繁改版,反爬机制越来越严格,数据延迟和完整性都无法保证。不推荐。
选型时重点关注这几个维度:
- 数据延迟:实时场景要求毫秒级,WebSocket推送比REST轮询延迟低很多
- 覆盖范围:是否覆盖港股主板、创业板、轮证、指数
- 接口稳定性:有没有SLA保障,历史故障率怎样
- 文档质量:开发者文档是否清晰,有没有代码示例
- 试用机制:能不能先免费试用再决定是否付费
四、手把手接入:从零跑通港股实时行情API
下面以常用的 Infoway 港股行情数据接口为例,演示完整的接入流程。
Step 1:注册并获取 API Key
在数据服务商官网注册账号后,通常会自动获得一段免费试用期(不需要绑卡)。登录后台可以看到你的 API Key,格式类似:
sk-a1b2c3d4e5f6g7h8i9j0...
所有请求都需要在HTTP请求头中携带这个Key,格式为:
apiKey: YOUR_API_KEY_HERE
如果 Key 不正确或已过期,接口会返回 401 或 403 错误。
Step 2:安装 Python 依赖
本教程用 Python 演示。只需要 requests 库,大多数环境默认已安装,没有的话执行:
bash
pip install requests
Step 3:发送第一个请求------查询港股实时成交价
接口地址:https://data.infoway.io/stock/batch_trade/{codes}
{codes} 是股票代码,港股格式为{五位数字}.HK,例如腾讯是00700.HK。
python
import requests
# 你的 API Key
API_KEY = "YOUR_API_KEY_HERE"
# 要查询的港股代码(腾讯控股)
code = "00700.HK"
# 构造请求
url = f"https://data.infoway.io/stock/batch_trade/{code}"
headers = {
"apiKey": API_KEY,
"Accept": "application/json"
}
# 发送请求
response = requests.get(url, headers=headers, timeout=10)
# 打印返回结果
print(f"状态码: {response.status_code}")
print(f"返回内容: {response.json()}")
如果一切正常,你会看到类似这样的返回:
json
{
"ret": 200,
"msg": "success",
"traceId": "a1b2c3d4-1234-5678-abcd-ef0123456789",
"data": [
{
"s": "00700.HK",
"t": 1781672609632,
"p": "468.200",
"v": "12800",
"vw": "5992960.00",
"td": 1
}
]
}
每个字段的含义:
| 字段 | 含义 | 示例 |
|---|---|---|
s |
股票代码 | 00700.HK |
t |
成交时间戳(毫秒) | 1781672609632 |
p |
成交价格(港元) | 468.200 |
v |
成交量(股) | 12800 |
vw |
成交额(港元) | 5992960.00 |
td |
交易方向:0=默认,1=Buy,2=Sell | 1 |
注意 :ret: 200 是接口自定义的业务状态码,和HTTP状态码是两回事。即使HTTP返回200,也要检查 ret 字段是否为200,才能确认数据正常。
Step 4:把时间戳转成可读时间
返回的 t 字段是毫秒时间戳,需要转换才能看懂:
python
import requests
from datetime import datetime, timezone, timedelta
API_KEY = "YOUR_API_KEY_HERE"
HKT = timezone(timedelta(hours=8)) # 香港时间 UTC+8
url = "https://data.infoway.io/stock/batch_trade/00700.HK"
headers = {"apiKey": API_KEY}
data = requests.get(url, headers=headers, timeout=10).json()
trade = data["data"][0]
# 毫秒时间戳转香港时间
ts = datetime.fromtimestamp(trade["t"] / 1000, tz=HKT)
print(f"股票代码: {trade['s']}")
print(f"成交时间: {ts.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"成交价格: {trade['p']} HKD")
print(f"成交量: {int(trade['v']):,} 股")
print(f"成交额: {float(trade['vw']):,.2f} HKD")
print(f"方向: {'买入' if trade['td'] == 1 else '卖出' if trade['td'] == 2 else '未知'}")
输出示例:
股票代码: 00700.HK
成交时间: 2026-06-18 10:43:29
成交价格: 468.200 HKD
成交量: 12,800 股
成交额: 5,992,960.00 HKD
方向: 买入
Step 5:批量查询多只港股
单次请求最多支持100只股票,用逗号分隔代码即可:
python
import requests
from datetime import datetime, timezone, timedelta
API_KEY = "YOUR_API_KEY_HERE"
HKT = timezone(timedelta(hours=8))
# 港科技五大
codes = ["00700.HK", "09988.HK", "03690.HK", "01810.HK", "09618.HK"]
url = f"https://data.infoway.io/stock/batch_trade/{','.join(codes)}"
headers = {"apiKey": API_KEY}
resp = requests.get(url, headers=headers, timeout=10).json()
print(f"{'代码':12s} {'价格':>10s} {'成交量':>12s} {'方向':>6s}")
print("-" * 45)
for item in resp.get("data", []):
direction = "买入" if item["td"] == 1 else "卖出" if item["td"] == 2 else "-"
print(
f"{item['s']:12s} "
f"{float(item['p']):>10.3f} "
f"{int(item['v']):>12,} "
f"{direction:>6s}"
)
输出示例:
代码 价格 成交量 方向
---------------------------------------------
00700.HK 468.200 12,800 买入
09988.HK 86.250 8,400 卖出
03690.HK 178.300 23,600 买入
01810.HK 22.150 41,000 买入
09618.HK 134.600 6,200 买入
Step 6:获取K线数据
K线接口使用POST请求,支持1分钟到月线共多种周期。
接口地址:https://data.infoway.io/stock/v2/batch_kline
python
import requests
import json
API_KEY = "YOUR_API_KEY_HERE"
url = "https://data.infoway.io/stock/v2/batch_kline"
headers = {
"apiKey": API_KEY,
"Content-Type": "application/json"
}
# 请求参数
payload = {
"klineType": 8, # 8 = 日K线
"klineNum": 10, # 返回最近10根
"codes": "00700.HK"
}
resp = requests.post(url, headers=headers, data=json.dumps(payload), timeout=10).json()
# 解析K线数据
klines = resp["data"][0]["respList"]
print(f"{'时间':>22s} {'开盘':>8s} {'最高':>8s} {'最低':>8s} {'收盘':>8s} {'涨跌幅':>8s}")
print("-" * 72)
from datetime import datetime, timezone, timedelta
HKT = timezone(timedelta(hours=8))
for k in klines[-5:]: # 打印最近5根
ts = datetime.fromtimestamp(int(k["t"]), tz=HKT).strftime("%Y-%m-%d")
print(
f"{ts:>22s} "
f"{float(k['o']):>8.2f} "
f"{float(k['h']):>8.2f} "
f"{float(k['l']):>8.2f} "
f"{float(k['c']):>8.2f} "
f"{k['pc']:>8s}"
)
输出示例:
时间 开盘 最高 最低 收盘 涨跌幅
------------------------------------------------------------------------
2026-06-12 464.20 470.00 463.80 468.40 +0.17%
2026-06-13 468.00 471.20 466.60 469.80 +0.30%
2026-06-16 470.00 473.40 468.20 471.60 +0.38%
2026-06-17 471.60 474.00 469.00 472.80 +0.25%
2026-06-18 472.80 476.20 471.40 474.20 +0.30%
K线周期参数说明:
klineType |
周期 |
|---|---|
| 1 | 1分钟K |
| 2 | 5分钟K |
| 3 | 15分钟K |
| 4 | 30分钟K |
| 5 | 60分钟K |
| 8 | 日K |
| 9 | 周K |
| 10 | 月K |
五、新手最常踩的坑
❌ 坑1:非交易时间请求,以为接口有问题
非交易时间(如周末或节假日)调用实时行情接口 ,返回的是上一个交易日的收盘数据,t 字段的时间戳也会停留在那个时点。这是正常现象,不是接口故障。
❌ 坑2:没有检查 ret 字段就直接读 data
API返回的HTTP状态码是200,不代表业务成功。必须额外检查 ret 字段:
python
resp = requests.get(url, headers=headers).json()
# 错误写法(可能在 data 是 None 时崩溃)
price = resp["data"][0]["p"]
# 正确写法
if resp.get("ret") == 200 and resp.get("data"):
price = resp["data"][0]["p"]
else:
print(f"请求失败: {resp.get('msg')}")
❌ 坑3:港股代码格式写错
港股代码必须是五位数字 + .HK,前导零不能省略:
python
# ❌ 错误
"700.HK"
"700"
# ✅ 正确
"00700.HK"
"09988.HK"
"03690.HK"
对于不确定代码的股票,可以在港交所官网或主流财经平台查询,格式统一为五位数。
❌ 坑4:K线接口用了GET请求
K线接口是POST请求,不是GET。这是新手最常犯的错误之一:
python
# ❌ 错误
resp = requests.get(url, params=payload, headers=headers)
# ✅ 正确
import json
resp = requests.post(url, data=json.dumps(payload), headers=headers)
另外,POST请求必须在headers里指定 Content-Type: application/json,否则服务端无法正确解析请求体。
❌ 坑5:没有设置 timeout,遇到网络问题时程序卡死
每个请求都应该设置超时时间:
python
# 设置 10 秒超时,超时后抛出 requests.Timeout 异常
resp = requests.get(url, headers=headers, timeout=10)
生产环境建议同时处理异常:
python
try:
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()
data = resp.json()
except requests.Timeout:
print("请求超时,检查网络连接")
except requests.HTTPError as e:
print(f"HTTP错误: {e}")
except Exception as e:
print(f"未知错误: {e}")
六、接下来可以做什么?
跑通了基础接口之后,有几个方向可以进一步探索:
1. 接入 WebSocket 实时推送
如果你的应用需要毫秒级的价格更新,可以从REST轮询切换到WebSocket订阅,服务端会主动把每笔成交推送给你,不需要反复发请求。
2. 批量拉取历史K线
通过timestamp参数可以向前翻页,拉取数年的历史数据用于策略回测,日K不受时间限制。
3. 接入盘口数据
盘口(Order Book)接口提供十档买卖挂单,可以用于分析市场供需力量、计算买卖压力比等。
4. 扩展到其他市场
同一套接口结构同样适用于A股、美股、日本股票等市场,只需要换代码格式,不需要重写整套接入逻辑。
七、常见问题
港股API支持哪些股票?
主流的港股行情API覆盖香港联合交易所全部挂牌产品,包括主板股票(2000+只)、创业板、轮证(Warrant)、牛熊证(CBBC)以及恒生指数、恒生科技指数等主要指数,港股通标的也包含在内。
港股数据API的延迟大概是多少?
通过WebSocket订阅的实时行情,延迟通常在毫秒级(10-100ms)。REST API适合低频查询,延迟受网络和服务器负载影响,一般在几百毫秒到1秒内。如果对延迟极度敏感,应优先选择WebSocket。
可以免费试用吗?
多数商业港股行情API都提供免费试用期,注册后自动生效,无需绑定信用卡,可以在试用期间验证数据质量和接口稳定性,再决定是否付费。
一次可以查询多少只港股?
REST API通常支持单次查询100个产品。WebSocket订阅的数量上限取决于套餐,基础套餐一般在100-200只,专业套餐可达5000+只。
股票代码从哪里查?
港股代码统一格式为五位数字 + .HK,可以在港交所官网(hkex.com.hk)的股票代码查询页面检索,也可以在任意主流财经平台(东方财富、富途、老虎证券等)的港股页面找到对应代码。
历史K线数据可以追溯多久?
分钟级历史数据通常支持最近3年。日K线及以上周期不受时间限制,一般可以追溯到股票上市日期。具体以各数据服务商的说明为准。