
主流python股票数据接口对比
获取股票历史行情、实时行情、基本面数据是量化交易的第一步。python生态中,tushare、akshare、baostock、yfinance、pandas-datareader等接口各有侧重。tushare老牌稳定但积分门槛逐年提高,akshare完全免费且覆盖期货、期权、基金,baostock无需注册但仅限A股。选择接口需考虑数据频率、字段完整性、更新延迟和调用限制。
tushare pro
tushare pro需要注册并获取token,积分制下部分接口(如分钟线、实时tick)要求较高积分。基础日线数据对积分要求低,适合个人投资者。
import tushare as ts
ts.set_token('your_token')
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20241231')
print(df.head())
tushare的复权数据通过adj_factor接口计算,分红送股数据齐全。缺点是积分获取需要邀请或付费,高频调用易被封禁。

akshare
akshare无需token,直接调用函数即可返回pandas DataFrame。股票、期货、外汇、宏观数据均包含。股票日线接口为stock_zh_a_hist,期货主力连续合约为futures_main_sina。
import akshare as ak
# 股票日线
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20240101", end_date="20241231", adjust="qfq")
# 期货主力连续
df_fut = ak.futures_main_sina(symbol="RB0", start_date="20240101", end_date="20241231")
akshare数据源来自新浪、东财、同花顺等公开页面,偶发反爬导致请求失败,需增加重试机制。
baostock
baostock提供免费A股历史K线,包含复权因子、财务数据。登录后查询,无需积分。
import baostock as bs
lg = bs.login()
rs = bs.query_history_k_data_plus("sh.600000", "date,code,open,high,low,close,volume,amount,adjustflag", start_date='2024-01-01', end_date='2024-12-31', frequency="d", adjustflag="2")
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
df = pd.DataFrame(data_list, columns=rs.fields)
bs.logout()
baostock不提供实时行情,适合回测历史数据。
期货数据接口选择
期货数据分为历史行情和实时tick。历史数据可用akshare的futures_zh_daily_sina或tushare的fut_daily。实时tick需要CTP接口或vnpy、pyctp等封装。
CTP接口
上期技术CTP是期货公司主流交易接口,通过python的ctpwrapper或vnpy连接。需要期货账户和经纪商授权。
from vnpy_ctp import CtpGateway
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.connect({'用户名':'your_id','密码':'your_pwd','经纪商代码':'9999','交易服务器':'tcp://...','行情服务器':'tcp://...','产品名称':'','授权编码':''}, 'CTP')
CTP接口延迟低,适合实盘交易。回测可用akshare或tushare的历史数据。
数据频率与清洗
日线数据可直接使用,分钟线需注意时间戳对齐。akshare的分钟线接口stock_zh_a_minute返回近期数据,历史分钟线需付费或自行合成。期货tick数据用ctp的onTick回调保存。
量化回测数据准备
回测需要复权价格、交易日历、涨跌停价格。tushare的pro_bar接口支持前复权、后复权。akshare的stock_zh_a_hist通过adjust参数控制。
# tushare复权
from tushare.pro import client
df = ts.pro_bar(ts_code='000001.SZ', adj='qfq', start_date='20240101', end_date='20241231')
# akshare复权
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20240101", end_date="20241231", adjust="hfq")
交易日历可用tushare的trade_cal或akshare的tool_trade_date_hist_sina。涨跌停价格需根据前收盘价计算,ST股票幅度不同。
实时行情推送
实时行情可用新浪财经接口或券商API。akshare的stock_zh_a_spot_em返回东财实时快照,延迟约数秒。期货实时行情用CTP的行情前置。
# akshare实时快照
df = ak.stock_zh_a_spot_em()
print(df[df['代码']=='000001'])
高频策略需要tick级数据,建议使用CTP或券商Level-2接口。python中可用pyzmq接收CTP行情并写入数据库。
数据存储方案
小规模数据存CSV或SQLite,大规模用MySQL、PostgreSQL、ClickHouse。tick数据推荐Parquet格式列式存储。
import pandas as pd
df.to_parquet('tick_data.parquet', engine='pyarrow')
ClickHouse适合存储千万级tick,查询速度快。InfluxDB适合时序数据但python生态稍弱。
接口稳定性与反爬
akshare依赖网页解析,频繁请求可能被封IP。建议设置请求间隔、使用代理、缓存数据。tushare有频率限制,每分钟不超过500次。baostock稳定但数据更新慢。
import time
import akshare as ak
for code in ['000001','000002']:
try:
df = ak.stock_zh_a_hist(symbol=code, period="daily", start_date="20240101", end_date="20241231")
except Exception as e:
print(f"{code} failed: {e}")
time.sleep(1.5)
备用方案:同时使用两个接口,一个失败时切换另一个。
个人量化回测:akshare + baostock组合,免费且数据全。
实盘期货交易:CTP + vnpy,低延迟。
基本面选股:tushare pro,财务字段完整。
分钟级回测:tushare积分或购买专业数据。
实时股票监控:akshare的东财快照或券商API。
选择接口时测试数据准确性,对比不同来源的收盘价和成交量。复权计算需一致,避免回测偏差。