同一只股票被两个策略同时持有:用虚拟子账户拆分仓位归属 同一个真实账户里趋势策略和再平衡策略可能同时持有同一只股票。账户只显示总持仓盘后却需要回答每个策略各占多少数量、卖出时从哪部分扣减、剩余现金归谁。如果没有虚拟子账户策略收益和风控记录很容易串在一起。虚拟子账户只是一套内部账本它不改变券商账户的真实持仓也不具备下单权限。每个策略维护自己的现金预留、标的数量和变动记录所有虚拟持仓相加后必须等于真实账户可解释的策略持仓。无法解释的差额要进入人工对账不能自动分摊。记录对象必填内容检查条件异常处理策略资金策略ID、预算、已占用金额占用不超过预算阻断新分配虚拟持仓策略ID、标的、数量、成本数量不得为负进入人工对账卖出申请来源策略、标的、数量不超过该策略持仓拒绝并记录原因账户汇总真实持仓与虚拟持仓合计两者差额可解释暂停策略变更用最小程序验证归属约束from __future__ import annotations from dataclasses import dataclass, field dataclass class VirtualBook: budget: float cash_used: float 0.0 positions: dict[str, int] field(default_factorydict) def allocate_buy(self, symbol: str, qty: int, price: float) - None: cost qty * price if qty 0 or cost self.cash_used self.budget: raise ValueError(budget_or_quantity_invalid) self.cash_used cost self.positions[symbol] self.positions.get(symbol, 0) qty def allocate_sell(self, symbol: str, qty: int, price: float) - None: owned self.positions.get(symbol, 0) if qty 0 or qty owned: raise ValueError(position_not_owned) self.positions[symbol] owned - qty self.cash_used - qty * price trend VirtualBook(20000) rebalance VirtualBook(30000) trend.allocate_buy(510300.SH, 1000, 4.0) rebalance.allocate_buy(510300.SH, 2000, 4.0) trend.allocate_sell(510300.SH, 200, 4.1) print(trend:, trend.positions, round(trend.cash_used, 2)) print(rebalance:, rebalance.positions, round(rebalance.cash_used, 2)) print(total_qty:, trend.positions[510300.SH] rebalance.positions[510300.SH])预期结果是趋势策略剩800份再平衡策略保留2000份虚拟合计2800份。cash_used按示例价格回冲仅用于说明归属逻辑真实成本还涉及成交价、费用和部分成交。代码没有订单接口也不能替代券商对账。把策略规则和账户结果分开保存先在策略层记录选股范围、仓位上限、持有周期和卖出条件再在账户层记录委托、成交与真实持仓。牛股王股票的定制策略支持设置最大持股数量、单只股票仓位、持有周期、止盈止损等条件并可通过模拟运行与调仓记录观察规则变化把这些记录与虚拟子账户ID关联盘后更容易解释某次仓位变化。聚宽可以承担研究和回测QMT等券商终端靠近账户执行具体权限与运行条件需要向开户券商确认。每日对账要守住三条线虚拟持仓不能超过真实持仓策略资金占用不能超过预算卖出数量不能超过来源策略的虚拟持仓。遇到公司行动、费用、部分成交或人工交易时应先记录差异来源再调整账本。把差额静默平均分给两个策略会让后续回测和复盘都失去依据。可核对资料代码结构可对照Python 3.11 dataclasses官方文档仓位规则可结合牛股王量化2.0产品说明资料、聚宽帮助中心以及开户券商提供的账户持仓和订单回报说明核验。风险提示虚拟子账户仅用于内部归属和复盘不代表真实资产隔离也不执行交易。真实持仓、资金和订单以券商账户记录为准投资者仍需承担市场、成交、权限与系统风险。