我在使用python搭建一个平台,旨在统计近两个月内的国内期货品种交易数据,现在需要所有主力品种的近7日,近21日持仓量变化。在哪里能调用到数据?
该专题还在整理中。
对于你的需求,最直接、最省心的答案是:使用 Tushare Pro 的期货日线行情接口,配合其主力合约识别逻辑,再通过自行计算或使用 AkShare 的持仓量数据,就能拿到你需要的近7日和近21日持仓量变化。不过,如果你追求更稳定、无需自己清洗主力合约归属的数据,专门面向量化交易的数据服务商(如 Tushare Pro 和 AkShare)是唯一靠谱的选择,免费且开源的方案完全可以覆盖你的需求。
为什么不用万得、同花顺或东方财富的 API?
很多刚搭建平台的朋友第一反应是去接券商的接口,或者用万得(Wind)、同花顺(iFinD)这类金融终端。但这里有几个现实问题:
- 门槛和成本:Wind/iFinD 的 API 接口通常需要机构账号或数万元的年费,个人搭建平台很难接受。
- 主力合约的“动态”属性:期货主力合约是随时间变化的(通常按持仓量或成交量排名),你需要的“近7日持仓量变化”必须基于当前的主力合约回溯历史数据。很多通用金融 API 只提供单品种所有合约的行情,需要你自己写代码判断哪一天哪个合约是主力,工作量不小。
- 数据频率与更新时效:你的平台需要统计“近两个月”的数据,这意味着你需要每日更新的高频数据,而不是季度或年度快照。
因此,面向量化社区的数据服务库才是最优解。
两个核心数据源:Tushare Pro 与 AkShare
这两个是目前 Python 生态里最成熟、文档最全的国内期货数据源,而且都支持直接获取“主力合约”的连续数据。下面我拆开讲它们的用法和优劣。
方案一:Tushare Pro(推荐用于主力合约识别)
Tushare Pro 是一个老牌金融数据接口库,由个人开发者维护,现在已有团队化运营。它的核心优势是提供了“主力合约”的标识字段,你不需要自己计算。
- 核心功能:通过 `fut/daily` 接口可以获取所有期货合约的日线行情,其中包含 `maincon`(主力合约标识)或 `pre_maincon`(前主力合约)字段。但更直接的是,它有一个专门的 主力连续合约接口 `fut/cont`,直接返回按持仓量或成交量筛选出的主力合约的连续日线数据。
- 获取持仓量数据:`fut/daily` 接口返回的字段包括 `hold`(持仓量),你可以直接拿到每个交易日的持仓量绝对值。然后自己在 Python 里用 `rolling` 函数算近7日(7个交易日)和近21日的变化。
- 收费情况:Tushare Pro 采用积分制。基础注册用户有 100 积分,可以调用低频接口(如每天 200 次)。期货日线数据属于“高频”或“专业”数据,需要积分购买。通常购买 500 积分(约 50 元)就能满足个人搭建平台的需求。如果你要频繁调用,建议直接买 2000 积分(约 200 元),支持更高的调用频率。
- 使用示例:
import tushare as ts pro = ts.pro_api('你的token') # 获取螺纹钢主力连续合约日线,包含持仓量 df = pro.fut_cont(symbol='RB', start_date='20240101', end_date='20240301', fields='trade_date,close,hold,vol') # 然后计算持仓量变化 df['hold_change_7'] = df['hold'].pct_change(periods=7) df['hold_change_21'] = df['hold'].pct_change(periods=21) - 注意:Tushare 的 `fut/cont` 返回的是“连续合约”,这个连续合约本身没有真实持仓量,它只是把不同月份的主力合约持仓量拼接起来。如果你需要的是“当前主力合约”在过去7天和21天的持仓量变化(即同一个合约代码的持仓量变化),你需要用 `fut/daily` 先查出当前主力合约的代码(比如 RB2405),然后单独拉这个合约的历史数据。Tushare 的 `fut/daily` 里 `maincon` 字段可以帮你定位当前主力。
方案二:AkShare(免费、开源、数据全)
AkShare 是一个完全免费的开源金融数据库,由国内量化社区维护,数据源主要来自东方财富、新浪财经等。它的优点是不需要积分、不需要注册,直接 `pip install akshare` 就能用。对于你的需求,它有两个关键接口:
- 期货主力合约连续行情:`get_futures_daily_main` 接口。这个接口返回的是按持仓量排序选出的主力合约的连续日线,并且它返回的持仓量是真实的、可用的(因为它是把每个交易日的主力合约持仓量拼在一起,类似 Tushare 的 cont 逻辑)。
- 获取所有合约日线:`futures_main_sina` 或 `futures_daily_sina` 接口,可以获取单个合约的完整日线,包括持仓量。
- 优势:完全免费,调用频率无限制(只要不恶意爬取)。数据更新速度比 Tushare 稍慢(通常收盘后 2-3 小时更新),但对于统计近两个月的数据来说完全够用。
- 使用示例:
import akshare as ak # 获取沪铜主力合约日线,包含持仓量 df = ak.futures_main_sina(symbol='CU0', start_date='20240101', end_date='20240301') # 这里 symbol 的规则是:品种代码 + 0 表示主力连续,比如 CU0 表示沪铜主力 # 计算持仓量变化 df['hold_change_7'] = df['hold'].pct_change(periods=7) - 缺点:文档不如 Tushare 详尽,有时接口会因数据源变动而临时失效,需要关注社区更新。另外,它没有直接提供“当前主力合约的代码”的便捷接口,如果你需要知道具体是哪个合约(比如 CU2403),需要额外调用 `futures_contract_info` 接口。
两种方案的对比与选择
| 维度 | Tushare Pro | AkShare |
|---|---|---|
| 收费 | 积分制,个人使用约 50-200 元/年 | 免费 |
| 主力合约识别 | 有专门的 `maincon` 字段和连续合约接口,方便 | 有主力连续接口,但需要理解 `symbol` 规则 |
| 数据稳定性 | 高,有团队维护,接口极少变动 | 中等,可能因数据源改版而临时出错 |
| 持仓量数据质量 | 高,与交易所一致 | 高,但主力连续合约的持仓量是拼接的 |
| 适合场景 | 需要精准、稳定、高频调用的生产环境 | 快速原型、低成本验证、学习研究 |
我的建议:如果你搭建的平台是用于个人研究或小范围使用,直接上 AkShare,零成本,几分钟就能把数据拉下来。如果你希望平台长期运行、稳定输出,或者未来要接入更多品种和指标,花 50 块钱买 Tushare Pro 的积分是值得的,它的接口设计更规范,出错率更低。
具体实现步骤:从数据到持仓量变化
无论你选哪个数据源,核心逻辑是一样的。这里以 AkShare 为例,给出一个完整的代码框架:
- 确定品种列表:国内期货主力品种通常包括螺纹钢、铁矿石、沪铜、沪金、原油、甲醇、PTA、豆粕、玉米等。你可以先用 `ak.futures_contract_info()` 获取所有可交易品种的列表,然后手动筛选出你关注的 20-30 个主流品种。
- 获取主力合约日线数据:对每个品种,循环调用 `ak.futures_main_sina`,指定起止日期(比如近 60 天)。注意,AkShare 的 `symbol` 参数:螺纹钢主力是 `RB0`,铁矿石是 `I0`,沪铜是 `CU0`,以此类推。
- 计算持仓量变化:拿到 DataFrame 后,用 `pandas` 的 `rolling` 或 `shift` 函数。例如:
- 近 7 日持仓量变化 = (今日持仓量 – 7 日前持仓量) / 7 日前持仓量
- 近 21 日持仓量变化 = (今日持仓量 – 21 日前持仓量) / 21 日前持仓量
注意:这里的“7 日”指的是 7 个交易日,不是自然日。如果你的数据包含了非交易日(周末、节假日),计算前需要先过滤掉非交易日,或者直接用 `pct_change(periods=7)`,它会自动跳过缺失日期(前提是你的日期索引是连续的交易日)。
- 存储到平台数据库:将计算结果写入你的数据库(MySQL、SQLite 或 CSV),每日定时任务运行一次,更新最新数据。
其他备选数据源
除了上面两个,还有几个值得关注的选项:
- BaoStock:证券和期货数据,免费,但期货数据只包含日线,且主力合约需要自己判断,不太推荐。
- 聚宽(JoinQuant):提供本地量化 SDK(JQData),有期货主力合约数据,但需要注册账号,且有调用次数限制。适合如果你已经在用聚宽平台做策略研究。
- 交易所官方网站:比如上期所、大商所、郑商所官网提供每日的“仓单日报”和“持仓排名”数据,但那是静态网页,需要爬虫解析,且数据格式不统一,维护成本高,不推荐用于平台搭建。
一个容易被忽视的细节:主力合约的切换
你统计的是“近 7 日持仓量变化”,但如果在这 7 天内主力合约发生了切换(比如从 2401 切换到 2405),那么你拿到的持仓量变化就会包含两个不同合约的数据,这个变化率可能失真。解决方法是:在计算变化时,确保使用的是同一合约代码的数据。Tushare 的 `fut/daily` 接口可以指定合约代码,而 AkShare 的主力连续接口已经自动处理了这种切换(它返回的是拼接后的序列,但持仓量是真实的)。如果你需要极致的准确性,建议用 Tushare 的 `fut/daily` 配合 `maincon` 字段,先定位每个交易日的主力合约,再单独拉取该合约的历史持仓量。
相关问题
- 如何判断期货品种的主力合约是哪个? 通常以持仓量最大为标准,Tushare 的 `fut/daily` 接口直接返回 `maincon` 字段,AkShare 则通过 `futures_main_sina` 返回主力连续数据。你也可以自己用 `futures_daily_sina` 获取所有合约的持仓量,然后按日排序选出最大者。
- 除了持仓量变化,还需要成交量变化和价格变化,数据源一样吗? 完全一样。上述两个数据源都同时返回开盘价、收盘价、最高价、最低价、成交量、持仓量等字段,你可以一次性获取所有指标。
- 如果我想获取实时的持仓量变化(盘中数据),该怎么办? 实时持仓量数据需要连接期货公司的 CTP 接口(如易盛、快期),或者使用量化平台如掘金、米筐的实时行情。普通的数据接口(如 Tushare、AkShare)只提供日线级别的收盘数据,无法做到盘中实时。
- 我的平台需要每天自动更新数据,如何实现? 建议使用 Python 的 `schedule` 库或 `APScheduler`,设置每天下午 16:30(期货收盘后数据更新完毕)运行一次脚本,拉取当日数据并更新到数据库。Tushare 和 AkShare 都支持按日期增量获取。
- 数据的历史长度有限制吗? Tushare Pro 的期货数据最早可追溯到 2000 年左右,AkShare 的数据通常从 2010 年前后开始,但部分品种可能更早。对于“近两个月”的需求,两者都完全够用。
最后,建议你先用 AkShare 快速跑通流程,验证数据质量,再决定是否需要付费升级到 Tushare Pro。数据源的稳定性和准确性直接决定了你平台的可靠性,这两者是目前 Python 生态里最经得起考验的选择。
内容由 AI 生成,产品信息请以官网为准。












