股票目标权重变了却没成交:检查hold模式是否忽略同向调整
股票目标改变却没有成交,可能是执行模式刻意保留已有同向持仓,并非信号没有被读取。诊断应分别检查目标、模式、取整后的理想股数和实际库存,否则正确的模式决策会被误判为信号失败,真正的资金或数量网格问题也可能藏在同一个无成交现象后面,导致修改错误的环节。
本文用已经可执行的只多头目标和完整合成账户,对照hold与rebalance。本地参考引擎静态代码有hold丢弃记录和独立目标调仓路径,但标准库夹具由作者独立编写,没有运行它。CoTrading对应设置和诊断能力仍属规划或待核实,不把本例当产品已经完成联调的证明。
比模式之前先固定目标时间与含义
四次目标为0.4、0.8、0.2、零,对应四条已经具备执行资格的观测。数字表示按交易前权益计算的目标股票比例,不是直接请求股数,也不是原始进入事件。本例从执行边界开始,不生成信号,不判断收盘条件还需移动到哪次开盘。若上游对齐有误,应先独立解决,不能通过切模式掩盖。
给定价格全为十,初始现金一千、零库存,数量网格一股,每笔实际完成订单收费一。没有卖空、杠杆、税或汇率。目标必须有限且介于零和一,未知模式直接拒绝,不静默解释成hold或rebalance。模式是冻结配置,不按哪套末值更好在运行之后替换。
独立夹具还约定None表示没有决策、保留已有持仓,不声称参考产品所有缺失信号都会原样传成这种含义。零则明确请求空仓,可以触发退出。未知与零不能混用,若把缺输入统一补零,可能把无意见改成清仓,这是经济动作变化,不只是数据清洗。真实接入必须核对上游输出和引擎实际契约。
hold是一种明确的执行政策
hold允许空仓时按正目标进入,也允许已有多头在目标归零时退出。持仓仍为多头、新目标也为正时,保留现有股数。0.4升到0.8、0.8降到0.2,都记录为被忽略的同向调整,不实际执行。这不表示所有目标都无效,而是这一类方向不变的大小变化不被应用。
诊断比较相邻目标值,不把目标与当前实际权重之差直接当新请求。价格会让实际权重自然漂移,即使策略每次仍给同样数值;若每次漂移都算丢弃请求,就制造了策略从未提出的变化。本夹具明确以百万分之一作为目标变化容忍,超过才记录,避免数值小差被放大成大量事件。
被忽略调整不是交易所拒单,而是在模式政策下没有提交执行差额。应保存此前目标、当前请求、时点和理由,区分hold保留、缺原始bar、现金不足、取整数量不变及输入没有被处理。只有结果显示无成交,仍不足以定位其中任何一种,不能先改选股逻辑再寻找支持解释。
hold主例逐行复建
零期交易前权益一千,目标0.4、价格十对应四十股,买入含费支出401,现金599、股数四十、权益999。下一期0.8目标已经可见,但库存仍四十,现金和费用不变;日志保存旧目标0.4、新目标0.8、理由hold_same_direction。看到日志就能知道变化被识别而非读取失败。
第三次目标0.2也是同向调整,继续忽略。比较基准是上一请求0.8,不是最早进入目标0.4;股数四十、现金599不变。最后目标零,全卖四十股、价十、净收399,结束现金998、持仓零、累计费用二。归零不是同向大小调整,因此并未被hold规则阻止退出。
完整数量路径四十、四十、四十、零,仅两张实际订单。平价下亏二完全来自费用。中间虽然写了0.8和0.2,也不能在实际持仓图上报告八十或二十股,没有订单就没有对应库存变化。请求图与持仓图应分别命名,防止把计划暴露冒充已经执行的资产。
rebalance依据当前交易前权益计算差额
rebalance在每条给定执行观测重新求取整目标股数。首笔相同,之后交易前权益999,0.8对应股票金额799.2、未取整79.92股,目标七十九,所以再买三十九。本金390加费一,现金208,持仓七十九、累计费二,权益998。不能为了得到直观的八十股就省略之前已经支出的费用。
下一次0.2乘权益998得到199.6,除价十为19.96,向下取十九股。卖六十股,扣费净收599,现金807、股数十九、累计费三。最后归零卖十九,净收189,结束现金996、持仓零、累计费四。每个目标都基于真实模型账户,不使用最初一千永久当分母。
数量路径四十、七十九、十九、零,对应买四十、买三十九、卖六十、卖十九。与hold相差二单位,因为同样平价路径多了两笔费用,不是信号改变或市场收益不同。Python Decimal文档提供十进制和有限数检查参考,费用降低后续权益,因此直觉上的八十变七十九是本规则的合理后果。
逐行现金应是599、208、807、996,不能只核末值四舍五入后接近。持仓增加与减少都按实际差额收费,原本继续持有的股数不重复购买或重复计成本。股数、现金与权益连起来检查,才能解释为什么目标比例被处理,实际比例仍受整数和成本影响,无法保证恰好等于请求。
取整与费用控制独立于模式
在rebalance模式把第二个目标只从0.4改到0.401,权益999、价格十仍取整四十股,不产生订单,理由是rounded_same_size,不是hold忽略。目标已经进入数量计算,但微小经济变化被一股网格消除。若只看无成交就说信号没有运行,会错过这条明确记录的计算路径。
十股网格控制保持原四目标、价格、费用和rebalance模式,数量变四十、七十、十、零,第二期只增加三十而不是三十九。末现金仍996,因为仍四笔平价成交、固定费用相同。相同末值不能证明中间数量一样,也不能据此省去实际库存验收;本控制隔离的是网格,而不是市场品种的真实手数。
零费用控制则得到四十、八十、二十、零,末现金一千。与有费路径相比,可分离累计费用如何改变后续权益和数量。这些是合成费用与网格控制,不证明真实市场或券商提供所选条件;跨A股、港股、美股使用前仍需各自有效手数、可卖与费用规则,不能把控制参数直接变成产品承诺。
价格漂移不是新的目标变化
另一个hold控制把正目标始终保持0.4,价格从十到十二再到十一,最后目标零退出。实际权重随价格变化,却没有丢弃目标变化记录,因为请求从未改变;库存一直四十,清仓后现金1038、费用二。日志的空缺在这里是正确行为,不是漏记了每一次权重漂移。
它不同于主例0.4到0.8到0.2的明确请求。目标与实际权重图在两种情况下都可能分离,诊断原因却不同。需要实际股数和现金旁证,不能仅凭请求权重曲线推断发生交易。真实参考路径还可能有执行日掩码或容忍带,应核生效配置,本独立夹具不声称自动实现所有外围功能。
资金拒绝另用空仓直接请求目标一测试:一百股价十加费一需要1001,现金只有一千,于是拒绝增加,不借款、不自动调用篮子缩放。更完整引擎可以另有R601那样的共同因子政策,但不能静默算作本单仓模式演示已包含。模式决定是否处理,现金检查决定能否负担,两层原因仍要分别报告。
运行并定位第一处差异
下载完整示例,使用Python 3.12及以上执行python R604.py。程序只用标准库,目标和价格都是合成且已经可执行。输出两套模式账、丢弃请求、取整目标、精确订单、现金、费用及独立控制,不调用信号模型、行情源或实际产品运行器,没有比较调仓频率收益或进行组合优化。
实际目标变化无成交时,先确认生效模式、目标可得、前一请求、库存和取整股数,再看市场拒绝。Investor.gov订单说明也区分指令与真实价格保证,模式对照不能证明现实成交。切换模式以后仍须重新检查资金、市场规则和成本,不能承诺每次都精确达到请求权重。
None控制只检验一条明确无决策输入,不能推及NaN或无穷。后两者属于非法非有限目标,会被门槛拒绝;把未知、非法和明确归零分别记录,可以避免同一个缺值处理悄悄改变持仓方向。
常见问题
hold是不是没有读到0.8目标?
本例不是,它记录变化,并按声明政策保留已有同方向库存。
rebalance没有订单是否表示目标被忽略?
不一定,可能取整后数量不变,或资金与执行检查失败。应先查看理由和理想股数。