如何用 Python 轻松搞定量化交易数据获取?一个免费库打通四大金融市场
【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手!🚀🚀🚀项目地址: https://gitcode.com/gh_mirrors/ef/efinance
做量化交易的第一道坎,往往不是策略写不出来,而是数据不知道从哪里拿。说句得罪人的实话:量化交易数据获取本该是整套流程里最简单的一环,却劝退了最多新手。
我第一次搭交易系统时就栽在这里:想同时盯股票和基金,先注册了两个数据服务商的账号,一个要配 API 密钥,另一个返回全英文字段,还得写脚本做字段映射;等想把债券、期货也接进来时,我已经在四份风格迥异的文档里晕头转向。一周过去,策略一行没写,光在跟数据格式搏斗。
后来我遇到 efinance 这个开源库,才意识到这件事本可以不这么痛苦。
一个库,给四大金融市场统一的数据入口 🎯
efinance 是免费、开源的 Python 库,基于东方财富网的数据源,把股票、基金、债券、期货四类金融数据封装成风格一致的 API。最打动我的一点:不需要注册、不需要密钥、不需要理解底层接口,装好就能用——相当于一套开箱即用的免费金融数据接口。
安装只需一条命令:
pip install efinance然后,三行代码就能用 Python 获取股票历史数据,比如贵州茅台二十多年的日 K 线:
import efinance as ef # 获取贵州茅台的历史日 K 线,默认返回前复权数据 stock_df = ef.stock.get_quote_history('600519') print(f'共 {len(stock_df)} 行记录') print(stock_df[['日期', '开盘', '收盘', '涨跌幅']].tail(3))返回的是规整的 pandas DataFrame,日期、开高低收、成交量、成交额、涨跌幅、换手率等常用列一应俱全,拿到就能直接进 pandas 做计算。它还支持传入代码列表一次批量拉取——传列表时返回一个以代码为键的字典。
"换一家数据源就要重学一套接口"的体验,在这里被统一掉了。
实战主线:用 efinance 搭一个迷你数据看板
光看单函数没感觉,下面用一个小项目串起完整流程:做一个覆盖四大金融市场的迷你看板,体验一遍量化交易数据获取的真实节奏。
看板核心代码只有十几行:
import efinance as ef # 1. 股票:贵州茅台今年以来的日 K 线 stock = ef.stock.get_quote_history('600519', beg='2026-01-01') # 2. 基金:白酒指数基金的历史净值 fund = ef.fund.get_quote_history('161725') # 3. 债券:全市场可转债实时行情(取前 5 行演示) bond = ef.bond.get_realtime_quotes().head(5) # 4. 期货:先取全市场行情,用第一个合约的行情 ID 再取历史数据 futures_id = ef.futures.get_realtime_quotes().iloc[0]['行情ID'] futures = ef.futures.get_quote_history(futures_id) # 顺手算个 5 日均线,验证数据可直接进入分析流程 stock['MA5'] = stock['收盘'].rolling(5).mean() print('股票最新收盘:', stock['收盘'].iloc[-1]) print('基金最新净值:', fund['单位净值'].iloc[-1]) print('债券样例:', bond[['债券代码', '债券名称', '涨跌幅']]) print('期货最新收盘:', futures['收盘'].iloc[-1])运行后,四个市场的关键数据一次性汇总到控制台。全程没有注册账号、没有配置密钥,从安装到跑通不到十分钟。拿到 DataFrame 之后,画 K 线、算指标、喂给机器学习模型,都交给熟悉的 pandas 生态即可。
3 个必须避开的坑
用了几个月,我踩过几个印象深刻的坑,提前帮你绕开:
坑一:默认拉全量历史数据,循环请求容易触发限流
get_quote_history默认从 1900 年拉到今天,动辄几千行。如果你在循环里对几十只股票各拉一次全量,很容易被数据源限流,表现为偶发超时或空返回。
应对有两招:一是用beg、end参数按需缩小时间范围;二是加一层本地缓存,避免重复请求:
import os import time import pandas as pd def fetch_with_cache(code, cache_dir='./data'): """本地缓存 6 小时,减少重复请求""" path = os.path.join(cache_dir, f'{code}.csv') os.makedirs(cache_dir, exist_ok=True) if os.path.exists(path) and time.time() - os.path.getmtime(path) < 6 * 3600: return pd.read_csv(path) df = ef.stock.get_quote_history(code) df.to_csv(path, index=False) return df坑二:频率和复权参数没搞清楚,算出的指标对不上
get_quote_history有两个常用参数:klt控制频率,fqt控制复权方式。我最初用日线参数去取分钟级数据,返回空表,排查半天才发现是频率代码写错了。常用频率对照如下:
| klt 值 | 含义 | 典型用途 |
|---|---|---|
| 101 | 日线 | 趋势分析、回测 |
| 102 | 周线 | 中期波段 |
| 103 | 月线 | 资产配置 |
| 1 / 5 / 15 / 30 / 60 | 对应分钟线 | 日内交易 |
fqt取值为 1 前复权、2 后复权、3 不复权。回测建议用默认的前复权,研究分红除权才需要不复权数据。
坑三:批量请求没有错误兜底,一次网络抖动拖垮整个脚本
数据源偶尔抽风是常态,批量拉数时一定要给单次失败留退路。简单的做法是把重试逻辑包进一个函数,失败时按指数退避等待再试,连续失败就返回空表,而不是让整个程序崩溃。网络不稳定时,这层兜底能省下大把排查时间。
想继续深入?这些入口别错过 📌
- API 文档:四个模块全部函数的参数说明和示例在 docs/api.md。
- 示例代码:examples/ 下有股票、基金、债券、期货四个 Jupyter Notebook,照着跑一遍基本就上手了,适合作为量化交易入门的第一份练习材料。
- 版本动态:新功能与接口调整记录在 changelog.md,升级前值得扫一眼。
- 源码学习:想了解实现细节或二次开发,可以克隆仓库
git clone https://gitcode.com/gh_mirrors/ef/efinance后阅读源码。
现在就开始你的量化之旅 🚀
如果你正卡在数据获取这一步,我的建议很直接:装上 efinance,先跑通上面的看板代码,再对照文档把你需要的接口逐个试一遍。当量化交易数据获取不再是瓶颈,你就能把精力放回真正重要的地方——策略本身。
最后提醒一句:本库仅供学习交流使用,请勿用于商业用途。量化交易有风险,历史数据表现不代表未来收益,实盘前请务必充分了解相关风险并做好资金管理。
【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手!🚀🚀🚀项目地址: https://gitcode.com/gh_mirrors/ef/efinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考