news 2026/8/18 14:28:20

手把手用 efinance 搭起第一套量化数据管道:股票基金债券期货一次搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手用 efinance 搭起第一套量化数据管道:股票基金债券期货一次搞定

手把手用 efinance 搭起第一套量化数据管道:股票基金债券期货一次搞定

【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手!🚀🚀🚀项目地址: https://gitcode.com/gh_mirrors/ef/efinance

周五晚上十点,我盯着屏幕上的报错信息发呆。那天我决定认真做一次量化复盘:把持仓的股票、几只指数基金、还有一篮子可转债的历史走势拉出来,算一算相关性。结果呢?股票数据要从一个网站手动导出,基金净值要去另一个平台下载 CSV,可转债的数据干脆在第三个地方躺着,格式还各不相同。三份数据,三种格式,三个下午。那天晚上我意识到,真正拦住新手做量化的,往往不是策略,而是"把数据搞到手"这件事本身。如果你也卡在这一步,这篇文章就是写给你的——我会用 efinance 这个免费开源的 Python 金融数据接口,从零搭起一套覆盖股票、基金、债券、期货的数据管道。

从手动导出到写爬虫,我走过的弯路

先说结论:这条路我已经替你试错了。手动导出表格看起来省事,但数据量一大就废。于是我开始研究各路财经网站的接口,自己写 requests 爬虫,处理签名、翻页、字段映射。那段时间我的代码里充满了"今天能跑、明天就挂"的临时补丁,因为网页结构一改,整个脚本就要重写。

后来我在一个量化交流群里看到有人提到 efinance。它是个人维护的开源项目,直接对接东方财富的数据源,把股票、基金、债券、期货四类市场的数据统一封装成 pandas 的 DataFrame 返回。换句话说,你不需要注册任何服务商账号,不需要配置 API 密钥,pip 装完就能用。我抱着"再试最后一次"的心态装了它,结果第一条命令就让我愣住——三行代码,拿到了贵州茅台从上市第一天到现在的全部日 K 线。

先装起来,再跑通最小例子

安装没有悬念,一条命令的事:

pip install efinance

装好之后,我建议你做的第一件事不是读文档,而是直接跑这个最小例子,感受一下"拿到数据"有多快:

import efinance as ef # 获取贵州茅台的历史日 K 线,返回 pandas DataFrame df = ef.stock.get_quote_history('600519') print(df.tail()) # 看最近几天 print(len(df), '行记录') # 看看总共拉了多少天

这段代码解决什么问题?它验证了整条链路是否通畅。如果这一行能跑通,说明网络、依赖、数据源都没问题,后面的所有尝试都有了地基。返回的 DataFrame 里,日期、开盘、收盘、最高、最低、成交量、成交额、涨跌幅、换手率这些字段都是中文列名,一眼就能看懂,省去了查字段字典的功夫。

说到这里你可能已经发现了 efinance 的一个设计哲学:它把所有市场的数据都尽量对齐成同一套 DataFrame 结构。这意味着你只需要学会一个 API 的用法,其他市场基本是举一反三。

深入一个核心功能:把四个市场串进同一套代码

跑通最小例子之后,我做的下一件事是验证"四市场统一接口"是不是真的。于是我把股票、基金、债券、期货的历史数据获取各写了一遍:

import efinance as ef # 1. 股票:贵州茅台历史日 K(klt=101 表示日线) stock_df = ef.stock.get_quote_history('600519', klt=101) # 2. 基金:招商中证白酒指数基金的历史净值 fund_df = ef.fund.get_quote_history('161725') # 3. 可转债:东财转3 的历史行情 bond_df = ef.bond.get_quote_history('123111') # 4. 期货:先拿到全市场行情列表,取第一个行情ID再拉K线 quote_ids = ef.futures.get_realtime_quotes()['行情ID'] futures_df = ef.futures.get_quote_history(quote_ids[0]) print(stock_df.head(), fund_df.head(), bond_df.head(), futures_df.head())

这段代码解决的问题是"跨市场数据格式是否一致"。跑完之后你会发现,四份数据虽然字段略有差异,但核心的日期、开盘、收盘、成交量、涨跌幅结构完全对齐。这意味着你可以直接把四份数据 concat 进同一个处理流程,做相关性分析、做多资产回测,都不用写一堆格式转换的胶水代码。跨市场相关性分析、多资产配置这类策略,从数据层面一下子变简单了。

进阶用法:频率、区间、批量,一个函数全包

用了一周之后,我摸清了get_quote_history的几个关键参数,这里值得单独说说,因为它们直接决定了你能做多细的策略。

频率参数 klt:101 是日线,102 周线,103 月线,1/5/15 是分钟线。做趋势跟踪用日线,做日内策略用分钟线。想验证一个想法,先换参数再跑一遍就行,不用写第二套代码。

区间参数 beg / end:格式是'20230101'这种。写增量更新逻辑特别方便——每天收盘后只拉最近一个月的数据,而不是每次把全部历史重新下载一遍。

批量传入:股票代码可以传列表,返回的是一个以代码为键的字典:

import efinance as ef # 一次拉取多只股票的历史行情,返回 {代码: DataFrame} 字典 codes = ['600519', '000858', '300750'] result = ef.stock.get_quote_history(codes) for code, df in result.items(): print(code, df['收盘'].iloc[-1]) # 打印每只股票最新收盘价

这段代码解决的问题是"批量监控"——如果你在维护一个股票池,这一句就能把整个池子的历史数据全部拉齐。配合 pandas 的滚动窗口,MA5、MA20 这些技术指标几行就能算出来,构建一个简单的监控面板完全够用。

再补一个我后来用得最多的:资金流向数据。get_history_bill返回主力、超大单、大单的净流入历史,很多新手做资金面分析时到处找数据源,其实 efinance 里就有:

import efinance as ef # 获取宁德时代的历史主力资金流向(日级) bill_df = ef.stock.get_history_bill('300750') print(bill_df[['日期', '主力净流入', '主力净流入占比']].tail())

三个我踩过的坑,提前帮你排掉

用了一个月,踩坑总结下来就三条,都是网上文档容易忽略的细节。

坑一:期货没有"代码",只有行情 ID。股票用600519,基金用161725,债券用123111,但期货要先通过ef.futures.get_realtime_quotes()拿到行情ID列(格式类似'115.ZCM'),再把这个 ID 传给get_quote_history。我最初直接传期货代码,报错报得莫名其妙。官方 README 里其实有完整示例,就在仓库根目录,值得先翻一遍。

坑二:接口返回的是复权价。get_quote_history默认fqt=1是前复权。做回测时如果没意识到这一点,用原始价去算收益率,遇到分红除权就会算错。长期数据做策略回测建议仔细看一下复权参数的含义,别拿到数据就直接开算。

坑三:高频请求会被限流。efinance 本身是免费数据源,合理使用没问题,但短时间高频拉取大量数据可能会触发限流。我后来养成的习惯是:批量的循环里加个time.sleep(1),历史数据落盘缓存,只对增量部分发请求。数据管道跑得稳,比跑得快重要得多。

什么场景适合它,什么场景不该用它

这是我最想强调的部分,因为任何工具都有边界,说明书不会告诉你,但踩过坑的人都知道。

适合的场景:个人量化研究和回测、策略原型验证、学习金融数据分析、中小规模的数据监控项目。这些场景下,它的免费、无密钥、统一接口、中文列名都是实打实的优势。想深入了解每个函数的参数和返回值,项目文档在docs/api.md,四个市场的完整用法示例在examples/目录下的四个 notebook 里,都是现成的学习材料。

不太适合的场景:一是需要保证数据 100% 正确的实盘自动交易系统——任何免费数据源都不能承诺零延迟零错误,实盘前必须做严格的数据校验;二是超大吞吐量的生产级数据服务——它的定位是"个人开发者的好帮手",不是企业级行情分发平台;三是某些极低频的冷门数据(比如非常规的另类数据),接口覆盖不到,得另想办法。

一句话总结我的取舍标准:它是我策略验证阶段的第一选择,但实盘阶段的最后一道数据校验,我会留给自己的核对逻辑。

下一步:把管道跑起来

如果你读到这里,我建议的行动路径很简单:装好 efinance,跑通上面第一个最小例子,然后把你最关心的两三只股票拉出来,看看它们最近一年的涨跌幅和资金流向。这一步做完,你就完成了从"数据获取焦虑"到"数据在手"的跨越。

再往后,可以尝试三件事:把数据落盘做增量更新、用 klt 参数切换不同周期对比信号、试着把股票和基金的数据拼起来算一次相关性。每一步都有文档和示例代码在前面等着你。

最后照例提醒一句:本项目仅供学习交流使用,请勿用于商业用途。投资有风险,数据也有误差,入市需谨慎——但这不妨碍你先把数据管道建起来,毕竟,连数据都拿不到的话,再好的策略也只是空中楼阁。

【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手!🚀🚀🚀项目地址: https://gitcode.com/gh_mirrors/ef/efinance

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 14:22:35

MySQL8.0.30升级8.0.46完整操作手册(含回滚方案)

一、前言 本次将MySQL8.0.30版本升级至8.0.46官方稳定版,核心目的是修复旧版本已知漏洞、优化数据库性能、提升系统稳定性与安全性,适配业务长期稳定运行需求。本次升级采用前置不停机准备短停机窗口升级的平滑升级方案,前期准备工作无需停机…

作者头像 李华
网站建设 2026/8/18 14:22:03

告别黑屏闪退!免费开源神器让童年老游戏在新电脑重获新生

告别黑屏闪退!免费开源神器让童年老游戏在新电脑重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDr…

作者头像 李华