Jupyter Notebook 反复运行天勤策略内存涨:close 与内核习惯

发布时间:2026/6/5 12:49:47

Jupyter Notebook 反复运行天勤策略内存涨:close 与内核习惯 前言很多国内期货量化的研究阶段在Jupyter Notebook里进行改两行均线参数就 ShiftEnter 重跑比整脚本重启方便。天勤TqSdk的TqApi在创建时会建立与行情、交易服务的连接并维护订阅若每个单元格都api TqApi(...)而从不api.close()旧连接和缓冲仍占内存表现为越跑越卡、行情乱跳、甚至连接数超限——这在期货量化教学群里非常常见并非天勤“泄漏”而是资源未释放的使用习惯。本文说明 Notebook 场景下如何正确关闭 Api、与wait_update循环的关系、异步register_update_notify的注意点并区分研究用 Notebook与7×24 实盘进程。不默认你已区分 TqSim 与 TqKq。一、期货研究在 Notebook 里常做什么典型操作拉几分钟 1 分钟或 5 分钟 K 线、看datetime是否推进、试一笔模拟TargetPosTask、画均线。这些都需要TqApi活着。问题在于同一内核里重复创建多个 Api每个都在后台收国内期货行情内存与连接叠加。错误模式示意# 单元格 1apiTqApi(TqSim(),authTqAuth(...))# 跑 while 或若干 wait_update# 单元格 2 再次执行apiTqApi(TqSim(),authTqAuth(...))# 旧 api 未 close二、正确习惯单例 先关后建ifapiinglobals()andapiisnotNone:api.close()apiTqApi(TqSim(),authTqAuth(快期账户,密码))或研究一段结束后Kernel → Restart再只创建一个 Api。长而久的while True建议放到.py用命令行跑Notebook 只跑有限次wait_update做片段验证。三、try/finally 保证 closeapiTqApi(TqSim(),authTqAuth(...))try:for_inrange(50):api.wait_update()# 观察 kl.iloc[-1].datetime 是否变化finally:api.close()回测单元格捕获BacktestFinished后同样应close()否则同一内核里第二次TqBacktest可能遇到资源未释放问题。四、异步 notify 与 Notebook若在协程 demo 里使用register_update_notify官方建议async with api.register_update_notify() as update_chan若手动拿 channel用完需await update_chan.close()否则会泄漏。另不要在协程里直接wait_update()天勤会报错Notebook 里混同步 while 与 async task 时要只保留一套模型。五、调试循环不要无限占着 Api调试可加次数上限或wait_update(deadline...)避免单元格永远运行导致无法 close。实盘部署在国内服务器上时用 systemd 等单进程守护不要用合盖休眠的笔记本扛夜盘。六、与期货实盘的关系Notebook 适合验证“K 线 datetime 触发是否正确”“一笔模拟单持仓是否变化”国内期货连续交易与风控应放到独立.py进程配置与实盘相同的is_changing规则避免 Notebook 特有的一次性变量残留进生产。总结Jupyter 反复运行天勤策略导致内存涨主因是多个TqApi未close()。期货量化研究应在单内核保持单 Api重跑前先close()或重启内核长循环用脚本异步 notify 用 async with 或显式 close。弄清TqApi是长连接资源而不是普通变量Notebook 体验会稳定很多。FAQ1%reset 够吗建议先api.close()再 reset。2两个 Notebook 同账户每内核独立避免同账户多端抢线。3内存仍涨检查是否缓存巨大 DataFramedel 不再用的表。4能否 pickle Api不要每会话重建。风险提示本文讨论开发环境不构成投资建议。

相关新闻