跳到正文

研究指南

股票组合与模拟研究

目标权重买不出来怎么办:把整股和手数约束带入多期组合

目标权重在整股或手数约束下可能买不出来。舍入形成一层偏差,未成交和现金不足又形成其他偏差。每次调仓分开目标、可执行计划与实际权重,保留现金,不能把股票部分重新归一化,假装配置已经落实。

本文跟踪三次合成调仓,输入交易单位并模拟卖出受阻,为外部实施分析,不证明CoTrading或券商能力。单位和零费用不描述真实市场。单币种研究,接入前取得真实逐股生效单位,不把变量能放股票代码当作市场规则验证。

核实单位及生效日

保存证券身份、最小数量、增量、碎股政策和调仓当日有效来源。整股与整手不同,公司行动或单位变化还可能留下旧碎股,不能无痕舍掉。历史回测应使用当时规则,而非只查今天单位。

HKEX市场操作FAQ说明发行人确定手数及独立碎股机制。参考引擎把港股固定一百股,仅是简化,不能当作全市场或所有券商通道规则;碎股能否执行也要单独核实。

本例输入A一股、B十股,为虚构情景,不是已核实港股。代码要求正整数单位,起始股数为非负整数倍,不把未知默认一百。真实存在不符合单位的存量,应另有处理,不因为数据与简化不符就删除证券价值。

先核资本和目标预算

价格有限且正,现金有限非负,总值正,再除净值算权重。目标有限、非负且满足预算。Python Decimal文档提供这里十进制及有限性接口。NaN先拒绝,不只依赖和与一比较。

脚本明确拒绝非有限权重、零净值、身份或不支持股数。空基数不能生成有意义百分比,不能填零后打成功。现金负值也不能因证券仍值钱就当作无融资账户,输入契约在计算前检查。

目标舍入前股票合计一,不借钱、费用零。真实费用要在确定可买数量前留出,不能沿用零费用计划,再在最后扣到负现金。本文金额较小、价格已知,只展示实施链,不模拟真实交收和订单优先级。

目标转为整单位计划

每股按净值乘目标,再除价格乘单位,向下取整数手后乘回。保留未舍入目标和计划现金,原权重和一,也会因为逐股向下取整留下钱。这里不把剩余钱贪心补某股,那将是另一种需说明的分配政策。

planned_qty[s] = int((nav * target_weight[s]) // (price[s] * unit[s])) * unit[s]
planned_cash = nav - sum(planned_qty[s] * price[s] for s in basket)

“可执行”列只是满足当前手数计划,不保证市场成交。实际列在确认后用同一估值价格和现金计算。请求、计划、成交分别保存,避免把有合法手数的请求直接当成账户已持仓。

前两次调仓主例

初始现金一千、无股,A七十、B三十,各半对应连续股数约七点一四二八五七与十六点六六六六六七。整单位计划A七、B十,证券七百九十,现金二百一十。目标到计划的空缺来自舍入,不是执行失败。

第一期B买入被阻,只成交A七,证券四百九十,现金五百一十。计划B权重零点三不能写成实际,实际B为零。额外三百现金来自未成交,不应混入舍入原因,否则下次恢复时不知道需要补什么。

第二期A八十、B二十五,实际净值一千零七十。目标零点四/零点六,计划A五、B二十。先卖A两股得一百六十,再买B二十股花五百,现金一百七十,实际达到本次计划,仍然没有达到连续目标向量。

期次净值计划A/B实际A/B实际现金
010007/107/0510
110705/205/20170
210207/106/2080

净值跨期来自实际持仓价格,不是注资或目标归一化。代码每步核股数乘价加现金闭合;变化之前先估现有仓,不回到最初本金重新分配,才能保留多期路径含义。

卖出失败怎样限制买入

第三次A九十、B二十,原A五、B二十和现金一百七十共一千零二十。目标零点七/零点三,计划A七、B十,计划现金一百九十。原本先卖B十可释放二百,足够买A两股一百八十。

但B卖出受阻,二百没有到账。只余一百七十,A最多买一股九十,实际A六、B二十、现金八十。两个状态分别记录blocked与cash_limited,不能把请求卖出先记成可用资金,再假造多一股A。

这是不同于舍入的机制:一个未成交导致后续筹资限制。若只比较最后权重,无法知道问题是单位、流动性还是缺钱。需要保留先卖后买的事件次序,以及每笔请求和实际数量,才能解释实施差异。

三栏权重与现金共同展示

最后目标A零点七、B零点三。计划整单位权重约零点六一七六四七、零点一九六〇七八,现金零点一八六二七五;实际约零点五二九四一二、零点三九二一五七,现金零点〇七八四三一。每栏按自己的账户含义合计一。

把实际股票归一化会抹掉现金,隐藏A未买足和B被动保留。分母使用总净值,不能只用证券值。现金虽有时少,仍是真实资产,不是为了表格凑整可以扔掉的残差。展示精度与内部精确核验分开。

目标到计划反映单位政策,计划到实际反映执行及资金。真实效果可能交互,不必硬拆成唯一因果百分比;事件链比一个总偏离数更强。本例也不把卖出失败叫作新目标,原要求始终保留供后续处理。

不可行与不支持状态

总值零不能计算权重,缺失或非正价不能计算手数,应拒绝或返回声明不可用,不用零向量假装调仓完成。未知单位、不匹配身份、不支持存量也明确停止,不在程序内部默默修正证券信息。

真实碎股处置需要市场和券商实际规则,可能走另一执行路径。小模型不因可写A股、港股、美股符号,就完成这些规则。费用、交收延迟、部分撮合等均未测试,扩展前记录限制,再增加实际状态处理。

样例实际测试NaN和零净值,主路径报价和单位齐全。真实报价中断时,不能用前价填一个看似可交易价格继续;估值价与可执行价年龄也应区分,避免计划合法却并无成交机会。

交接多期实施账

每次保存目标版本、单位来源、价格、计划股数、真实成交、现金和偏离原因。检查者从第一期B未买追到第二期B二十,再追第三期卖出失败,能解释每笔数量,不把旧计划直接覆盖到实际仓位。

还应记录单位的适用范围,例如只约束新订单还是同时要求起始持仓整手。本文选择起始也为整倍数,因此拒绝其他状态;真实公司行动留下的碎股可能合法存在,需要另外处理,不能误用这个简化拒绝真实账户或擅自减少数量。

如果后来补成交或重新调仓,应以新事件推进,而不是回填第一期B已成交,因为后者会改变第二期净值与第三期资金。保存原未执行记录,让后续恢复有可解释来源;最终已接近目标也不能消除此前实施缺口。

第三期还可用金额解释现金差:计划现金一百九十,实际八十,相差一百一十。B未卖多留二百证券,A少买一股少花九十,净多留证券一百一十,恰好对应现金减少。这项桥说明不能把所有现金差都叫舍入,也不用虚构损益来填平。

实际股票价值共九百四十,若只在股票内归一化,A会显示约百分之五十七点四四七而非总账户的百分之五十二点九四一,现金八十彻底消失。两种分母回答不同问题,前者不能替代资金账户权重;报告需要证券内比较时,应另外命名并保留总账户栏,记录分母定义和估值时点。

下载完整示例。使用Python 3.12或更新版本,运行python R635.py。标准库十进制断言净值一千/一千零七十/一千零二十,现金五百一十/一百七十/八十,各手数、卖阻后限买和股票加现金权重闭合。

价格、单位、本金、费用或执行状态变化后重算,保留旧账。本文只检验合成多期实施,不保证券商成交,不提供港股统一百股规则,也不证明产品已自动执行所有约束。未成交永远不是实际持仓,不能用目标替代事实。

常见问题

舍入后的股票能归一化回一吗?

不能用于描述实际账户,现金要留在分母与独立配置中。

计划卖出可以资助下一单吗?

只有实际成交并符合可用资金政策后才可以。

相关阅读