在进行A股投资分析、量化研究或构建自己的股票数据平台时,最基础的一步就是获取上市公司的基本面数据和股价信息。
本文将介绍如何通过 Infoway API的股票行情 API 查询 A 股上市公司的公司基本面(如总股本、每股收益、每股净资产等),并为后续获取实时行情数据打下基础。
一、A股基本面数据查询
Infoway 提供了统一的基础数据接口 /common/basic/symbols/info,可用于查询美股、港股、A股等多市场上市公司的基础信息。
对于A股用户,只需指定参数 type=STOCK_CN,即可获取沪深两市的公司基本面数据。
1.1 接口地址
https://data.infoway.io/common/basic/symbols/info
1.2 请求头参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| apiKey | String | 是 | 您在 Infoway 控制台中获取的 API Key |
1.3 请求参数说明
调用该接口时,需要在请求参数中指定目标股票的代码以及市场类型。
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| type | String | 是 | 市场类型(A股用 STOCK_CN) | STOCK_CN |
| symbols | String | 是 | 股票代码,支持多个以逗号分隔 | 000001.SZ,000002.SZ |
1.4 基本面请求示例
以下示例展示了如何查询两只A股股票的基本面信息(平安银行与万科A):
GET https://data.infoway.io/common/basic/symbols/info?type=STOCK_CN&symbols=000001.SZ,000002.SZ
Header:
apiKey: your_api_key_here
# 申请API KEY: www.infoway.io
1.5 返回结果说明
API返回的数据为一个JSON对象,其中包含股票的基础属性、财务指标、以及所处板块信息。
{
"ret": 200,
"msg": "success",
"data": [
{
"symbol": "000001.SZ",
"market": "CN",
"name_cn": "平安银行",
"exchange": "SZSE",
"currency": "CNY",
"lot_size": 100,
"total_shares": 19405918198,
"circulating_shares": 19405762053,
"eps": "2.29",
"bps": "22.47",
"dividend_yield": "0.96",
"board": "SZMainConnect"
},
{
"symbol": "000002.SZ",
"market": "CN",
"name_cn": "万科A",
"exchange": "SZSE",
"currency": "CNY",
"lot_size": 100,
"total_shares": 11930709471,
"circulating_shares": 9724196533,
"eps": "-4.15",
"bps": "16.49",
"dividend_yield": "0",
"board": "SZMainConnect"
}
]
}
1.6 字段解析与常见用途
| 字段名 | 含义 | 示例值 | 说明 |
|---|---|---|---|
| symbol | 股票代码 | 000001.SZ | 用于后续行情接口调用 |
| name_cn | 公司简称(中文) | 平安银行 | |
| exchange | 交易所 | SZSE | SZSE=深交所,SSE=上交所 |
| total_shares | 总股本 | 19405918198 | 可用于估算市值 |
| circulating_shares | 流通股本 | 19405762053 | 与成交量结合分析流动性 |
| eps / eps_ttm | 每股收益 / 滚动每股收益 | 2.29 / 2.25 | 衡量盈利能力 |
| bps | 每股净资产 | 22.47 | 衡量资产价值 |
| dividend_yield | 股息率 | 0.96 | 投资回报指标 |
| board | 板块类别 | SZMainConnect | 表示深市主板(互联互通) |
1.7 快速实战:Python调用示例
如果你正在使用Python进行数据采集或量化分析,可以用以下几行代码完成A股基本面数据的拉取:
import requests
url = "https://data.infoway.io/common/basic/symbols/info"
headers = {"apiKey": "your_api_key_here"}
params = {
"type": "STOCK_CN",
"symbols": "000001.SZ,000002.SZ"
}
# 申请API KEY: www.infoway.io
resp = requests.get(url, headers=headers, params=params)
data = resp.json()
print(data)
二、查询A股实时K线数据(Candlestick)
在了解了A股上市公司的基本面信息之后,我们通常还需要获取股价的时间序列数据,例如分时走势、日K线、周K线等,用于绘制走势图、技术分析或回测策略。
Infoway 提供了统一的 K线查询接口,可覆盖股票、加密货币、外汇、能源、期货、贵金属等多个市场。
对于A股行情,使用的接口路径是:https://data.infoway.io/stock/v2/batch_kline
该接口支持一次查询多只股票的实时或历史K线,返回的结果中包含开盘价、收盘价、最高价、最低价、成交量等核心字段。
2.1 接口基本信息
| 项目 | 内容 |
|---|---|
| 接口用途 | 获取股票(含A股)实时或最近一段时间的 K 线数据 |
| 请求方式 | POST |
| 接口地址 | https://data.infoway.io/stock/v2/batch_kline |
| 请求头 | 需携带有效的 apiKey |
2.2 请求参数说明
K线接口的请求参数通过 JSON 格式 传入 Request Body,可灵活控制K线周期与数量。
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| klineType | int | 是 | K线类型。1: 1分钟K;2: 5分钟K;3: 15分钟K;4: 30分钟K;5: 1小时K;6: 2小时K;7: 4小时K;8: 日K;9: 周K;10: 月K;11: 季K;12: 年K | 8 |
| klineNum | int | 是 | 查询K线数量(单产品最多500根) | 100 |
| codes | String | 是 | 股票代码,多个以逗号分隔 | 000001.SZ,000002.SZ |
| timestamp | long | 否 | 时间戳(秒)。用于查询截止某一时刻之前的历史数据。不传则默认获取最近的K线 | 1727007864 |
2.3 K线请求示例
下面示例展示如何通过Python请求A股的日K线数据(例如平安银行与万科A最近100天的K线):
import requests
url = "https://data.infoway.io/stock/v2/batch_kline"
headers = {"apiKey": "your_api_key_here"}
# 申请API KEY: www.infoway.io
payload = {
"klineType": 8, # 日K
"klineNum": 100, # 查询最近100根K线
"codes": "000001.SZ,000002.SZ"
}
resp = requests.post(url, headers=headers, json=payload)
data = resp.json()
print(data)
2.4 返回示例
接口返回的JSON数据结构如下,每个标的s对应一个K线数组(respList):
{
"ret": 200,
"msg": "success",
"data": [
{
"s": "000001.SZ",
"respList": [
{
"t": "1751372340",
"h": "12.85",
"o": "12.70",
"l": "12.60",
"c": "12.75",
"v": "3429000",
"pc": "0.32%",
"pca": "0.04"
},
{
"t": "1751285940",
"h": "12.80",
"o": "12.75",
"l": "12.50",
"c": "12.65",
"v": "4152000",
"pc": "-0.16%",
"pca": "-0.02"
}
]
}
]
}
2.5 字段说明
| 字段名 | 含义 | 示例值 | 说明 |
|---|---|---|---|
s |
股票代码 | 000001.SZ | 查询对象 |
t |
时间戳(秒) | 1751372340 | K线对应的时间点 |
o |
开盘价 | 12.70 | |
h |
最高价 | 12.85 | |
l |
最低价 | 12.60 | |
c |
收盘价 | 12.75 | |
v |
成交量 | 3429000 | 单位:股 |
pc |
涨跌幅 | 0.32% | 相较上一根K线的变化百分比 |
pca |
涨跌额 | 0.04 | 收盘价差值(绝对数) |
三、A股实时盘口查询教程
在量化交易或行情展示系统中,除了K线数据之外,实时买卖盘口(Order Book / Depth) 是非常关键的一类行情数据。
盘口信息反映了市场上买卖双方的即时挂单情况,可用于判断市场流动性、短期供需关系以及价格压力区间。
Infoway 提供统一的盘口数据接口,覆盖股票、加密货币、外汇、能源、期货等市场。
对于A股产品,我们使用以下路径:https://data.infoway.io/stock/batch_depth/{codes}
该接口可同时查询多只股票的实时买盘与卖盘前五档至十档挂单数据。
3.1 接口基本信息
| 项目 | 内容 |
|---|---|
| 接口用途 | 获取 A 股实时买卖盘口(Depth)数据 |
| 请求方式 | GET |
| 接口地址 | https://data.infoway.io/stock/batch_depth/{codes} |
| 请求头 | 需携带 apiKey |
3.2 请求参数说明
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
codes |
String | 是 | 查询的股票代码,多个以逗号分隔 | 000001.SZ,000002.SZ |
3.3 请求示例
以下是一个获取平安银行(000001.SZ)和宁德时代(300750.SZ)盘口数据的HTTP请求示例:
import requests
url = "https://data.infoway.io/stock/batch_depth/000001.SZ,300750.SZ"
headers = {"apiKey": "your_api_key_here"}
# 申请API KEY: www.infoway.io
resp = requests.get(url, headers=headers)
data = resp.json()
print(data)
3.4 返回示例
{
"ret": 200,
"msg": "success",
"data": [
{
"s": "002594.SZ",
"t": 1747378802012,
"a": [
["389.17", "389.45", "389.50", "389.57", "389.69"],
["60", "6", "1", "1", "8"]
],
"b": [
["389.16", "389.09", "389.05", "389.02", "389.01"],
["6", "1", "1", "1", "10"]
]
}
]
}
3.5 盘口返回字段说明
| 字段名 | 含义 | 示例值 | 说明 |
|---|---|---|---|
s |
股票代码 | 002594.SZ |
查询对象 |
t |
时间戳(毫秒) | 1747378802012 |
最新盘口时间 |
a |
卖盘(Ask) | [["389.17","389.45"],["60","6"]] |
卖方报价及挂单数量 |
b |
买盘(Bid) | [["389.16","389.09"],["6","1"]] |
买方报价及挂单数量 |
其中:
a[0]为卖盘价格数组(从低到高)a[1]为对应的挂单数量数组(单位:股)b[0]为买盘价格数组(从高到低)b[1]为对应的挂单数量数组(单位:股)
四、WebSocket获取A股实时行情
通过 WebSocket 实时订阅 A股的逐笔成交、盘口(Depth)、K线(Kline) 等数据。
该接口支持毫秒级推送延迟,适合高频交易、行情监控、量化分析等实时场景。
4.1 订阅地址
wss://data.infoway.io/ws?business=stock&apikey=YourAPIKey
4.2 订阅指令说明
WebSocket 建立连接后,通过发送指定格式的 JSON 请求来订阅不同类型的数据。
| 功能 | 指令 code | 请求示例 | 说明 |
|---|---|---|---|
| 实时成交明细 | 10000 |
{ "code":10000, "data": {"codes":"600519.SH"} } |
订阅指定股票的逐笔成交 |
| 实时盘口 | 10003 |
{ "code":10003, "data": {"codes":"600519.SH"} } |
订阅指定股票的买卖十档 |
| 实时K线 | 10006 |
{ "code":10006, "data": {"arr":[{"type":1,"codes":"600519.SH"}]} } |
订阅指定周期的K线 |
| 心跳包 | 10010 |
{ "code":10010 } |
定期发送心跳维持连接 |
4.3 Python代码示例
import json
import time
import schedule
import threading
import websocket
from loguru import logger
# 申请API KEY: www.infoway.io
class WebsocketExample:
def __init__(self):
self.session = None
self.ws_url = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey"
self.reconnecting = False
self.is_ws_connected = False # 添加连接状态标志
def connect_all(self):
"""建立WebSocket连接并启动自动重连机制"""
try:
self.connect(self.ws_url)
self.start_reconnection(self.ws_url)
except Exception as e:
logger.error(f"Failed to connect to {self.ws_url}: {str(e)}")
def start_reconnection(self, url):
"""启动定时重连检查"""
def check_connection():
if not self.is_connected():
logger.debug("Reconnection attempt...")
self.connect(url)
# 使用线程定期检查连接状态
schedule.every(10).seconds.do(check_connection)
def run_scheduler():
while True:
schedule.run_pending()
time.sleep(1)
threading.Thread(target=run_scheduler, daemon=True).start()
def is_connected(self):
"""检查WebSocket连接状态"""
return self.session and self.is_ws_connected
def connect(self, url):
"""建立WebSocket连接"""
try:
if self.is_connected():
self.session.close()
self.session = websocket.WebSocketApp(
url,
on_open=self.on_open,
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close
)
# 启动WebSocket连接(非阻塞模式)
threading.Thread(target=self.session.run_forever, daemon=True).start()
except Exception as e:
logger.error(f"Failed to connect to the server: {str(e)}")
def on_open(self, ws):
"""WebSocket连接建立成功后的回调"""
logger.info(f"Connection opened")
self.is_ws_connected = True # 设置连接状态为True
try:
# 发送实时成交明细订阅请求
trade_send_obj = {
"code": 10000,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": "BTCUSDT"}
}
self.send_message(trade_send_obj)
# 不同请求之间间隔一段时间
time.sleep(5)
# 发送实时盘口数据订阅请求
depth_send_obj = {
"code": 10003,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": "BTCUSDT"}
}
self.send_message(depth_send_obj)
# 不同请求之间间隔一段时间
time.sleep(5)
# 发送实时K线数据订阅请求
kline_data = {
"arr": [
{
"type": 1,
"codes": "BTCUSDT"
}
]
}
kline_send_obj = {
"code": 10006,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": kline_data
}
self.send_message(kline_send_obj)
# 启动定时心跳任务
schedule.every(30).seconds.do(self.ping)
except Exception as e:
logger.error(f"Error sending initial messages: {str(e)}")
def on_message(self, ws, message):
"""接收消息的回调"""
try:
logger.info(f"Message received: {message}")
except Exception as e:
logger.error(f"Error processing message: {str(e)}")
def on_close(self, ws, close_status_code, close_msg):
"""连接关闭的回调"""
logger.info(f"Connection closed: {close_status_code} - {close_msg}")
self.is_ws_connected = False # 设置连接状态为False
def on_error(self, ws, error):
"""错误处理的回调"""
logger.error(f"WebSocket error: {str(error)}")
self.is_ws_connected = False # 发生错误时设置连接状态为False
def send_message(self, message_obj):
"""发送消息到WebSocket服务器"""
if self.is_connected():
try:
self.session.send(json.dumps(message_obj))
except Exception as e:
logger.error(f"Error sending message: {str(e)}")
else:
logger.warning("Cannot send message: Not connected")
def ping(self):
"""发送心跳包"""
ping_obj = {
"code": 10010,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a"
}
self.send_message(ping_obj)
# 使用示例
if __name__ == "__main__":
ws_client = WebsocketExample()
ws_client.connect_all()
# 保持主线程运行
try:
while True:
schedule.run_pending()
time.sleep(1)
except KeyboardInterrupt:
logger.info("Exiting...")
if ws_client.is_connected():
ws_client.session.close()
4.4 推送数据格式
成交明细(code = 10000)
{
"s": "600519.SH",
"t": 1747382976831,
"p": "1498.50",
"v": "100",
"bs": "B"
}
| 字段 | 类型 | 描述 |
|---|---|---|
s |
String | 股票代码 |
t |
Long | 成交时间戳(毫秒) |
p |
String | 成交价 |
v |
String | 成交量 |
bs |
String | 买卖方向(B=买,S=卖) |
盘口数据(code = 10003)
{
"s": "600519.SH",
"t": 1747382976831,
"a": [["1498.6","1498.7","1498.8"],["200","300","400"]],
"b": [["1498.5","1498.4","1498.3"],["100","150","180"]]
}
K线数据(code = 10006)
{
"s": "600519.SH",
"t": 1747382976831,
"o": "1495.0",
"h": "1500.0",
"l": "1490.0",
"c": "1498.5",
"v": "123400"
}
更多接入方法请查看: