全局变量用错,策略会记住不该记的东西
发布时间:3小时前阅读:3
写策略时很容易随手定义一个全局变量记状态,比如记录上次买入价格、累计交易次数、当前持仓阶段。单次回测看不出问题,一旦多标的、多周期或者反复运行,状态就会串味。
一、状态为什么会残留
Python 的模块级变量在进程存活期间一直存在。回测跑完一轮,变量没有重置,第二轮接着用上一轮的值,结果自然不对。
更隐蔽的是多标的情况。同一份代码为十只股票服务,如果状态存在全局变量里,十只股票会共用同一个变量,互相覆盖。
二、正确的存放位置
状态应该存在框架提供的上下文对象里,按标的分别存放。每只标的、每个策略实例都有自己的一份,互不干扰。
初始化函数里显式赋值,不要依赖默认值。默认值只在第一次创建时生效,重跑时不会重置。
三、哪些东西属于状态
持仓成本、建仓日期、已加仓次数、上次信号方向、移动止盈的最高价、连续亏损计数。这些都必须按标的隔离。
哪些不属于状态:均线值、指标计算结果。这些每根K线都能重算,存起来反而容易忘记更新。
四、可变默认参数的坑
函数定义里写一个空列表作为默认参数,这个列表在所有调用之间共享,会越积越多。这是语言层面的陷阱,不报错,只是结果慢慢偏掉。
规避方式很简单:默认值用空值,函数内部再创建容器。
五、多策略同进程时更危险
如果几个策略跑在同一个进程里,全局变量就是共享内存。一个策略改了变量,另一个策略读到脏数据,而且不会有任何提示。
要么每个策略独立进程,要么把所有状态都收进各自的上下文对象,绝不用模块级变量。
六、怎么验证没有串味
做一个简单测试:只跑一只标的,记录最终持仓和收益;再把它和另外九只一起跑,对比这只标的的结果。如果两者不一致,说明状态被共享了。
安静的错误最贵。它不会让程序崩,只会让结果错,而且错得很有说服力。
股票开户欢迎找我!可以申请万0.854的股票佣金、etf 可转债佣金万0.5、国债逆回购一折(百万分之一)!量化软件QMT+ptrade免费使用!还有888、999资金靓号等你选!
温馨提示:投资有风险,选择需谨慎。



问一问
从业认证

+微信
分享该文章
