公司动态
efinance量化数据获取实战:从手动爬虫到一行代码的演进之路
efinance量化数据获取实战从手动爬虫到一行代码的演进之路【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库回测以及量化交易的好帮手项目地址: https://gitcode.com/gh_mirrors/ef/efinance下午五点半同事小周盯着满屏的浏览器标签页第八次把基金净值表格手动复制进 Excel。他负责的量化回测项目需要同时盯股票日线、基金净值、可转债行情和期货主力合约——四个数据源、四套网页、四种格式光是清洗对齐就耗掉他大半天。如果你也做过类似的活儿一定懂这种数据获取比策略开发还累的滋味。efinance 这个 Python 库专为量化交易开发者解决这类痛点只需导入一个包就能用统一的接口拿到基金、股票、债券、期货四类金融数据输出清一色的 pandas DataFrame回测与量化交易的取数环节从此压缩到一行代码。一、为什么数据管道值得被重新设计把取数这件事从手动劳动升级为程序化调用核心收益是确定性同样的代码今天跑和明天跑输出列名一致、类型一致、时序一致。下表对比了三种常见取数路线的差异你能直观看到为什么 efinance 适合作为回测系统的数据底座。对比维度手动下载网页表格自写爬虫脚本efinance 封装调用单次取数耗时5-15 分钟1-2 小时开发秒级返回字段标准化需手工对齐需自维护映射内置中文列名多市场扩展逐站处理逐站写解析器四个模块即插即用异常兜底无需自建重试内置重试与容错学习成本无但极低效高低接口风格统一二、四个阶段搭起你的第一条数据管线阶段 1准备环境装好依赖目标让efinance进入你的 Python 环境。建议在虚拟环境为项目隔离依赖的独立 Python 空间中操作# 创建并激活虚拟环境Windows 用 venv\Scripts\activate python -m venv quant_env source quant_env/bin/activate # 安装 efinance 及其依赖pandas、requests 等会自动带上 pip install efinance预期输出终端提示安装成功无报错。 坑位如果你在用 3.10 及以上版本的 Python 且后续请求报 SSL 握手错误先升级pip install -U requests代码库内部已对高版本做了适配多数情况升级依赖即可解决。阶段 2拉取第一份股票日线数据目标验证数据链路通畅拿到结构化行情。以贵州茅台600519为例import efinance as ef # 获取股票历史K线默认返回前复权日线 df ef.stock.get_quote_history(600519) print(df.tail(3))预期输出一张含日期/开盘/收盘/最高/最低/成交量/成交额/涨跌幅/换手率等列的 DataFrame行数约五千余条覆盖上市以来的全部交易日。 坑位get_quote_history接收的既可以是代码也可以是名称但传入列表时返回值会从 DataFrame 变成字典键为代码值为各自的 DataFrame提前判断类型再写后续逻辑能省去一次 TypeError 排查。阶段 3玩转频率与区间参数目标按策略需求裁剪数据。klt控制时间间隔101 日线、102 周线、103 月线、1/5/15/60 分钟beg/end控制起止日期fqt控制复权0 不复权、1 前复权、2 后复权# 近一年月线 最近两周的5分钟线两条数据各取所需 monthly ef.stock.get_quote_history(600519, klt103, beg20240101) min5 ef.stock.get_quote_history(600519, klt5, beg20250201, end20250214) print(monthly[[日期, 收盘]].head())预期输出月线逐月一行5 分钟线每天约 48 行A 股 4 小时交易。 坑位分钟级数据的日期范围不要一次拉太长单次请求数据量过大会拖慢响应建议按周切片分批取。阶段 4同一个接口切换四个市场目标体会统一接口的威力——把stock换成fund、bond、futures取数逻辑几乎不用改# 基金直接传6位代码pz 表示返回多少条净值记录 fund_df ef.fund.get_quote_history(161725, pz120) # 期货先取行情ID列表再拉历史行情 futures_ids ef.futures.get_realtime_quotes()[行情ID].tolist()[:5] futures_df ef.futures.get_quote_history(futures_ids)预期输出基金得到日期/单位净值/累计净值/涨跌幅四列期货按行情 ID 返回各合约 K 线。 坑位期货的入参是行情 ID如114.jm而不是裸代码务必先经get_futures_base_info()拿到 ID 映射表别拿商品代码硬传。三、两个进阶场景让数据产生决策价值场景 A个股日内波动率画像背景日内交易策略需要知道个股在一天中哪些时段波动剧烈从而避开噪音时段。用 5 分钟线聚合出波动分布import pandas as pd df ef.stock.get_quote_history(300750, klt5, beg20250101) df[时间] pd.to_datetime(df[日期]).dt.time # 按交易时段切分统计各时段平均振幅 df[振幅] (df[最高] - df[最低]) / df[收盘] * 100 buckets { 早盘: (09:30, 10:00), 上午中段: (10:00, 11:30), 午后: (13:00, 14:00), 尾盘: (14:00, 15:00), } profile {} for name, (start, end) in buckets.items(): mask (df[时间] start) (df[时间] end) profile[name] round(df.loc[mask, 振幅].mean(), 2) print(profile)效果说明输出四个时段的平均振幅字典你一眼看出尾盘波动最剧烈、午前最平稳这类结构特征进而决定把日内开仓窗口放在哪。优化建议对同一标的按周聚合多次取数后做均值平滑比单日样本更稳健振幅指标可与成交量联合做二次过滤。场景 B可转债双低策略初筛背景可转债的双低价格低、转股溢价率低是常见的防守型标的筛选逻辑过去需要逐个网页翻。用bond模块的实时行情一键筛选quotes ef.bond.get_realtime_quotes(可转债) # 双低值 价格 转股溢价率越小越接近进可攻退可守 quotes[双低值] quotes[最新价] quotes[转股溢价率] picks quotes.sort_values(双低值).head(10)[[债券代码, 债券名称, 双低值]] print(picks)效果说明十余行代码即输出全市场可转债的双低排名直接作为每日盯盘清单的输入。优化建议把筛选结果按日落盘到 CSV 或 SQLite积累历史排名后再回测双低轮动的换仓收益数据源已具备剩下的交给策略本身。四、避坑清单过来人的六条提醒列名以代码为准字段全是中文涨跌幅、换手率写代码前先print(df.columns)确认别凭记忆拼列名。分钟线别贪多单次请求拉长周期分钟线既慢又容易触发限流按日切窗分批拉。期货 ID 与代码是两回事get_quote_history认的是行情ID先查映射表再取数。多标的返回值类型会变传列表返回字典、传字符串返回 DataFrame处理前先type()确认。接口参数靠关键字传klt、fqt、beg这类参数务必用关键字传参避免版本升级后位置参数错位。数据要落盘历史数据当天拉一次就够了存成 parquet/CSV 供回测反复读别让回测循环里嵌网络请求。五、资源导航官方 API 文档docs/api.md所有函数的参数与返回说明都在这里示例代码股票 examples/stock.ipynb、基金 examples/fund.ipynb、债券 examples/bond.ipynb、期货 examples/futures.ipynb源码导读取数核心在 efinance/common/getter.py四类市场的封装分别在 efinance/stock/、efinance/fund/、efinance/bond/、efinance/futures/版本变更记录changelog.md升级前先看一眼六、小结与下一步从手动复制表格到一行代码取数efinance 量化数据获取帮我们把数据管道从麻烦事变成了顺手的工具。接下来你可以先把本文四个阶段的代码跑通再挑一个进阶场景落到自己的策略里最后把历史数据落盘开始认真打磨回测逻辑。数据就位策略才有发言权——现在就去跑你的第一行ef.stock.get_quote_history()吧。⚠️ 合规提示本文仅作技术学习交流efinance 数据来自公开行情接口请遵守数据源的使用条款勿高频抓取或用于商业分发。文中策略示例不构成任何投资建议市场有风险决策需谨慎。【免费下载链接】efinanceefinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库回测以及量化交易的好帮手项目地址: https://gitcode.com/gh_mirrors/ef/efinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考