问题描述
解决方案
PTrade 中 initialize 函数的作用与执行次数
在 PTrade 量化交易平台中,initialize(context) 是一个必选的基础结构函数,它是策略运行的唯二必须定义的函数之一(另一个是 handle_data)。
1. 执行次数
initialize 函数只会在回测和交易启动的时候运行一次。
无论你的策略是日线级别、分钟级别还是 tick 级别,该函数都仅在策略最开始启动时被触发一次,用于完成所有的前期准备工作。
2. 主要作用
initialize 函数的主要作用是初始化策略的全局配置和全局变量。具体包括但不限于以下几个方面:
- 设置交易标的(股票池):使用
set_universe()设定策略需要操作的股票或合约。 - 设置比较基准:使用
set_benchmark()设定策略评价指标的基准标的(如沪深300指数)。 - 设置交易环境参数(主要用于回测):如设置佣金费率
set_commission()、滑点set_slippage()、成交比例set_volume_ratio()等。 - 设置定时任务:使用
run_daily()或run_interval()设定周期性运行的自定义函数。 - 初始化全局变量:通过全局对象
g定义策略中需要在不同函数间共享的变量(例如g.security = '600570.SS')。
3. 可调用的 API 接口
在 initialize 函数中,你只能使用特定的 API 接口。常用的包括:
set_universe, set_benchmark, set_commission, set_slippage, set_parameters, run_daily, run_interval, get_trading_day, get_user_name, is_trade 等。
4. 代码示例
以下是一个典型的 initialize 函数配置示例:
def initialize(context):
# 1. 初始化全局变量
g.security = '600570.SS'
# 2. 设置我们要操作的股票池
set_universe(g.security)
# 3. 设置参考基准为上证50
set_benchmark('000016.SS')
# 4. 设置回测佣金费率(万分之三,最低5元)
set_commission(commission_ratio=0.0003, min_commission=5.0)
# 5. 设置每天 9:31 定时运行自定义函数
run_daily(context, my_custom_function, time='9:31')
def my_custom_function(context):
log.info("定时任务执行")
def handle_data(context, data):
# 策略主逻辑
pass
注意事项:
在实盘交易环境中,如果服务器环境重启拉起交易,initialize 函数会被重新调用。因此,在设置全局变量 g 时,需注意配合持久化处理(如 pickle)或使用 set_parameters(not_restart_trade="1") 来避免变量被意外重置。