怎样通过api获取a股的数据和实时数据
摘要:
通过免费或付费API获取A股实时数据,免费渠道有延迟限制,付费接口更稳定。股票和期货交易者需根据策略频率和成本选择数据源,注意频率限制与字段缺失。

为什么你需要关心A股数据的获取方式
做股票和期货交易,数据是粮食。没有数据,再好的策略也是空谈。很多人盯着屏幕手动记价格,或者用券商软件看看分时图,这种玩法在2024年已经落后了。量化交易、自动化盯盘、甚至只是想写个脚本提醒自己某只股票到了买点,都需要通过API把数据拿到自己手里。
API就是程序之间的传话筒。你写一段代码,向数据提供方的服务器发个请求,对方把股票代码、当前价格、成交量这些信息打包成JSON格式扔回来。整个过程不需要打开任何软件界面,几毫秒就能完成。

免费API能用吗 有什么坑
市面上有不少免费接口,tushare、akshare、baostock是散户圈子里提到最多的三个。它们本质上都是对公开数据的二次封装。
tushare老版本免费,新版本搞了积分制。想拿实时数据,积分门槛不低。akshare完全免费,从新浪、东方财富这些网站抓数据,覆盖股票、期货、期权。缺点也明显:新浪的实时接口有15分钟延迟,东方财富的接口偶尔会变,今天能用明天可能就报错。baostock只有历史数据,没有实时行情。
免费接口最大的问题不是慢,是不稳定。你写个网格交易策略,依赖实时价格触发买卖,结果接口突然返回空值,程序卡在那里不动,错过止损点,亏的是真金白银。
付费API到底贵不贵
付费接口分两个梯队。
第一梯队是券商自己提供的。如果你在某个券商开户,达到一定资产门槛,可以申请开通level-2行情接口。这种接口直接来自交易所,延迟在毫秒级,包含十档盘口、逐笔成交。缺点是需要编程对接,而且不同券商的接口协议不一样,换券商就得重写代码。
第二梯队是第三方数据服务商。聚宽、米筐、万得这些,提供标准化的RESTful API或者WebSocket推送。聚宽的JQData按年收费,个人版几千块,包含股票、期货、基金数据。米筐的RQData类似。万得最贵,机构用得最多。
对于做期货日内交易的人来说,WebSocket推送比轮询API更合适。轮询是你每隔几秒问一次服务器“现在价格多少”,WebSocket是服务器主动把每一笔成交推给你。后者延迟更低,但需要保持长连接,对网络稳定性要求高。
一个最小可用的Python示例
用akshare获取A股实时行情,代码短到离谱。
import akshare as ak
# 获取所有A股实时行情
df = ak.stock_zh_a_spot_em()
print(df[['代码', '名称', '最新价', '涨跌幅', '成交量']].head())
# 获取单只股票的历史K线
df_hist = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20240101", end_date="20241231")
print(df_hist.tail())
这段代码跑通只需要一行安装命令pip install akshare。注意stock_zh_a_spot_em拉的是东方财富的全市场快照,一次返回几千行,不要频繁调用,否则IP会被封。
期货数据用akshare也能拿。ak.futures_zh_spot获取国内期货实时行情,ak.futures_main_sina获取主力合约连续数据。
实时数据到底有多实时
这个问题决定你的策略类型。
交易所发布的原始行情分两种:快照和逐笔。快照每3秒一次,包含当前买卖五档和最新价。逐笔是每一笔成交都推送,数据量巨大。
免费接口给你的所谓“实时”,绝大多数是快照数据,而且经过中间商缓存。新浪接口延迟15分钟是公开的秘密,东方财富的接口快一些,大概3到5秒。真正毫秒级的实时数据,只有交易所直连或者券商level-2接口能给。
做趋势跟踪的,延迟几秒无所谓。做高频套利的,延迟超过50毫秒策略就失效了。先想清楚自己的策略需要多快的数据,再决定花多少钱。
期货数据获取的特殊之处
期货和股票不一样。股票只有沪深两个交易所,期货有上期所、大商所、郑商所、中金所、广期所。每个交易所的数据格式、合约代码规则都不同。
主力合约会换月。螺纹钢2405合约到期后,主力变成2410。你的代码如果写死了合约代码,换月那天策略就崩了。处理方法是订阅主力连续合约,或者自己写规则判断持仓量最大的合约。
夜盘数据别忽略。国内期货有夜盘,晚上9点到次日凌晨2点半。很多免费接口夜盘数据更新不及时,做夜盘策略的要特别注意。
怎么选适合自己的数据方案
三个维度:频率、预算、技术能力。
手动交易偶尔看看行情的,用akshare写个脚本,每天早上跑一次,把关注列表的股票价格输出到Excel,够用了。
做分钟级策略的,考虑聚宽或者米筐的付费接口,一年几千块,换来稳定的数据和技术支持。
做高频或者机构级别的,直接找券商开通level-2,或者买万得的API。这条路成本高,但数据质量和延迟是免费接口没法比的。
不要一上来就追求最贵最全的数据。先用免费接口把策略逻辑跑通,确认能赚钱,再升级数据源。很多人反着来,花大钱买数据,策略却一直亏,本末倒置。
数据拿到之后做什么
拿到数据只是第一步。把数据存到本地数据库,用pandas做清洗,计算技术指标,回测策略,这些才是真正花时间的地方。
实时数据流进来之后,需要一个事件驱动的框架来处理。最简单的可以用while循环加time.sleep,复杂一点的用asyncio或者消息队列。期货CTP接口就是典型的事件驱动,用C++写的底层,Python通过cython封装调用。
数据频率越高,对代码效率要求越高。Python处理tick数据很吃力,考虑用numpy向量化操作,或者把核心逻辑用C++重写。
最后提醒几个坑
接口调用频率限制。免费接口通常限制每分钟调用次数,超了直接封IP。加个time.sleep,或者用缓存减少重复请求。
数据字段缺失。免费接口的返回结果里,某些字段可能是空值或者0。写代码时要加异常处理,不能假设每个字段都有值。
交易日历。A股和期货的交易日历不一样,春节、国庆休市安排每年都变。硬编码日期迟早出错,用akshare的tool_trade_date_hist_sina获取官方交易日历。
复权问题。股票除权除息后价格会跳空,回测时必须用复权数据。akshare的stock_zh_a_hist默认返回不复权数据,需要手动设置adjust="qfq"或者adjust="hfq"。
数据是交易的地基。地基不稳,楼盖得越高摔得越惨。花点时间把数据获取这件事搞扎实,后面策略开发会顺很多。
声明
转载声明:欢迎分享本文,转载请注明出处!
点击复制: