VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 18
声望: 0

在vnpy中,为何class PositionHolding里的calculate_frozen里是平今仓优先( elif order.offset == Offset.CLOSE:
self.short_td_frozen += frozen),
而class PositionHolding里的update_trade是平昨优先( elif trade.offset == Offset.CLOSE:
if trade.exchange in {Exchange.SHFE, Exchange.INE}:
self.short_yd -= trade.volume)

Super Moderator
avatar
加入于:
帖子: 111
声望: 12

这是一个关于 VeighNa 持仓管理逻辑的问题。让我先查询相关源代码来理解这个设计的具体实现。

找到了源代码。这是一个非常好的问题,涉及到 VeighNa 对中国期货市场特殊规则的处理。让我详细解释这个设计的原因。

核心原因:两个方法的不同职责

calculate_frozenupdate_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)

结论

这种设计是有意为之的:

  1. calculate_frozen 平今优先:采用保守策略,确保冻结充足,防止风险
  2. update_trade 区分交易所:准确反映各交易所的实际平仓规则,上期所保护投资者优先平昨(避免高手续费),其他交易所鼓励日内交易优先平今

来源文件vnpy/trader/converter.pyPositionHolding 类,第 63-150 行)

Member
avatar
加入于:
帖子: 18
声望: 0

请解释一下优先假设平仓会平掉今仓,这样可以最大化冻结量,确保系统不会因为冻结不足而允许过多的平仓委托,并举例说明

Super Moderator
avatar
加入于:
帖子: 111
声望: 12

"最大化冻结量"的本质是最坏情况防护。采用平今优先假设,可以确保在大多数中国期货交易所(大商所、郑商所、中金所都实行平今优先)中,冻结计算与实际成交行为一致,防止系统错误地接受会导致超仓的委托。

核心原理

中国期货市场的交易所分为两类:

  • 平今优先:大商所、郑商所、中金所(占多数)
  • 平昨优先:上期所、能源中心(占少数)

calculate_frozen 采用平今优先假设,确保在占多数的"平今优先交易所"中,冻结计算 = 实际成交,防止超仓风险。

具体例子说明

持仓情况

今仓:3手
昨仓:5手
总持仓:8手

用户操作(风险场景)

用户连续下委托:

  1. 先下 CLOSE 3手(不指定平今或平昨)
  2. 再下 CLOSETODAY 3手(明确平今仓)

对比两种假设

方案A:平昨优先假设(危险)

步骤 操作 系统冻结计算 系统认为可用 风控判断
第1单后 CLOSE 3手 昨仓冻3,今仓冻0 今仓可用3,昨仓可用2 -
第2单 CLOSETODAY 3手 - 今仓可用3 ≥ 3 接受委托

实际结果(如果在大商所成交):

  • 第1单 CLOSE 3手:大商所平今优先,实际平掉今仓3手
  • 今仓剩余:0手
  • 第2单 CLOSETODAY 3手超仓! 系统错误地允许了委托

方案B:平今优先假设(VeighNa采用,安全)

步骤 操作 系统冻结计算 系统认为可用 风控判断
第1单后 CLOSE 3手 今仓冻3,昨仓冻0 今仓可用0,昨仓可用5 -
第2单 CLOSETODAY 3手 - 今仓可用0 < 3 拒绝委托

实际结果:

  • 系统正确拒绝了会导致超仓的委托,无论在哪类交易所成交都安全

为什么叫"最大化冻结量"?

在上述例子中:

  • 平昨优先假设:只冻结了昨仓3手,今仓冻结0手,总冻结量较小
  • 平今优先假设:冻结了今仓3手(占满今仓),总冻结量更大(更保守)

"最大化冻结量" = 优先占满"更稀缺"的今仓额度,防止用户在今仓和昨仓之间"钻空子",确保即使在最坏情况下(平今优先交易所)也不会超仓。

补充:上期所的特殊处理

您可能会问:上期所是平昨优先,用这种假设会不会有问题?

不会,因为:

  1. 上期所的委托在发送前会被 convert_order_request_shfe() 自动拆分CLOSETODAYCLOSEYESTERDAY
  2. 拆分后的委托不再使用 Offset.CLOSE,而是明确的平今/平昨指令
  3. 因此 calculate_frozen 中对 CLOSE 的处理逻辑主要针对其他交易所或异常情况

来源文件vnpy/trader/converter.py(第 89-111 行)

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】