港股API完全指南:新手如何快速接入港股实时行情数据

刚开始接触港股数据开发的朋友,常常会在第一步就卡住------不是代码写不出来,而是根本不知道从哪里找港股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 不正确或已过期,接口会返回 401403 错误。

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线及以上周期不受时间限制,一般可以追溯到股票上市日期。具体以各数据服务商的说明为准。