这是一个关于 VeighNa 持仓管理逻辑的问题。让我先查询相关源代码来理解这个设计的具体实现。
找到了源代码。这是一个非常好的问题,涉及到 VeighNa 对中国期货市场特殊规则的处理。让我详细解释这个设计的原因。
核心原因:两个方法的不同职责
calculate_frozen 和 update_trade 的设计差异源于它们不同的职责和不同的业务场景:
| 方法 |
职责 |
处理时机 |
关键目标 |
calculate_frozen |
计算委托冻结持仓 |
委托挂单/撤单时 |
风险控制(保守策略) |
update_trade |
更新实际持仓 |
成交回报时 |
准确反映交易所行为 |
详细分析
1. calculate_frozen - 平今仓优先(所有交易所)
elif order.offset == Offset.CLOSE:
self.short_td_frozen += frozen # 先冻结今仓
if self.short_td_frozen > self.short_td:
self.short_yd_frozen += (self.short_td_frozen - self.short_td)
self.short_td_frozen = self.short_td
为什么平今优先?
- 风险控制考虑:冻结持仓的目的是防止重复委托导致超仓
- 保守策略:优先假设平仓会平掉今仓,这样可以最大化冻结量,确保系统不会因为冻结不足而允许过多的平仓委托
- 统一处理:无论哪个交易所,都用同一套保守逻辑计算可用持仓
2. update_trade - 根据交易所规则区分
elif trade.offset == Offset.CLOSE:
if trade.exchange in {Exchange.SHFE, Exchange.INE}:
self.short_yd -= trade.volume # 上期所/能源中心:平昨优先
else:
self.short_td -= trade.volume # 其他交易所:平今优先
if self.short_td < 0:
self.short_yd += self.short_td
self.short_td = 0
为什么上期所平昨优先,其他交易所平今优先?
这反映了中国期货市场的实际交易规则:
| 交易所 |
平今手续费 |
Offset.CLOSE 行为 |
| 上期所 (SHFE)<br>能源中心 (INE) |
平今手续费 高<br>(通常是平昨的 2-5 倍) |
优先平昨仓<br>(保护投资者,避免高额平今费) |
| 大商所 (DCE)<br>郑商所 (CZCE)<br>中金所 (CFFEX) |
平今手续费 低 或 免费 |
优先平今仓<br>(鼓励日内交易) |
设计逻辑总结
委托阶段(calculate_frozen):
目标:确保风险可控,防止超仓
策略:统一采用平今优先(更保守,最大化冻结)
成交阶段(update_trade):
目标:准确反映交易所实际成交的持仓变化
策略:上期所平昨优先,其他交易所平今优先
实际场景示例
假设你有空仓:今仓 3 手,昨仓 5 手,现在下平仓委托 4 手:
| 阶段 |
上期所行为 |
其他交易所行为 |
委托时<br>calculate_frozen |
冻结今仓 3 手 + 昨仓 1 手 |
冻结今仓 3 手 + 昨仓 1 手 |
成交后<br>update_trade |
昨仓减少 4 手<br>(今仓 3,昨仓 1) |
今仓减少 3 手,昨仓减少 1 手<br>(今仓 0,昨仓 4) |
结论
这种设计是有意为之的:
calculate_frozen 平今优先:采用保守策略,确保冻结充足,防止风险
update_trade 区分交易所:准确反映各交易所的实际平仓规则,上期所保护投资者优先平昨(避免高手续费),其他交易所鼓励日内交易优先平今
来源文件:vnpy/trader/converter.py(PositionHolding 类,第 63-150 行)
基于RAG技术开发的VeighNa AI助手,你的个人专属 Desk Quant