执行容量与每日净值模拟
语言:简体中文 · English
portfolio_backtester.execution_sim 提供容量成交、执行后每日净值和理想每日净值三类模拟。该子包具有独立公开入口,当前没有从包根重新导出。
CorporateAction 用于可选的原始价格公司行为账本。它记录现金应收、送转股应收及实际结算日,要求调用者显式提供规范化事件和 price_basis="raw"。缺少结算日期或原始价格标记时,模拟会阻断。
入口
from portfolio_backtester.execution_sim import (
ExecutionSimConfig,
simulate_capacity_execution,
simulate_execution_adjusted_nav,
simulate_ideal_daily_nav,
PreparedExecutionTables,
to_unified_ledger,
UnifiedLedger,
)
simulate_capacity_execution输出订单、成交和汇总。prepare_execution_tables预先整理可复用的执行数据表simulate_execution_adjusted_nav输出每日净值、订单、成交和汇总simulate_ideal_daily_nav假设目标仓位立即完成,用作充分流动性对照to_unified_ledger把模拟结果适配为路线图定义的八个统一账本字段,也可通过ExecutionSimResult.to_unified_ledger与ExecutionAdjustedNavResult.to_unified_ledger方法调用UnifiedLedger是统一账本的数据容器,包含targets、orders、fills、daily_positions、daily_cash、daily_nav、cost_breakdown和turnover_breakdown
配置
ExecutionSimConfig 默认关闭。启用后的主要默认值如下:
| 参数 | 默认值 | 含义 |
|---|---|---|
portfolio_value |
1,000,000 | 组合名义规模 |
participation_rate |
0.05 | 单日成交参与率 |
liquidity_cols |
medadv20_amount、amount |
容量约束使用的流动性列 |
liquidity_notional_multiplier |
1.0 | 将流动性列换算为组合名义货币单位的乘数,Tushare amount 为千元时应设为 1,000 |
buy_max_days |
5 | 买单最长等待天数 |
sell_max_days |
10 | 卖单最长等待天数,也可用 SELL_UNTIL_NEXT_REBALANCE 延续到下一次调仓 |
zero_fill_abort_days_buy |
5 | 连续零成交后的买单终止天数 |
unfilled_buy_action |
keep_cash |
未成交买单保留现金 |
unfilled_sell_action |
keep_position |
未成交卖单保留持仓 |
build_execution_sim_config 负责读取配置映射,required_execution_sim_columns 返回启用模拟后需要的价格和流动性列。
audit_delisting_exits 使用成交名义金额和同日执行价重建模拟股数,核对退市日前仓位归零,且退市当日及之后没有成交。输入是 fills、pricing、证券到退市日期的映射及 price_col。发现残余仓位、退市后成交或缺失执行价时会抛出错误。该审计只覆盖模拟账本,不证明交易所现金结算或未建模的公司行为。
输入与结果
目标持仓至少需要调仓日、建仓日、证券代码和权重。当前模拟只处理多头正权重。行情表需要交易日期、证券代码、价格列和配置中的流动性列。买卖方向可分别传入可交易标记。
ExecutionSimResult 包含 summary、orders 和 fills。ExecutionAdjustedNavResult 额外包含 daily,其中记录每日净值、现金和敞口等结果。
其余公开对象包括 SELL_UNTIL_NEXT_REBALANCE、TradeFeeModel、PreparedExecutionTables、describe_execution_sim_config 和 describe_trade_fee_model。它们分别用于延迟卖出期限、准备后的执行表、费用协议以及配置和费用说明的序列化。
容量模拟根据参与率限制成交,并保留未成交余量。round_lot、enforce_t1、enforce_price_limits 和 enforce_listing_status 可显式启用整手、T+1、价格限制与上市状态检查,默认关闭。调用方仍须提供相应的原始价格、涨跌停价格、上市状态和买卖可交易字段。停牌原因与券商拒单规则不会自动补全。
整手数量与价格限制必须使用一致的真实股份和价格单位。不能直接把复权价格对应的合成份额视为真实可交易股数,也不能把原始涨跌停价格与复权成交价格直接比较。使用长期历史数据时,还需单独验证分红、拆并股等公司行动的处理。
使用边界
理想每日净值用于比较充分流动性情形。执行后每日净值用于观察延迟成交、未成交和成本拖累。两者都属于研究模拟,不能替代真实订单状态、账户现金账本和券商风控。
在份额账本入口 simulate_execution_adjusted_nav 中,round_lot 只控制买入。独立参数 sell_round_lot 默认为 None,保留调整后份额的连续卖出行为。设为正整数后,部分卖出的成交量先受请求量、流动性容量和 T+1 可卖量约束,再向下取整到该股数的整数倍。只有三个约束都容许卖出全部实际持仓时,才允许一次清空整数零股。受容量或结算限制的清仓仍按部分卖出处理。容差不会增加可成交数量,配置描述会序列化此参数。
启用时须使用原始价格和原始股数。显式传入 price_basis="adjusted" 会报错。省略时由调用方保证价格单位正确。卖出遇到小数持仓会抛出 ValueError,公司行动产生的小数权益须由调用方先行结算,不能静默取整。仅允许 min(lot_tolerance, 1e-8) 股以内的浮点运算尾差,并保留其原值,不据此放宽容量。权重账本入口 simulate_capacity_execution 无法执行股数约束,因此拒绝此参数。该机制由调用方显式选择,不自动推断交易所规则。