期货量化模拟误连实盘:天勤配置与环境变量分离
前言最怕的事之一是本地调试脚本连上了实盘账户或者 Git 里提交了带密码的配置同事 clone 下来直接跑。我习惯把「环境模拟/实盘」和「密钥」都从代码里拆出去用配置文件加环境变量启动时打印当前模式人为确认一眼再跑。天勤TqSdk构造TqApi时传入TqSim、TqKq或TqAccount改一行就能换环境若写死在策略深处就容易改漏。下面给一套个人和小团队能落地的分离方式。一、不要把密码写进仓库禁止authTqAuth(真实账号,真实密码)# 提交到 Git应改为从环境变量或本地不提交的secrets.yaml读取importosfromtqsdkimportTqAuth useros.environ[TQ_USER]pwdos.environ[TQ_PASSWORD]authTqAuth(user,pwd)secrets.yaml加入.gitignore。CI 机器用密钥管理服务注入环境变量。二、用配置区分 sim / kq / liveconfig.yaml示例不含密码mode:sim# sim | kq | livesymbol:SHFE.rb2510启动脚本读取 mode创建对应交易单元importosimportyamlfromtqsdkimportTqApi,TqAuth,TqSim,TqAccountdefload_cfg():withopen(config.yaml,encodingutf-8)asf:returnyaml.safe_load(f)defcreate_api(cfg):authTqAuth(os.environ[TQ_USER],os.environ[TQ_PASSWORD])modecfg[mode]ifmodesim:returnTqApi(TqSim(),authauth)ifmodekq:fromtqsdkimportTqKqreturnTqApi(TqKq(),authauth)ifmodelive:returnTqApi(TqAccount(期货公司,资金账号,密码),authauth)raiseValueError(unknown mode)cfgload_cfg()print( 当前模式:,cfg[mode], 确认后 3 秒内继续)apicreate_api(cfg)实盘模式前增加人工确认或二次环境变量ALLOW_LIVE1防止误点。三、目录与路径分离模拟日志、状态文件放data/sim/实盘放data/live/避免读错持久化状态策略状态文件也应分目录存放。云主机部署时用绝对路径环境变量TQ_DATA_DIR。四、团队规范建议项做法密钥仅环境变量或密钥库模式config.yaml 的 mode启动打印实盘单独分支或单独启动脚本代码评审禁止合并含密码的 diff五、和 Jupyter、多脚本的关系Notebook 里不要硬编码TqAccount用同一create_api(cfg)入口。多个策略文件import同一配置模块避免某文件漏改仍连实盘。总结模拟误连实盘多数是配置和密钥没分离。天勤切换环境靠构造参数策略层应集中创建TqApi用 mode 环境变量双保险启动时显性打印当前模式。建议今天就把仓库里的明文密码清掉、轮换一次快期密码并加上config.example.yaml供同事复制。FAQ1config.yaml 能放账号吗最好不要只放 mode、合约等非敏感项。2Docker 怎么注入docker run -e TQ_USER... -e TQ_PASSWORD...3多账户多个环境变量前缀如TQ_USER_A。4误连后如何自查查启动日志 mode、查api._account类型调试用对照客户端成交。风险提示本文用于工程安全实践不构成投资建议。实盘操作务必双人复核或权限隔离。