用 Python 免费获取股票基金债券期货数据:efinance 完整上手教程

用 Python 免费获取股票基金债券期货数据:efinance 完整上手教程 用 Python 免费获取股票基金债券期货数据efinance 完整上手教程【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库回测以及量化交易的好帮手项目地址: https://gitcode.com/gh_mirrors/ef/efinance量化交易的第一步永远是数据。efinance 正是为解决Python 金融数据获取而生的一款免费开源库——它把股票、基金、债券、期货四大市场的行情与财务数据收进同一个接口无需注册账号、无需 API 密钥一条pip install efinance即可开始拉数。本文将从安装到搭建自己的数据采集层带你完整走一遍这条上手路线读完就能在自己的项目里跑起来。为什么取数是量化新手的第一道坎很多人在策略开发前就被数据卡住了。市面上的数据服务要么收费不菲要么要求申请密钥、配置繁琐更麻烦的是每个数据源的接口风格各异今天学会 A 平台的写法明天换 B 平台又要重学一遍。等你终于把数据凑齐格式还不统一——股票的 DataFrame 和基金的净值表结构对不上清洗转换又是一大摊事。efinance 的设计思路正好绕开了这些痛点零门槛开源免费基于公开数据源不涉及付费与鉴权接口统一四个市场都遵循get_quote_history、get_realtime_quotes这类同构函数名学习一次、处处可用输出规范所有结果统一为 pandas 的 DataFrame/Series和数据分析生态无缝衔接覆盖面广A 股、港美股、ETF、公募基金、可转债、期货主力合约等一应俱全。换句话说你只需要记住一个库的用法就能同时喂饱股票、基金、债券、期货四类需求。三分钟装好环境拿到第一份行情数据安装过程简单到令人怀疑是不是漏了什么步骤——不需要申请任何密钥不需要写配置文件pip install efinance如果之前装过旧版本顺手升个级pip install efinance --upgrade装完后打开 Python 交互环境三行代码就能拿到贵州茅台从上市至今的全部日 K 线import efinance as ef quotes ef.stock.get_quote_history(600519) print(quotes.tail()) print(f共 {len(quotes)} 条记录字段{list(quotes.columns)})预期输出节选一张 13 列的 DataFrame包含股票名称、日期、开盘、收盘、最高、最低、成交量、成交额、振幅、涨跌幅、涨跌额、换手率。关键点解读返回的是标准 pandas DataFrame日期列已按时间排好序可以直接交给 Matplotlib 画 K 线、交给回测框架做指标计算省去了手动解析 JSON 或 HTML 的体力活。 小贴士get_quote_history同样接受股票名称如贵州茅台和港股美股代码如AAPL不必死记代码表。一张统一接口的背后认识 efinance 的模块化设计先看项目源码目录efinance/它的分层非常直白efinance/ ├── stock/ 股票模块K线、实时行情、龙虎榜、资金流向 ├── fund/ 基金模块净值、持仓、基金经理、行业分布 ├── bond/ 债券模块可转债行情、基本信息、历史K线 ├── futures/ 期货模块合约信息、主力合约行情 ├── common/ 公共请求逻辑与配置 └── utils/ 工具函数入口文件只做了一件事——把四个子模块挂到ef命名空间下于是ef.stock、ef.fund、ef.bond、ef.futures四个命名空间各司其职互不干扰。这种设计哲学对使用者很友好按市场切分、按动词统一。比如取历史行情这个动作四个市场都叫get_quote_history只是参数略有差异。你不需要关心底层请求的是哪个数据源接口只需要知道我想取哪个市场、哪个标的、哪个周期。下面这段代码演示了统一接口的威力——一次脚本同时拉取股票、基金、债券三个市场的数据import efinance as ef # 同一句 get_quote_history喂给三个市场 stock_df ef.stock.get_quote_history(600519) # 贵州茅台日K fund_df ef.fund.get_quote_history(161725) # 某白酒指数基金净值 bond_df ef.bond.get_quote_history(123111) # 东财转3可转债 for name, df in [(股票, stock_df), (基金, fund_df), (债券, bond_df)]: print(f{name} 最近一行) print(df.tail(1).to_string(indexFalse))预期输出三行摘要分别展示茅台的最新收盘价、基金的最新单位净值、可转债的最新价。三种完全不同的资产只用了一致的调用方式。从日线到分钟线把历史行情玩出花样get_quote_history的几个关键参数值得记牢它们决定了你能拿到什么粒度的数据参数含义常用值beg/end起始/结束日期格式如20230101kltK 线周期代码101日线、102周线、103月线、1/5/15/30/60分钟线fqt复权方式0不复权、1前复权、2后复权比如只想看茅台最近一周的 5 分钟线用来盯日内波动import efinance as ef minute_bars ef.stock.get_quote_history( 600519, beg20240102, end20240110, klt5, # 5 分钟周期 fqt1, # 前复权 ) print(minute_bars.head())预期输出日期列带上了时间戳如2024-01-03 09:35每行是一根 5 分钟 K 线含开高低收与成交量。关键点解读分钟线适合日内策略日/周/月线适合趋势与配置类策略做回测前建议用fqt1前复权避免除权除息造成的价格跳空污染收益率计算。⚠️ 注意分钟线数据量较大尽量配合beg/end缩小范围别一上来就拉全量。从会查到会用写一个属于自己的数据采集层单条查询学会后真正决定效率的是批量 缓存 容错这三件事。我们先做一个带超时保护的批量拉取避免一次性请求过多被数据源限流import time import efinance as ef def fetch_many(codes, marketstock, gap1.0): 依次拉取多个标的每次请求之间留出间隔返回 {代码: DataFrame} result {} getter getattr(ef, market).get_quote_history for code in codes: result[code] getter(code) print(f{code} 已获取 {len(result[code])} 条) time.sleep(gap) # 温柔一点别把接口打疼 return result data fetch_many([600519, 000858, 601318])关键点解读getattr(ef, market)让函数可以动态选择市场后续想扩展到债券、期货只需改传入的market参数。逐个请求加间隔虽然慢但胜在稳——个人开发者做研究完全够用。接下来加上磁盘缓存让重复拉数据变成读本地文件。这里用 CSV 而非 parquet零额外依赖、更易排查import os import pandas as pd from datetime import datetime, timedelta def get_with_cache(code, max_age_hours6, cache_dirquotes): 带过期判断的本地缓存新鲜就读缓存过期才重新请求 os.makedirs(cache_dir, exist_okTrue) path os.path.join(cache_dir, f{code}.csv) if os.path.exists(path): modified datetime.fromtimestamp(os.path.getmtime(path)) if datetime.now() - modified timedelta(hoursmax_age_hours): return pd.read_csv(path, parse_dates[日期]) frame ef.stock.get_quote_history(code) frame.to_csv(path, indexFalse) return frame df get_with_cache(600519) # 第一次会真实请求第二次起秒读缓存关键点解读缓存策略按数据特性区别对待——分钟线设短过期如 15 分钟日线设几小时财务类数据甚至可以放到一周。这样既保证数据新鲜度又大幅减少无谓的网络请求。 进阶可以把get_with_cache和fetch_many组合形成批量优先读缓存、缺了才补请求的采集层。最后给网络波动加一道保险——指数退避重试遇到偶发超时自动重试而不是让整个脚本崩溃import time import random def resilient_fetch(fetch_func, retries3, base_wait1.0): 带退避重试的取数包装器失败后等待时间翻倍 for attempt in range(retries): try: return fetch_func() except Exception as exc: wait base_wait * (2 ** attempt) random.uniform(0, 0.5) print(f第 {attempt1} 次失败{exc}{wait:.1f}s 后重试) time.sleep(wait) raise RuntimeError(f重试 {retries} 次仍失败) safe_quotes resilient_fetch(lambda: ef.stock.get_quote_history(600519))踩坑记录网络波动、代码格式与请求频率新手最容易踩的坑提前帮你排掉代码别带前缀后缀。传入的股票代码用纯数字600519而不是sh600519基金用 6 位数字可转债同理前缀交给库内部处理。日期格式要统一。beg/end接受20240101或2024-01-01这类写法但别混用建议统一成 8 位数字。请求别太密集。个人脚本里加time.sleep间隔是性价比最高的防限流手段真正需要高并发时再考虑线程池并控制连接数。首次联网失败不代表坏了。公开数据源偶有波动先重试一次再排查代码公司网络若屏蔽外网也可能导致请求超时。数据要自己验证。返回空 DataFrame 时先确认代码是否正确、是否停牌或退市别急着怀疑库出了问题。遇到网络层面的持续限流时README 里也提到可尝试 TickFlow 这类替代数据源作为后备方案项目根目录的changelog.md记录了各版本变更值得定期翻看。让数据流动起来一个完整的资产跟踪小项目把前面所有零件拼起来做一个持仓净值快照小项目每天记录股票收盘价与基金净值追加进本地日志用于跟踪自己组合的走势。import os from datetime import date import pandas as pd import efinance as ef HOLDINGS {600519: 股票-茅台, 161725: 基金-白酒指数} LOG_FILE portfolio_log.csv def snapshot_today(): rows [] today date.today().isoformat() for code, label in HOLDINGS.items(): if code.startswith(1): # 6 开头基金1 开头基金代码 hist ef.fund.get_quote_history(code) value hist[单位净值].iloc[-1] else: # 其余按股票处理 hist ef.stock.get_quote_history(code) value hist[收盘].iloc[-1] rows.append({日期: today, 标的: label, 代码: code, 收盘/净值: value}) return pd.DataFrame(rows) df snapshot_today() if os.path.exists(LOG_FILE): old pd.read_csv(LOG_FILE) df pd.concat([old, df], ignore_indexTrue) df.to_csv(LOG_FILE, indexFalse) print(df.tail())预期输出一张不断增长的 CSV每天新增两行股票 基金积累足够天数后就能画自己的资产走势曲线。关键点解读日期用date.today()生成配合幂等写入先读后追加可以放心用定时任务cron 或 Windows 计划任务每天跑一次。这个 30 行的脚本就是一套最简数据采集 → 存储 → 分析管道——而它全部建立在 efinance 的统一接口之上。收尾一句话总结与下一步行动一句话总结efinance 用一个库、四个模块、统一接口的方式把 Python 金融数据获取的复杂度降到了几行代码以内是个人量化研究起步阶段的趁手工具。下一步建议按这个顺序推进先把今天的示例跑通再看项目里的官方文档docs/api.md了解全部函数签名然后参考examples/目录下的股票、基金、债券、期货四个 Jupyter 示例examples/stock.ipynb、examples/fund.ipynb等加深印象最后动手写你自己的数据采集层。想深入源码或参与改进可以git clone https://gitcode.com/gh_mirrors/ef/efinance到本地研读遇到问题或发现新需求在项目 Issues 区交流即可。愿数据帮你少走弯路早日跑通自己的第一个策略。温馨提示本项目仅供学习交流使用请勿用于商业用途。投资有风险入市需谨慎文中代码不构成任何投资建议。【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库回测以及量化交易的好帮手项目地址: https://gitcode.com/gh_mirrors/ef/efinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考