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

请教大佬,PositionData 中的 volume - frozen 得到的是可用数量吗?也就是说,对于A股T+1来说如果原来空仓,今天买入的数量 = volume = frozen ,T+1日 frozen = 0,yd_volume = volume 吗

Super Moderator
avatar
加入于:
帖子: 128
声望: 15

我来帮您查询 PositionData 的字段定义和含义。

让我再查询 PositionData 的具体字段定义:

让我查询 PositionData 的源代码定义:

根据源代码,我找到了 PositionData 的完整定义。让我再查询一下 A 股接口中这些字段的具体处理:

让我查看一下 A 股接口(如 vnpy_xt)中 PositionData 的具体实现:

根据源码分析,我现在可以给您一个准确的回答。

PositionData 字段定义

根据 vnpy/trader/object.py 中的源码定义:

@dataclass
class PositionData(BaseData):
    symbol: str
    exchange: Exchange
    direction: Direction
    volume: float = 0      # 总持仓量
    frozen: float = 0      # 冻结数量
    price: float = 0       # 持仓均价
    pnl: float = 0         # 持仓盈亏
    yd_volume: float = 0   # 昨仓/可用持仓

关于您的理解

您的理解基本正确,但需要澄清一点:

A 股 T+1 场景下的字段含义

vnpy_xt(迅投)接口为例,持仓查询的处理逻辑如下:

position: PositionData = PositionData(
    volume=xt_position.volume,                    # 总持仓
    yd_volume=xt_position.can_use_volume,         # 可用持仓(可卖出)
    frozen=xt_position.volume - xt_position.can_use_volume,  # 冻结持仓
    # ...
)
场景 volume frozen yd_volume 说明
空仓买入当日 100 100 0 当日买入的 100 股被冻结,不可卖出
T+1 日 100 0 100 冻结解除,全部变为可用持仓
部分卖出后 60 0 60 无冻结,剩余 60 股可卖

关键结论

  1. volume - frozen 确实等于可用持仓数量(即可卖出的持仓)

  2. 对于 A 股,yd_volume 实际表示"可用持仓"can_use_volume),而非字面上的"昨仓"概念。这是因为:

    • 股票接口采用单向持仓(Direction.NET
    • 当日买入部分被冻结,不能卖出
    • yd_volume 反映的是实际可卖出的数量
  3. 您的等式在 A 股场景下成立

    • 买入当日:volume = 买入量,frozen = 买入量,yd_volume = 0
    • T+1 日:frozen = 0,yd_volume = volume

注意:不同交易接口对 yd_volume 的实现可能略有差异。期货接口中 yd_volume 通常确实表示昨日持仓(用于区分平今/平昨),而股票接口中通常表示可用持仓。具体行为请以您使用的接口实现为准。

参考来源vnpy/trader/object.pyvnpy_xt/xt_gateway.py

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

沪公网安备 31011502017034号

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