def initialize(context):
#
设置一个股票池,getStocks用来做选股函数
g.MAXOFPOOL = 20
initialize函数是必须架构,注意该函数的参数context,当用log.info(context)
显示该变量内容时得到以下输出结构:
- UserContext({'current_dt': datetime.datetime(2016, 7,
13, 9, 20), 'portfolio': Portfolio({'_unsell_positions': {},
'portfolio_value': 20000.0, 'cash': 20000.0, 'starting_cash':
20000.0, 'returns': 0.0, 'capital_used': 0.0, 'positions': {},
'positions_value': 0}), 'previous_date': datetime.date(2016, 7,
12), 'run_params': RunParams({'frequency': u'day', 'type':
'simple_backtest', 'start_date': datetime.date(2016, 7, 13),
'end_date': datetime.date(2016, 7, 14)}), 'universe':
[]})
可以理解这是量化程序的公共区,存放该量化程序的公共变量
注意initialize如果在回测时并不会每个时间点都执行,而是在最开始执行该逻辑,所以如果在initialize内就选好股票范围,那么回测时该选股范围就不会随着每天的数据发生动态变化。
比如:
def initialize(context):
#
设置一个股票池,getStocks用来做选股函数
g.MAXOFPOOL = 20
g.stocks =
getStocks(context)
# 设置所有可能要买的股票集
set_universe(g.stocks)
和以下逻辑比对
def initialize(context):
#
设置一个股票池,getStocks用来做选股函数
g.MAXOFPOOL =
20
# 代码块-2
# 这个函数也是必须定义的,每个交易时间间隔都要执行一次
def handle_data(context, data):
#注意公共变量要在调用函数之前定义
g.stocks =
getStocks(context)
#
设置所有可能要买的股票集
set_universe(g.stocks)
逻辑段handle_data是每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次,则后面的代码段可以实现动态市值选股,前者逻辑段只能按第一天的市值选股
set_universe是聚宽提供的API,有关API的定义聚宽都已经给出了详细解释和说明,
综合说明,一个策略必须包含初始段initialize和每时间点逻辑段handle_data,也可以自行定义如下函数getStocks用来实现指定功能,并优化整个量化程序的功能结构。
def getStocks(context):
# 获取所有的股票