如何用 IBKR 搭建 machine-learning-for-trading 的 paper 篮子再平衡并做启动对账

发布时间:2026/9/14 18:02:10
如何用 IBKR 搭建 machine-learning-for-trading 的 paper 篮子再平衡并做启动对账 如何用 IBKR 搭建 machine-learning-for-trading 的 paper 篮子再平衡并做启动对账【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading在 machine-learning-for-trading 仓库里跑通一次真实的 paper 交易循环核心任务不只是下单而是三件事启动时用SafeBroker.connect()把上次会话持久化的状态文件和经纪商当前持仓做对账startup reconciliation再用当前持仓 vs 目标持仓的差量delta生成订单篮子最后可选把篮子提交到 IBKR paper 账户并核对成交。本文基于第 25 章 25.2 节的12_ib_basket_rebalance_demo它在固定 20 只美股大盘股宇宙上做每日再平衡完整覆盖上述流程。这个 notebook 有一个硬前提它要求真实可达的 IB paper 会话TWS 或 IB Gateway 不可达时直接打印配置清单并退出绝不静默换成 mock 数据。准备条件运行环境仓库的ml4t环境。本地用uv时需要带liveextra 同步依赖该 extra 提供ib_async2.0以及alpaca-py、python-okxuv sync --extra live仓库自带的ml4tDocker 镜像已经安装好--extra live的依赖集见 envs/ml4t/Dockerfile用 Docker 跑则不需要这一步。IB 端配置这些是 notebook 内置连接失败清单要求的项启动 TWS 或 IB Gateway 并登录paper 账户Edit - Global Configuration - API - Settings中勾选Enable ActiveX and Socket ClientsSocket 端口为7497TWS paper 是 7497Gateway paper 是 4002127.0.0.1必须在 Trusted IPs 里或者取消勾选Read-Only API确认没有其他客户端占用client_id12第 25 章 IB 类 notebook 各用固定 CLIENT_ID03 用 10、11 用 11、12 用 12避免背靠背运行时 socket 冲突。时间窗口该 notebook 属于环境受限deferred类需要 IB Gateway/TWS 处于运行状态且美股 RTH 时段为纽约时间 09:30–16:00、周一至周五。验证环境是否就绪docs/installation.md 的通用门槛uv run python scripts/verify_installation.py每个组件打印一行PASS/FAIL全部 PASS 再进入下一步。关键参数在 notebook 的 parameters 单元里确认SUBMIT_PAPER_ORDERS是显式开关其余参数定义了部署边界。参数块原文如下默认值即文档值IB_HOST 127.0.0.1 IB_PORT 7497 CLIENT_ID 12 ACCOUNT # 留空则使用会话中的托管账户 UNIVERSE [AAPL, MSFT, GOOGL, AMZN, META, NVDA, JPM, V, JNJ, PG, UNH, HD, DIS, MA, BAC, KO, PEP, XOM, CVX, WMT] TOP_K_LONG 5 TARGET_NOTIONAL_USD 50_000 MAX_POSITION_USD 15_000 MAX_ORDER_USD 12_000 MAX_DAILY_LOSS_USD 5_000 WARMUP_DAYS 60 OUTSIDE_RTH False # 设 True 允许盘前盘后成交仅市价单 MARKET_DATA_TYPE: int | None 3 # 3 delayed quotes SUBMIT_PAPER_ORDERS False # 显式 opt-in 才真实下单默认只规划各参数的作用以 notebook 说明为准TARGET_NOTIONAL_USD多头腿的名义金额均分到 top-K每只 50,000 / 5 10,000 美元MAX_POSITION_USD/MAX_ORDER_USD/MAX_DAILY_LOSS_USD风险上限由SafeBroker强制——超限会在订单到达 IB 之前抛错不是建议值MARKET_DATA_TYPETWS 接受 1real time、2frozen、3delayed、4delayed frozen。留None表示沿用会话配置适合 paper 账户自带 live Level 1 订阅的情况没有实时订阅的 paper 账户会拒绝 MARKET 单报 No market data available...所以 notebook 请求 delayed 报价3SUBMIT_PAPER_ORDERS默认False时整个流程是只读的planning-only返回订单意图而不做任何经纪商变更只有显式设为True的 paper 运行才把篮子并发地通过SafeBroker提交出去。执行主路径从仓库根目录运行生产模式直接跑.py版本headless 环境可加MPLBACKENDAgg PLOTLY_RENDERERjson前缀uv run python 25_live_trading/12_ib_basket_rebalance_demo.py流程按以下顺序走每一步都有明确的停止条件第 1 步连接 IB paper 会话。用IBBroker(host, port, client_id, market_data_type)连接asyncio.wait_for(broker.connect(), timeout10.0)设 10 秒超时。连不上时打印上面那份 TWS 配置清单并SystemExit(1)。连上后还有一个账户门槛managedAccounts()返回的每个账户必须以DU开头IB paper 账户前缀否则断开并抛RuntimeError——非 paper 会话直接拒收。第 2 步启动对账startup reconciliation。用LiveRiskConfig把原始 broker 包进SafeBrokerrisk_config LiveRiskConfig( max_position_valueMAX_POSITION_USD, max_order_valueMAX_ORDER_USD, max_daily_lossMAX_DAILY_LOSS_USD, max_data_staleness_seconds120, shadow_modenot SUBMIT_PAPER_ORDERS, state_filestr(STATE_FILE), ) safe_broker SafeBroker(broker, risk_config) run_demo(safe_broker.connect()) report safe_broker.reconciliation_reportconnect()会把上一会话持久化的快照与 broker 当前的持仓、挂单做 diff。report[clean]为假时notebook 打印差异明细missing_positions、unexpected_positions、quantity_mismatches、missing_pending_orders、unexpected_pending_orders五个键并停止让你在 TWS 里人工查明原因后再重跑。对账干净则打印Reconciliation: clean (state file state file path)第 3 步从同一 broker 会话取 warmup 日线。通过reqHistoricalDataAsync并行asyncio.gather拉 20 只股票的WARMUP_DAYS60天日线whatToShowTRADES、barSizeSetting1 day、useRTHTrue。原始 bar 会先做 SHA-256 审计raw_rows、duplicate_dates再解析并排除当前 UTC 日期当天的未完成 bar。注意这是有意的设计warmup 数据和下单走同一个 IB 会话避免用研究期数据源对陈旧价格做排名。第 4 步信号与目标篮子。信号是 20 日对数动量momentum_20d log(close) - log(close.shift(20))按信号取前TOP_K_LONG5为多头腿每只名义金额 10,000 美元、按最后收盘价取整股其余 15 只目标为 0。第 5 步持仓对账出订单篮子。从 broker 拉当前持仓get_positions_async与目标持仓 full-join 后计算delta_qty target_qty - current_qty只保留非零差值——这张 delta 表就是本次要提交的订单清单也是审计面。第 6 步可选缓存参考价并提交篮子。SafeBroker.submit_order_async会在资产没有近期价格快照时拒单所以先用每只股票最近完成的日线收盘价调record_market_snapshot填充缓存。之后若SUBMIT_PAPER_ORDERSTrue全部腿通过asyncio.gather并发提交 MARKET 单limit_price携带 last_close 作为风控提示outsideRthOUTSIDE_RTH每腿独立记录statussubmitted / rejected: 原因一腿失败不影响其他腿。若保持默认False这一步断言所有记录都是dry_run不做任何经纪商变更。结果验证按运行模式看不同的成功标志规划模式默认配置横幅显示Order submission: DISABLED (planning only)Reconciliation: clean (state file ...)delta 表打印N orders needed to reach target执行摘要打印orders_planned、broker_mutations: 0和planned_notional示例输出实际数值随行情变化Execution summary: orders_planned : 5 broker_mutations : 0 planned_notional : $50,000.00paper 提交模式提交后 notebook 轮询 broker 持仓wait_for_basket_to_settle超时 15 秒、每秒一次确认每只预期多头都出现在持仓里然后打印Post-submission residual deltas: N——为 0 时输出All positions reconciled to target.非零残差不要当 bug 直接处理它可能意味着 kill-switch 或风险上限在篮子中途拦住了某腿需要对照第 7 步的每腿status逐条区分rejected行或有fill_price与last_close大偏差的行都应人工调查执行摘要给出成交口径的orders_filled、notional和slippage_bps_vwap相对最后收盘价的加权平均滑点单位 bps。文档定位它是监控信号而非 KPI连续几次再平衡间滑点漂移是第 26 章 MLOps 监控的输入。排查与限制连不上 TWSnotebook 会打印完整 setup checklist见准备条件。逐项核对端口TWS paper 7497 / Gateway paper 4002、Trusted IPs 含 127.0.0.1、client_id12 未被占用。连接尝试本身只有 10 秒超时。拒绝非 paper 会话managed account 不以DU开头会直接RuntimeError这是有意设计不要把实盘账户接进来跑。启动对账不干净典型原因是上一会话遗留盘后挂单、手动在 TWS 里平仓、或上次持久化之后才有成交进来。先在 TWS 里人工查清如果差异是预期的比如手动清空了仓位按 notebook 提示删除状态文件重置后再跑。章节 README 给出的清理路径是~/.ml4t/live_state/basket_demo_*.json这是删除文件的命令仅在演练重跑之前执行# 副作用删除上一轮演练持久化的风险状态文件SafeBroker 快照 rm ~/.ml4t/live_state/basket_demo_*.json删除前先确认路径与你上一轮输出里打印的 state file 一致。paper 账户无实时行情订阅MARKET 单会被拒No market data available...这正是默认MARKET_DATA_TYPE3delayed quotes的原因。RTH 之外运行美股 RTH 是纽约时间 09:30–16:00、周一至周五OUTSIDE_RTHFalse时盘前盘后不下市价单。数据源纪律warmup bar 与参考价都来自执行订单的同一个 IB 会话。若用研究期 loader 替代cutoff 日期、存活宇宙、供应商都可能不同信号会在模型未验证过的数据上排名——这是 25.6 管线一致性讨论明确警告的。盘后平仓的账户级设置notebook 末尾对当次开仓提供 MOCMarket-On-Close平仓路由到收盘竞价但交易所截止时间、停牌和经纪商拒绝仍可能导致不成交。另注意 TWS 的Global Configuration → API → Settings → Auto-cancel API orders on disconnect在多数 paper 账户上默认开启——开着它notebook 一断连 IB 就会撤掉已入队等待收盘的 MOC 单启用 paper 提交的运营者必须先核对这个账户级设置。下一步章节 README 指出的延伸路径10_safety_risk_demo演示SafeBroker在本篮子每一腿上都执行的 kill-switch、状态持久化与风险上限的失败模式13_runtime_safety_showcase则覆盖数据过期拒绝、kill-switch 跨重建存活以及SafeBroker.connect()针对刻意错开的状态文件的对账行为——它不需要真实 broker可作为对账机制的无环境练习场。完整章节背景见 25_live_trading/README.md环境搭建细节见 docs/installation.md。【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考