手把手用 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. 股票贵州茅台历史日 Kklt101 表示日线 stock_df ef.stock.get_quote_history(600519, klt101) # 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的几个关键参数这里值得单独说说因为它们直接决定了你能做多细的策略。频率参数 klt101 是日线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默认fqt1是前复权。做回测时如果没意识到这一点用原始价去算收益率遇到分红除权就会算错。长期数据做策略回测建议仔细看一下复权参数的含义别拿到数据就直接开算。坑三高频请求会被限流。efinance 本身是免费数据源合理使用没问题但短时间高频拉取大量数据可能会触发限流。我后来养成的习惯是批量的循环里加个time.sleep(1)历史数据落盘缓存只对增量部分发请求。数据管道跑得稳比跑得快重要得多。什么场景适合它什么场景不该用它这是我最想强调的部分因为任何工具都有边界说明书不会告诉你但踩过坑的人都知道。适合的场景个人量化研究和回测、策略原型验证、学习金融数据分析、中小规模的数据监控项目。这些场景下它的免费、无密钥、统一接口、中文列名都是实打实的优势。想深入了解每个函数的参数和返回值项目文档在docs/api.md四个市场的完整用法示例在examples/目录下的四个 notebook 里都是现成的学习材料。不太适合的场景一是需要保证数据 100% 正确的实盘自动交易系统——任何免费数据源都不能承诺零延迟零错误实盘前必须做严格的数据校验二是超大吞吐量的生产级数据服务——它的定位是个人开发者的好帮手不是企业级行情分发平台三是某些极低频的冷门数据比如非常规的另类数据接口覆盖不到得另想办法。一句话总结我的取舍标准它是我策略验证阶段的第一选择但实盘阶段的最后一道数据校验我会留给自己的核对逻辑。下一步把管道跑起来如果你读到这里我建议的行动路径很简单装好 efinance跑通上面第一个最小例子然后把你最关心的两三只股票拉出来看看它们最近一年的涨跌幅和资金流向。这一步做完你就完成了从数据获取焦虑到数据在手的跨越。再往后可以尝试三件事把数据落盘做增量更新、用 klt 参数切换不同周期对比信号、试着把股票和基金的数据拼起来算一次相关性。每一步都有文档和示例代码在前面等着你。最后照例提醒一句本项目仅供学习交流使用请勿用于商业用途。投资有风险数据也有误差入市需谨慎——但这不妨碍你先把数据管道建起来毕竟连数据都拿不到的话再好的策略也只是空中楼阁。【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库回测以及量化交易的好帮手项目地址: https://gitcode.com/gh_mirrors/ef/efinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考