股票回测现金不够时发生什么:重建整篮订单缩放与零股数拒绝
股票篮子资金不足,应在订单真正改变账户前诊断。先执行符合条件的减仓,释放真实模拟现金;再给全部新买入计算含费成本,按声明政策共同缩放。若只是按输入顺序先买第一只,剩钱再轮到第二只,组合数量甚至成员可能由证券读取顺序决定,而不是由目标规则决定。
本文在美元股票合成账户中复现共同因子缩放。本地参考引擎的静态代码有减仓、计划和资金适配路径,但下载程序是独立标准库复现,没有运行参考引擎。CoTrading的对应篮子成交及诊断输出仍属规划或待核实,不能把本例执行成功当成产品已完成这些集成。
冻结初始资产与完整买入计划
账户最初有现金五十和OLD十股,每股估值十,起始权益一百五十。当前请求全卖OLD,给定可执行价十、费用一,净收到九十九,现金变149、OLD清空。新篮子请求A八股、价十,B八股、价十,C一股、价二十,三者数量网格均为一股。
这里已经是定价后的完整数量计划,不包含杠杆、汇率、卖空所得或未交收资金限制。价格必须有限且为正,数量和lot为正整数,完整计划数量必须已经是lot整数倍,证券不能重复。旧股卖出在夹具中明确可执行;真实卖出若受阻,不能提前把假想卖款放进新篮子的资金预算,再宣称缩放结果可行。
满规模A含费成本八十一,B八十一,C二十一,合计183,大于可用149。只看本金会得到180,仍遗漏三单位费用。某些篮子本金恰好够用,加入佣金才透支,因此资金预检必须使用真正成本函数。目标金额、拟交易本金与最终现金支出应分别列出,不能都叫仓位金额。
Investor.gov费用说明区分交易费用与持续费用。本例只选合成每笔一单位,不代表真实券商完整收费,也没有包含所有税费。数量缩放后重新计费,不能假设满规模佣金可以与本金同倍率下降;最低收费或阶梯模型更需要独立核对。
对所有新开仓使用同一个因子
候选因子位于零和一之间,每个请求数量都乘相同因子,再按自己的lot向下取整。正数量才生成订单并收费,零数量既不下单也不收费。先汇总全部候选成本,再决定是否改变现金和持仓。试算函数没有账户副作用,也不在每轮搜索时记录拒单。
完整篮子能够负担时直接用因子一,否则做五十轮二分,保存最后一个可负担候选。脚本用Python Fraction精确分数表达因子和整数取下限,避免浮点近似在一股边界改变数量。这是指定复现政策,不代表任意复杂、非单调收费都能沿用同样搜索,更不宣称得到所有可能组合中的最优配置。
当前固定非负单笔费加数量向下取整,使成本随因子非递减,但离散跳跃意味着不能简单用149除183。搜索可以无限接近一但仍小于一,此时A七股、B七股、C零股;恰好到一,两只八股与C一股同时恢复,完整成本又超过预算。因子很接近一,不表示最终数量也几乎完全相同,离散边界必须展示。
选中A与B各花七十一,共142。可用149扣除后现金七,持仓A七、B七,连旧股卖出累计费用三。以进入价估值,两股市值140,加现金七为147,等于初始权益150减已付费用三。共同因子应用于计划层,经过取整与费用后,最终权重比例并不保证与原请求完全相同。
解释未满足部分,不捏造真实部分成交
每条计划输出请求、选中和未满足数量:A八变七,差一;B八变七,差一;C一变零,差一。诊断只给C记录一次insufficient_capital,因为它在满规模是有效正数量,资金适配后才从篮子中消失。不能把这件事改称原本不符合最小股数,从而隐藏真正的资金原因。
五十轮候选试算不是五十次市场失败订单,不应每次追加zero_size或收费。脚本核C拒绝记录只有一次,真正新买单只有两张。若把试算次数混入订单计数,会夸大执行活动,也让读者难以判断费用究竟来自完成交易还是算法内部迭代。两类记录应有不同层级与用途。
未满足计划数量也不代表券商部分成交。本例在提交之前就决定较小订单,没有提交八股再从交易所观察七股成交。真实订单生命周期、部分执行、撤单和结算需要另外证据。计划短缺与市场成交状态必须分开,不能用同一个“部分成交”标签给一段本地缩放逻辑增加并不存在的市场真实性。
用不同资金机制构造顺序反例
三个计划共有六种排列,所有排列运行后的完整结果都必须相同,包括选中订单、未满足数量、拒绝列表和现金。标识排序稳定输出,共同资金适配保证第一只证券没有优先耗尽预算。仅把输入排序,并不能让一个本质上先到先得的算法满足输入顺序无关。
另一个故意不同的贪心控制,逐个尽量买满后才考虑下一个。按A、B、C顺序得到A八、B六、C零,调换顺序则数量变化。它不是只换一组价格,而是换了资金机制,即使余额非负,仍违反预先声明的顺序不变性。读者可以直接比较数量,而不必通过末收益猜测哪条路径不同。
另一个非法计划控制用一百股一手却请求一股或一百五十股,两者都在资金适配之前抛出plan_not_board_lot_multiple。这是完整输入未落在数量网格,不是资金不足;与C不同,它们从未成为符合所给手数的有效满规模订单,不能从拒绝账里无声消失。
零预算控制不产生订单,现金仍零,每个满规模有效计划只记一次资金拒绝。预算恰为183时则直接接受三张全量订单,因子一。两者分别检查空候选和恰好够用的边界。非有限或负可用现金直接拒绝,不能静默解释成融资额度,测试范围也不包括资金本来为负的保证金系统。
用真实选中数量完成账户桥
独立终端夹具以十一卖A七股,净收七十六,以九卖B七股,净收六十二,两笔各收费一。原现金七加两笔款,最终现金145、持仓零、累计费用五。旧股价格不变,A赚七、B亏七,价格损益抵消,起始权益150到145的差额全部来自费用,不能把某个未买入的C收益算进来。
完整执行顺序是卖OLD十股、买A七、买B七、卖A七、卖B七。精确订单断言防止一个看似合理末值隐藏不同篮子。结束恒等式为145等于初始权益150减费用五;若误用最初现金五十作为业绩分母,会遗漏账户开始已经拥有的OLD市值,夸大后续资产增长。
这不是历史策略收益,所有价格和手数都是合成,终端卖出也只是明确给定的会计事件。扩展到其他市场需要其生效lot、执行资格、费用和独立现金账户,不代表券商融资、跨币种资金池或真实结算已实现。缩放保证的是本例成本约束下的计划,而不是所有市场环境中的可成交承诺。
下载并保留计划层证据
下载完整示例,使用Python 3.12及以上执行python R601.py。仅依赖标准库和合成输入,输出初始资产、减仓所得、完整成本、共同因子、选中订单、拒绝数量与最终账本,不访问券商、数据源或产品回测器。读者可以按每单股数乘价格再收费自行重算。
实际诊断时,先比较真实减仓后的可用现金、执行价、费用函数、lot和全部新增请求,再查看末权益。冻结输入后重放排列;若首个差异在计划层,改信号阈值不能修复,若旧股减仓受阻,则先修正资金前提。记录首个不一致环节,比用最终账户差额倒推某只股票“优先成交”更直接。
OLD在本窗口开始前已经持有,本阶段只记录其卖出,不再补一张虚构买入或重复扣历史进入费用。初始资产150是这次诊断的起点;若需要覆盖更长账户历史,应另外导入旧成交和现金流水,再把边界资产连接起来。不能因为本例能解释五单位费用,就声称已恢复此前全部成本与收益。
常见问题
相同缩放因子保证最终权重完全同比例吗?
不保证。它作用在离散取整与费用之前,最终数量、现金和实际权重仍需单独列明。
C缺失的一股是券商部分成交吗?
不是,C在合成计划阶段被移除,未形成可执行订单。真实市场部分成交需要独立生命周期模型。