历史文档

【历史文档】高阶技巧-如何在模拟中使用持久化变量

由qxiao创建,最终由small_q 被浏览 185 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/data/home

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

简介

有时候遇到回测和模拟信号不一致,其中一个原因是使用了自定义的全局变量,导致回测和模拟行为不一致。其中有两个关键因素:

1、回测时初始化函数只执行一次,而模拟每天都要跑一次初始化函数,相当于策略在模拟中每天都要重新跑。

2、所以要在模拟中持久化全局变量,需要用平台提供context.extension变量,以字典的格式来存放用户的全局变量。例如context.extension['my_flag'] = 1。

实现步骤

1、平台内置的全局变量context.trading_day_index从0开始每个交易日都会增加1,利用此内置变量在主函数中对我们自己的全局变量进行初始化,这样就能保证在模拟中只初始化一次此变量。例如:

if context.trading_day_index == 0:
  context.extension['date_flag']  = 0

2、在主处理函数中根据自己需要对全局变量进行复制,例如:

#date_flag每日变化
if  context.extension['date_flag']  == 0:
	context.extension['date_flag']  = 1
else:
	context.extension['date_flag']  = 0

样例

如下样例实现了每两天进入一次主函数处理逻辑(直接用context.trading_day_index也能实现此功能)

https://bigquant.com/experimentshare/b853cff7eff0417aa9f48cad9465d7b3

\

标签

模拟交易回测
{link}