
Python查股票数据,先把问题拆成三块
很多人一听用Python查股票数据,脑子里先蹦出来的是代码、爬虫、数据库,觉得门槛高得吓人。把这件事翻译成大白话,其实就三步:你想查什么、数据从哪来、拿到手怎么用。想明白这三块,剩下的就是敲几行代码调接口的事,跟点外卖选地址、选菜品、等骑手送到没有本质区别。
真正劝退新手的不是Python本身,而是网上教程一上来就甩出几百行带类的工程代码,吓都吓跑了。查股票数据这件事,用最朴素的写法就能干成,先跑通再谈优化。
数据从哪来,免费的接口就够用
股票行情数据分两类来源。一类是交易所和券商提供的官方接口,稳定但通常要开户或付费;另一类是第三方开源数据接口,免费、够用、上手快,绝大多数个人查询场景都落在这一档。

国内用得最多的两个Python库是tushare和akshare。tushare需要注册拿token,老牌稳定,字段规整,适合做系统化的数据整理;akshare不需要token,装上就能拉数据,覆盖面广,股票、期货、基金、宏观数据一把抓。两个库的定位差异用一句话说清楚:tushare像精装修的连锁酒店,规矩多但省心;akshare像大型批发市场,东西全但要自己挑。
期货数据同样能查。akshare里有期货主力连续合约、每日行情、持仓排名这些接口,商品期货和金融期货都能覆盖。做期货研究的人经常忽略一件事:期货数据要特别留意合约换月带来的价格跳空,直接拿连续合约价格算收益率会失真,这是数据源选好之后第一个要处理的坑。
上手代码,三行把日线行情拉下来
先用akshare演示最基础的查法。装库就一条命令:
pip install akshare pandas
拉一只股票的日线行情,核心代码只有三行:
import akshare as ak
df = ak.stock_zh_a_hist(symbol="600519", period="daily", start_date="20240101", end_date="20241231", adjust="qfq")
print(df.head())
这段代码的意思是:告诉akshare我要600519这只票、日线级别、2024年全年、前复权处理,它就把数据整理成表格还给你。返回的df是pandas的DataFrame,你可以直接当Excel表用,筛日期、算涨跌幅、画图都行。
期货行情换个接口,逻辑一模一样:
fut = ak.futures_main_sina(symbol="RB0")
print(fut.tail())
RB0是螺纹钢主力连续合约。注意这里的adjust参数和期货的复权逻辑要分开理解,股票前复权是为了消除分红送股造成的价格断层,期货连续合约的跳空来自换月,两者成因不同,混为一谈会让回测结果严重偏离真实交易。
查数据最容易踩的三个坑
第一个坑是复权。 股票除权除息之后,价格会突然掉一块,不复权的数据算出来的收益率完全失真。做历史分析一律用前复权,做实时信号看盘用不复权,两套数据分开存,别混着用。
第二个坑是接口频率限制。 免费接口都有调用次数上限,一次性循环拉几千只股票,大概率被封或者报错。稳妥的做法是分批拉、加时间间隔、把拉下来的数据落地成CSV或数据库,下次直接用本地文件,别反复请求。数据是资产,落地一次反复用,这个习惯比写多花哨的代码都值钱。
第三个坑是字段含义。 同样叫成交额,有的接口单位是元,有的是万元;同样叫换手率,有的按流通股本算,有的按总股本算。拿到数据先看接口文档的字段说明,对着几只票手工核对一遍,比事后发现数量级错了再返工强得多。
数据拿到手,能干什么
查数据本身不是目的,目的是支撑判断。股票这边,拉完日线可以顺手算个20日均线和60日均线,看看当下价格站在哪条线上;算一下市盈率的历史分位,判断估值处在什么位置。期货这边,盯主力合约的价格和持仓量变化,持仓增价格涨和持仓减价格涨,背后的多空含义完全不同,这些拆开看才有信息量。
用pandas干这些事都是几行代码:df['ma20'] = df['收盘'].rolling(20).mean(),一行就把均线算出来了。rolling是滚动窗口的意思,翻译成人话就是“每20天算一次平均”,跟股票软件里画的那条线没有任何区别。
给普通人的实操建议
别贪多。先固定用akshare一个库,把股票日线和期货主力连续这两类数据拉明白、存明白,再考虑加tushare做交叉验证。代码从能跑就行开始,遇到报错先看报错信息的最后一行,那通常是真正的原因。数据落地成CSV,用Excel打开检查几行,肉眼核对永远是最便宜的风控手段。把查数据这件事做成每天十分钟的固定动作,比收藏一百篇教程有用得多。