盘中看了两次期货账户,第二次发现保证金占用多了。眼下占用最大的合约很显眼,但它不一定是这段时间增得最多的。如果复盘想知道"先查哪张",要按前后差额排,不是按第二次的金额排。
占用最大和增量最大是两张表
假设在同一账户、同一币种和同一观察范围内,甲合约从 8 万变成 8.4 万,乙合约从 2 万变成 3.2 万。第二次仍是甲占用最多,但甲只增了 0.4 万,乙增了 1.2 万。若要解释这段时间各合约的占用变化,乙应排在前面;若要看此刻哪张合约占得最多,才看 8.4 万排第一的那张表。
这两次的数字得按同一个完整合约代码对齐,不按列表行号对齐。换月后即使品种简称相同,也不能把旧月和新月的金额接成一行。还有一种情况很容易算错:第一份快照没有丙合约,第二份有。第一份没记录,不等于第一份占用为零;除非另有证据确认当时确实是零,否则丙先列待核,不参加本次排行。
保存两个时点的数值,而不是两份对象引用
TqSdk 的 get_position(account=...) 可取指定账户的持仓集合,Position.margin 对应持仓占用保证金。已有程序在两个观察时点各完成更新、确认数据有效后,分别把数值和观察时间存下来。若只留下会随更新变化的持仓对象,第二次回头读它,不一定还读得到第一次的值。
下面是已有程序中某一次观察的片段。程序记录同一所选账户、币种、时点及覆盖范围;观察值缺失或不是有效数字的合约不参加差额排序,保留待核。
python
from math import isfinite
positions = api.get_position(account=account)
margin_now = {}
for pos in positions.values():
# 用交易所和合约代码标识,不靠显示顺序。
if pos.exchange_id and pos.instrument_id and isfinite(pos.margin):
margin_now[f"{pos.exchange_id}.{pos.instrument_id}"] = pos.margin
两个时点各留一份这样的数值表。只对两份都可核的合约算"后值减前值",正差额从大到小排;缺一侧的另列。占用变多只是观察结果,不能用这个差额反推保证金率一定变了,也不能当成下一笔交易所需的保证金。账户层的占用和冻结还要分开看,不拿持仓差额榜去机械凑到账户总额。
复核资金变化,先把范围缩到具体合约
我推荐用 TqSdk 的持仓占用字段做这张差额表。它让同一账户下的两次观察能落到具体合约,复盘时可以直接指出"乙增得更多",也能看见哪些合约尚缺证据。它不替读者判断变化原因,但能让下一轮复核从有据可查的那几张合约开始。