东方财富数据技能
通过东方财富的公开 HTTP API 访问 A股(中国A股)市场数据。无需 API 密钥,也无需注册。
可用 API
1. K线(日K线数据)
GET https://push2his.eastmoney.com/api/qt/stock/kline/get
Parameters:
secid = {market}.{code} # 0.{code} 为深市, 1.{code} 为沪市
fields1 = f1,f2,f3,f4,f5,f6
fields2 = f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61
klt = 101 # 101=日线, 102=周线, 103=月线
fqt = 1 # 1=前复权, 2=后复权
end = 20261231
lmt = 120 # 记录条数
返回的 data.klines 数组中每行为:date,open,close,high,low,volume,amount,amplitude,change_pct,change_amt,turnover
市场代码:
- 上海(SH):secid=1.{code}(例如 1.600519 为贵州茅台)
- 深圳(SZ):secid=0.{code}(例如 0.000858 为五粮液)
- 创业板:secid=0.{code}(例如 0.300750 为宁德时代)
- 科创板:secid=1.{code}(例如 1.688981)
2. 实时行情
GET https://push2.eastmoney.com/api/qt/stock/get
Parameters:
secid = {market}.{code}
fields = f43,f44,f45,f46,f47,f48,f50,f51,f52,f55,f57,f58,f116,f117,f162,f167,f170
关键字段:f43=最新价, f44=最高, f45=最低, f46=开盘, f47=成交量, f48=成交额, f116=总市值, f117=流通市值, f162=市盈率, f167=市净率
3. 股票列表(全部A股列表)
GET https://push2.eastmoney.com/api/qt/clist/get
Parameters:
pn = 1 # 页码
pz = 5000 # 每页条数
fs = m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23 # A股过滤条件
fields = f12,f14,f2,f3,f4,f5,f6,f7,f15,f16,f17,f18
字段含义:f12=代码, f14=名称, f2=最新价, f3=涨跌幅, f4=涨跌额, f5=成交量, f6=成交额
4. 财务摘要
GET https://push2.eastmoney.com/api/qt/stock/get
Parameters:
secid = {market}.{code}
fields = f162,f167,f164,f168,f170,f171,f173,f183,f184,f185,f186,f187
字段含义:f162=市盈率(TTM), f167=市净率, f164=净资产收益率, f168=营业总收入, f170=净利润, f173=毛利率
5. 按名称/代码搜索股票
GET https://searchapi.eastmoney.com/api/suggest/get
Parameters:
input = {keyword} # 股票名称或代码片段
type = 14
count = 5
使用模式
import requests
def get_kline(code, market=1, days=60):
"""Fetch daily K-line data. market: 0=SZ, 1=SH"""
url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
params = {
"secid": f"{market}.{code}",
"fields1": "f1,f2,f3,f4,f5,f6",
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
"klt": 101, "fqt": 1, "end": "20261231", "lmt": days
}
r = requests.get(url, params=params)
data = r.json()["data"]
return data["name"], data["klines"]
# Example: 贵州茅台 (600519, SH)
name, klines = get_kline("600519", market=1, days=30)
for k in klines[-3:]:
print(k)
注意事项
- 所有 API 均为公开接口,无需身份验证
- 交易时段(中国标准时间 9:30-15:00)内数据为实时数据
- 金额单位为人民币(CNY)
- 成交量单位:手(每手 100 股)
⚠️ 限流(重要)
如果请求发送过快,东方财富 API 会直接断开连接(RemoteDisconnected)。这是失败的首要原因。
强制规则:
- 每个请求之间加入 1 秒延时(
time.sleep(1)) - 批量操作(例如获取 10 只股票的数据)使用 1.5 秒延时
- 始终为请求封装重试逻辑(3 次重试,指数退避)
- 如果
push2.eastmoney.com对 ETF 返回空响应,请改用 sina-quote 技能
重试模式示例:
import time
import requests
def fetch_with_retry(url, params, max_retries=3):
for i in range(max_retries):
try:
r = requests.get(url, params=params, timeout=10)
return r.json()
except Exception as e:
if i < max_retries - 1:
time.sleep(2 ** i) # 1s, 2s, 4s
else:
raise e
return None
已知限制:
push2.eastmoney.com/api/qt/stock/get对 ETF 返回空响应(请改用 sina-quote)- 超过 5 只股票的批量请求常会触发连接断开——务必加入延时
微信扫一扫