ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用Python分析外资席位持续加多有色与黄金的持仓变化

用Python分析外资席位持续加多有色与黄金的持仓变化 最近不少做期货的朋友在讨论“外资机构席位持续加多有色金属和黄金”这个话题尤其是8月7日前后资金流向的解读一下子成了行情讨论的焦点。很多人看到“外资席位加多”这几个字第一反应是赶紧追多单但问到他具体是哪个席位的持仓变化、净多单增加了多少、和价格走势是否出现过背离往往又说不出细节。这篇文章不打算预测行情也不做任何交易建议而是围绕这个话题把一套可落地的分析流程拆开来讲什么是外资机构席位、怎么看席位持仓数据、如何用 Python 做净多单变化统计以及实际分析中容易踩的坑。无论你是刚接触期货数据的新手还是想搭建自己资金流向监控工具的开发同学这篇教程都适用。1. 背景与核心概念1.1 什么是“外资机构席位”在境内期货市场普通投资者是不能直接在交易所下单的必须通过期货公司进行代理。每家期货公司在交易所都拥有一个独立的会员席位投资者委托期货公司下单后交易和持仓都会汇总到该会员名下。所谓“外资机构席位”业内通常指两类具有外资背景的期货公司席位例如摩根大通期货、瑞银期货等境外机构通过特定通道参与境内期货市场时所使用的经纪席位。这里需要特别注意一个概念我们看到的持仓排名是“期货公司席位”层面的合计数据并不是某个境外基金的直接持仓。也就是说如果一个外资背景期货公司的席位持仓明显增加只能说明该席位上的客户整体在增加头寸不能简单等同于“某外资基金在买”。但在公开数据有限的情况下外资背景席位的持仓变化仍然是观察境外资金动向的重要代理指标。1.2 多单、空单与净多单在期货市场中每个交易日结束后交易所会公布每个会员在某个合约上的持仓结构持买单量该席位客户持有买入方向合约的总量代表看多力量持卖单量该席位客户持有卖出方向合约的总量代表看空力量净多单持买单量减去持卖单量反映多空力量的净偏向。“持续加多”这个词通常意味着某个席位的净多单在连续多个交易日增加。净多单增加有两种可能一是多头持仓增加二是空头持仓减少。前者是主动加多后者是空头回补两者含义不同分析时要分开看。1.3 为什么有色金属和黄金被重点关注黄金和有色金属铜、铝、锌等与其他商品相比具有明显的金融属性。它们对全球宏观经济预期、美元指数、实际利率变化非常敏感。外资机构在这些品种上的持仓调整往往领先于国内市场的情绪变化因此被看作重要的先行信号之一。这也就解释了为什么“外资机构席位持续加多有色金属和黄金”能够引起市场关注当一个相对理性和信息渠道丰富的资金群体开始连续增加某个板块的看涨头寸时背后通常存在宏观层面的逻辑支撑比如对美联储降息的预期、对美元走弱的判断或者对全球制造业复苏的押注。2. 数据从哪里获取2.1 境内交易所持仓排名分析席位数据最权威的来源是交易所官网。上海期货交易所上期所公布黄金、白银、铜、铝、锌等品种的会员持仓排名大连商品交易所大商所公布豆粕、铁矿石等品种的持仓排名郑州商品交易所郑商所公布棉花、 PTA 等品种的持仓排名。交易所一般会在每个交易日收盘后更新“每日成交持仓排名”并提供 Excel 或 CSV 下载入口。打开后可以看到会员简称、成交量、持买单量、持卖单量、较上日增减等字段。需要说明的是不是所有品种都会公布所有席位的详细持仓通常只公布成交量或持仓量排名靠前的会员数据。这虽然会丢失一部分信息但对于观察头部机构动向已经足够。2.2 国际市场持仓数据如果要观察国际市场的黄金或铜等品种可以关注美国商品期货交易委员会CFTC发布的每周持仓报告Commitments of Traders简称 COT 报告。这份报告会按照商业机构、非商业机构、散户等不同类型划分持仓。不过 COT 报告的统计口径与境内交易所不同而且更新频率是每周一次时效性比境内每日数据差。如果你主要在境内期货市场交易建议以境内交易所每日持仓排名为主CFTC 数据作为宏观背景参考。2.3 核心字段说明在分析席位数据时我们需要关注以下几个关键字段字段含义作用交易日数据对应的日期用于做时间序列分析合约代码例如 au2412、cu2408确定分析的具体品种和交割月份会员简称期货公司名称筛选中意的外资背景席位持买单量该席位所有客户的多头总持仓观察多头力量持卖单量该席位所有客户的空头总持仓观察空头力量净多单变化由持买单量减持卖单量得到核心分析指标很多新手容易把“成交量”和“持仓量”搞混。成交量是当天发生交易的合约数量反映的是交易活跃度持仓量是交易结束后仍然持有的合约数量反映的是存量头寸。席位“加多”一般指持仓量层面的变化而不是成交量层面的放大。3. 核心分析方法从席位变化到交易信号3.1 席位数据不能孤立看单一席位的持仓变化本身不构成完整的交易信号。比如某个外资席位连续两天净多单增加但如果同时有多个内资席位在大幅减多那么整体资金的净流向未必是偏多的。正确的做法是先做三步筛选选出目标品种的主力合约找出持仓排名靠前、外资背景明显的席位统计该席位连续 N 个交易日的净多单变化。这里说的“主力合约”是指某个品种中持仓量和成交量最大的那个合约月份。不同品种的合约月份分布不同分析时一般固定使用主力合约避免因为合约换月导致持仓数据跳变。3.2 背离与共振当我们把席位净多单变化和价格走势叠加在一起观察时会出现两种典型情况共振状态价格上涨外资席位净多单同步增加。这是比较健康的上涨结构说明价格上涨有新增多头资金支持。背离状态价格上涨但外资席位净多单开始连续减少。这时候要警惕上涨动能减弱因为推动价格上涨的存量资金正在撤退。这种背离出现后行情进入震荡甚至回调的概率会加大。举个简化例子8月1日到8月7日某品种价格从 73000 涨到 75800表面上是多头行情但如果你同时看到某外资背景席位净多单从 5800 手一路减到 3200 手那么这波上涨的持续性就要打一个问号。3.3 多空对比与席位集中度除了看单一席位的净多单变化还要关注席位集中度。所谓集中度是指某一席位持仓量占市场总持仓量的比例。集中度越高说明筹码越集中在少数通道手里一旦这些资金集中离场价格波动会非常剧烈。有经验的交易者会同时监控外资席位净多单变化前五大多头席位集中度前五大空头席位集中度。当一个品种的外资席位集中度连续上升同时价格处于突破区间时后续行情往往会走出比较流畅的单边趋势。但要注意集中度过高也意味着流动性风险一旦资金反转止损盘会非常拥挤。4. 实战案例用 Python 分析外资席位净多单变化下面我们用一个完整的 Python 示例来演示席位数据的处理流程。为了保证代码可以独立运行这里先构造一份演示数据。实际使用时你可以将数据替换为从交易所官网下载的 Excel 或 CSV 文件。4.1 构造演示数据集先模拟一个外资背景席位近 5 个交易日的数据字段包括日期、持买单量、持卖单量以及同步的合约收盘价。# file: analyze_holdings.py import pandas as pd # 模拟外资背景席位近5个交易日的数据 # 实际使用时可替换为交易所官网下载的真实数据 demo_data { date: [2025-08-03, 2025-08-04, 2025-08-05, 2025-08-06, 2025-08-07], long_position: [12000, 12600, 13100, 13900, 14800], short_position: [8000, 8200, 8400, 8500, 8600], close_price: [73000, 73800, 74200, 75100, 75800], } df pd.DataFrame(demo_data) df[net_long] df[long_position] - df[short_position] df[net_long_diff] df[net_long].diff() print(df)运行这段代码输出如下date long_position short_position close_price net_long net_long_diff 0 2025-08-03 12000 8000 73000 4000 NaN 1 2025-08-04 12600 8200 73800 4400 400.0 2 2025-08-05 13100 8400 74200 4700 300.0 3 2025-08-06 13900 8500 75100 5400 700.0 4 2025-08-07 14800 8600 75800 6200 800.0从输出可以看到这个席位在 8 月 3 日到 8 月 7 日期间持买单量从 12000 手增加到 14800 手持卖单量只增加了 600 手净多单从 4000 手增加到 6200 手属于典型的“持续加多”特征。4.2 按席位汇总并筛选持续加多的席位实际数据不会只包含一个席位而是包含几十个会员的数据。这时我们需要按席位分组然后筛选出那些净多单连续增加、并且累计变化为正的席位。# file: analyze_holdings.py import pandas as pd # 读取真实数据字段至少包含date, member, long_position, short_position # 假设数据文件为 holdings.csv编码视数据源而定 # df pd.read_csv(holdings.csv, encodinggbk) # 这里继续使用演示数据并添加两个席位形成对比 data { date: [2025-08-03, 2025-08-04, 2025-08-05, 2025-08-06, 2025-08-07] * 2, member: [FOREIGN_A] * 5 [LOCAL_B] * 5, long_position: [12000, 12600, 13100, 13900, 14800, 20000, 20500, 21000, 20800, 21200], short_position: [8000, 8200, 8400, 8500, 8600, 15000, 15200, 14900, 15500, 16000], } df pd.DataFrame(data) df[net_long] df[long_position] - df[short_position] df df.sort_values([member, date]).reset_index(dropTrue) df[net_long_change] df.groupby(member)[net_long].diff() # 取每个席位最近3个交易日的数据 recent3 df.groupby(member).tail(3) # 筛选最近3日净多单连续增加且累计净多单变化大于0的席位 for member, group in recent3.groupby(member): changes group[net_long_change] total_change changes.sum() if (changes 0).all() and total_change 0: print(f{member} 持续加多近3日净多单累计增加 {total_change:.0f} 手)这段代码的核心思路是先按“会员 日期”排序用groupby().diff()计算每个席位每日净多单变化再取最近 3 个交易日判断这些变化是否全部为正。输出结果FOREIGN_A 持续加多近3日净多单累计增加 1800 手实际上LOCAL_B 虽然持仓量也很大但它的净多单变化有正有负没有形成“连续加多”的特征因此被自动过滤掉了。4.3 将净多单变化与价格走势可视化只看表格数据不够直观最好把价格和净多单变化画在同一个图上。这里用 matplotlib 绘制双轴图左侧是价格线右侧是净多单变化柱状图。# file: visualize_holdings.py import matplotlib.pyplot as plt import pandas as pd # 使用 4.1 节的演示数据 demo_data { date: [2025-08-03, 2025-08-04, 2025-08-05, 2025-08-06, 2025-08-07], long_position: [12000, 12600, 13100, 13900, 14800], short_position: [8000, 8200, 8400, 8500, 8600], close_price: [73000, 73800, 74200, 75100, 75800], } df pd.DataFrame(demo_data) df[net_long] df[long_position] - df[short_position] df[net_long_change] df[net_long].diff() fig, ax1 plt.subplots(figsize(10, 5)) ax1.plot(df[date], df[close_price], colorsteelblue, markero, linewidth2, labelClose Price) ax1.set_ylabel(Close Price, colorsteelblue) ax2 ax1.twinx() ax2.bar(df[date], df[net_long_change], alpha0.4, colororange, labelNet Long Change) ax2.set_ylabel(Net Long Change, colororange) plt.title(Foreign Seat Net Long Change vs Price) plt.show()这个图表会直观显示价格在上涨净多单变化也在持续为正说明价格与资金面形成了“共振”。如果出现价格创新高、但右侧柱子由正转负的情况就要立刻警醒。4.4 落到交易决策的参考框架数据处理完成后如何进一步使用呢这里给出一个可量化的参考框架条件一目标席位连续 3 个交易日净多单变化为正条件二累计净多单变化大于一定阈值例如 500 手条件三收盘价处于 20 日均线上方。当三个条件同时满足时可以认为短期资金面偏多。但注意这只是一个辅助参考框架不是完整的交易策略。实际入场前还需要考虑止损位、仓位大小、市场整体情绪等因素。5. 常见问题与排查思路在实际分析过程中你可能会遇到各种问题。这里整理一份排查清单问题现象常见原因解决思路某个席位数据突然消失该席位成交量或持仓量跌出公布范围改用更大的排名范围或者观察其他同类型席位净多单变化出现巨大跳变主力合约换月导致持仓数据切换用累计主力合约数据或在换月时做拼接处理不同数据源同一席位数据不一致收盘后仍有成交确认或统计口径不同以交易所官网为准避免多个数据源混用外资背景席位净多单在增加但价格不涨可能是空头回补或同时有其他内资席位在减多结合多席位汇总数据以及成交量确认爬虫抓取交易所网页失败交易所官网改版或接口调整将代码中的解析规则模块化定期检查更新误把成交量当持仓量对字段含义理解有偏差先确认表头字段再开始计算其中最容易踩坑的是“合约换月”问题。比如你一直在分析 8 月合约但当 8 月合约临近交割时资金会逐步移到 9 月合约这时席位持仓数据会突然变化甚至出现“净多单瞬间减少”的错觉。解决办法是定期跟踪主力合约是否切换一旦切换就同步调整数据过滤条件。另一个常见问题是直接把交易所公布的“会员持仓排名”当作所有席位持仓。实际上交易所往往只公布排名靠前的会员外资格席如果持仓量不够大可能根本不在名单中。如果你的监控对象不在名单里需要另外寻找替代数据源。6. 最佳实践与工程建议6.1 将席位数据作为辅助指标避免过度解读外资机构席位持仓变化是一个值得参考的“温度计”但绝不是唯一的决策依据。外资背景期货公司的客户中也可能包含大量国内机构和高净值客户这些资金并不一定代表“外资观点”。因此分析时应该结合汇率变化、现货升贴水、库存数据、宏观事件等多个维度综合判断。6.2 建立数据版本管理机制席位数据是高频更新的每天都会产生新的持仓文件。为了避免分析时用到过期数据建议在本地建立数据版本管理以日期为目录名存储原始文件处理后的中间结果单独存放所有数据文件使用统一命名规范例如holdings_20250807.csv。这样即使后续要回溯历史数据也不会因为文件覆盖导致数据不可恢复。6.3 用多时间周期互相验证一天的席位变化样本量太小容易受到偶然因素干扰。建议同时观察 1 日、5 日、10 日三个时间窗口的净多单变化1 日变化反映短期情绪5 日变化反映短期趋势10 日变化反映中期资金进出。只有当短周期与中周期方向一致时信号的可靠度才更高。6.4 保持严格的风控纪律很多资金流向分析脚本最终会输出“偏多”或“偏空”的信号。无论信号如何都要设置严格的止损和仓位上限。建议单品种仓位不超过总资金的 10%单笔交易止损不超过账户权益的 2%出现连续止损时自动停止信号输出避免报复性交易。6.5 合规使用公开数据分析所用数据必须全部来自交易所官网、官方发布的周报或公开数据平台。不要通过非公开渠道获取所谓“大户持仓信息”这既不符合监管要求也可能触犯相关法律法规。在公开发布分析内容时也应避免传播未经证实的消息。7. 总结与学习路线这篇文章从“外资机构席位持续加多有色金属和黄金”这个市场话题出发梳理了从概念到实战的完整流程什么是外资机构席位、如何获取席位持仓数据、如何用 Python 计算净多单变化以及分析过程中的常见陷阱和最佳实践。核心要点有三个席位数据是“代理指标”需要结合多席位、多周期、多维度数据交叉验证净多单变化比绝对持仓量更有参考价值连续变化比单日变化更重要资金流向分析只能作为交易决策的辅助工具不能替代风控体系。如果你打算进一步深入学习可以从这几个方向继续研究 CFTC 持仓报告的统计口径与解读方法学习美元指数、美债收益率与黄金价格之间的联动关系用 Python 搭建一个自动化席位监控脚本每天收盘后定时拉取数据并生成分析结果把席位信号加入量化回测框架用历史数据验证信号的有效性。最后说一点实际建议不要只记住“外资加多等于看涨”这个简单对应关系。从今天开始你可以选择一两个自己熟悉的品种每周固定记录外资背景席位的净多单变化连续记录三到四周再回头对照价格走势。这种亲手积累的盘感比任何现成公式都更可靠。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进