策略、订单与共享账户

推荐入口为 Backtest(data, config=RunConfig(...)).run(strategy),日线和分钟统一使用 BarExecution。策略是普通函数,也可以传入 WeightTargets/PositionTargets。每次运行新建账户、订单和权益状态,只复用不可变行情的准备结果。

数据可见性与执行时点

策略在 bar 完成、账户估值后调用,只能通过 ctx.history 读取已完成的历史。新订单最早下一根 bar 执行,参考开盘价、该 bar 成交量和配置滑点,成交在 bar 完成时可见。日线的下一根就是下一输入交易日。

行情使用原始价,研究窗口可选 adjustment="asof"。历史窗口不足时返回已有部分,不会自动跳过策略。ctx.session 为交易日,ctx.now 为当前时点,ctx.bar_index 为从零开始的 bar 位置,包含停牌 bar。

Context 是当前回调的视图,回调结束后不能继续下单或修改记录。它防止常规使用中的未来读取,不是任意 Python 代码的隔离沙箱。

意图与撤销

调用

行为

order(symbol, quantity, valid_for="next_bar", limit_price=None, max_spend=None)

有符号固定股数,负数卖出;买单可设置含费用的支出上限(元),返回订单 ID

target_positions({symbol: quantity})

持续尝试达到绝对股数,省略的证券保持原目标;返回意图 ID 元组

target_weights(weights, rebalance=False, sizing="close")

全组合权重,省略证券为零;选择按收盘或下一 bar 开盘定量

cancel_order(order_id)/cancel(intent_id)

分别撤销订单余量/持续意图,ID 不混用

相同目标权重与定量模式延续原股数,不每天重新配比;rebalance=True 显式重算。新目标替换同证券的旧目标并撤销旧子单。

权重定量时点

  • sizing="close"(默认):决策 bar 收盘时,按收盘权益和收盘价确定股数;下一开盘跳空不改变股数。

  • sizing="execution":保留权重,下一根 bar 开盘处理交收/公司行动后、所有订单成交前,以整个账户的原始开盘价统一估值、定量一次。权益包括待入账股份、应收分红并扣除应付税款;可用于买入的仍只有未占用现金。它不会读取该 bar 的收盘价、高低价或最终成交量来确定股数,也不会给策略开放未来行情。

两种模式都按数量规则取整,定量时不扣预计费用、不把滑点价当作估值价。定量完成后,停牌、涨跌停或部分成交不会重新改变目标;跨日重试沿用股数,公司行动仍按规则调整。需要重新定量时再次调用并设置 rebalance=True。非零权重缺少定量时点的有效估值时明确报错;零权重直接确定为零股,不要求定量价,但实际卖出仍须满足成交条件。

execution 描述定量时点,不保证一次成交或成交后精确达到目标权重:整手、费用、滑点、可卖量、参与率和共享现金仍会造成偏差。此模式需使用 RunConfig/BarExecution;WeightTargets(..., sizing="execution") 使用相同规则。

账户与排序

所有证券共享现金。先卖后买,同一方向按订单提交顺序处理,同证券订单共用 bar 成交容量。全组合权重目标按 MarketData.symbols 的声明顺序生成子单,股数目标按传入映射顺序。卖出回款可用于后续买入,但已冻结资金和应付税款不能被其他订单挪用。

买入单按提交时已知价格/限价及费用估算冻结金额,开盘定量的目标子单按该开盘价及费用估算。冻结是资源预留,不是订单总支出的硬上限。执行时可使用自己的冻结额加未占用现金,不能挪用其他挂单冻结额或应付税款。先卖后买产生的可用回款可以补充买入资金。无成交时不额外冻结全部空闲现金;成交按实际支出扣减预留、最低为零,撤单和到期释放余量。

例如目标 500 股、前收 10 元、开盘 10.2 元,零费用且账户有 10000 元时可一次买足,剩余 4900 元;不会仅因原先预留 5000 元而少买。

若必须限制支出,使用 ctx.order("A", 500, max_spend=5000)。上限以元输入,只支持买单,必须为正,覆盖整笔订单所有部分成交的成交金额与手续费;不随 bar 重置。它和单股价格保护 limit_price 可以同时使用。上限比可用现金更紧时,未完成原因记为 spending_limit;真实现金不足仍为 insufficient_cash。目标接口本身不设置金额上限。

ctx.account 提供现金、可用现金、冻结、权益、应收分红、税款和不可变持仓;应收分红不能提前买入。

买入后的可卖日由该笔买入时的历史规则和输入交易日历确定。周末不计作交易日;未解锁股份不能卖出。没有卖空、杠杆、期间入金/出金或样本末尾强制平仓。

订单生命周期

next_bar 在下一根尝试一次;day 在首个可执行 bar 的交易日内延续,午休保留、日终到期。一个订单可以部分成交多次。

持续目标会每日生成合法子单,日终子单到期不放弃目标。单笔股数越过申报上限会拒绝;目标子单受上限及最小数量约束。不足合法申报量的残差保留为未达目标,不暗中超买。支持规则内的完整零股清仓。

result.intents 记录目标,orders 记录委托,fills 记录实际成交。最后一根 bar 的新订单留有未执行记录,不在数据结束后补成交。

费用与价格

佣金按同一订单累计成交额计算,再扣除此前已收佣金;最低佣金不会在每次部分成交重复收取。印花税、过户费按每笔成交与成交日规则计算,费用按分半入;金额账本使用万分之一元整数,研究指标使用浮点数。

停牌、未上市/退市、零量、买入触及涨停或卖出触及跌停都会阻止相应成交。参与率限制按证券共用,滑点按不利方向对齐 tick。slippage_policy 选择拒绝越界、截到边界或保留研究成本;用户限价始终保护最终结算价。详细行为见分钟与 bar 执行。

权益与可复现性

每日开盘处理应收到账、股份入账和交收;日终登记分配权益、按已入账净股份变化计提股息税。送转会调整持续股数目标,目标差额包含待入账股份,避免重复买入。具体税务身份和时间范围见公司行动。

显式策略参数、数据指纹、执行配置和依赖版本保存到 run_info。有状态策略对象需要调用者为每次运行重建;闭包、全局变量和外部文件不会自动完整归档。预计算目标必须严格对齐行情时间轴,见预计算执行。

直接传 initial_cash、costs 而不传 config/execution 的日线调用使用单片段开盘模型,不含参与率和多次成交。使用手册统一采用 RunConfig;不要将它与这些独立构造参数混用。