【历史文档】策略回测-基本方法
由bigquant创建,最终由small_q 被浏览 1131 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发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
\
准备数据函数
定义
prepare(context)
[回调函数] 准备数据函数,运行过程中只调用一次,在 initialize 前调用,准备回测中需要用到数据。
参数:
- context – 交易context
- .start_date (字符串): 开始时间 - 在回测模式下,值为 M.trade的参数值;在实盘模式,值为交易日期
- .end_date (字符串): 结束时间 - 在回测模式下,值为 M.trade的参数值;在实盘模式,值为交易日期
- .instruments (字符串列表): 交易中用到的股票列表。初始值为 M.trade的参数值。可以在 prepare 里修改此值,设置交易股票列表。
- .options (dict): 用户自定义数据,值为 M.trade的参数值。可以在 prepare 函数中修改,修改后的数据可以在 initialize 和 handle_data 等函数中使用到。可以在prepare 里修改此值,存放后续要用到的数据。
初始化函数
定义
initialize(context)
[回调函数] 初始化函数,整个回测中只在最开始时调用一次,用于初始化一些账户状态信息和策略基本参数,context可以理解为一个全局变量,会被传递给策略中所有其他的方法,在回测中存放当前账户信息和策略基本参数便于会话。
如果把context理解成一个全局的对象,该对象的各个属性值可以通过context加'.'来获取(形如context.some_property)。 context为全局变量,全局变量的含义指在主函数、盘前处理函数都可以随时调用和修改。
参数:
context – 交易context
.portfolio (Portfolio) - 交易账户 Portfolio
.trading_calendar (TradingCalendar) - 交易日历 TradingCalendar
示例代码
def initialize(context):
# 初始化策略基本参数,比如双均线策略中短期均线周期和长期均线周期
context.short_length = 7
context.long_length = 21
context.bar_count_index = 0
def handle_data(context, data):
print('当前Bar索引: ', context.bar_count_index)
context.bar_count_index += 1 # 不断更新Bar索引
主逻辑函数
定义
handle_data(context, data)
[回调函数] 必须实现的函数,该函数每个单位时间会调用一次,如果按天回测,则每天调用一次;如果按分钟,则每分钟调用一次。在回测中,可以通过对象data获取单只股票或多只股票的时间窗口价格数据。一般策略的交易逻辑和订单生成体现在该函数中。主逻辑函数简称主函数。
参数
context – 交易context
data – 股票信息 BarData
示例代码
def handle_data(context, data):
# 交易逻辑放在这里
context.order_target_percent(context.symbol('000002.SZA'), 1.0)
盘前处理函数
定义
before_trading_start(context, data)
[回调函数] 每日开盘前调用一次,该函数是可选函数。比如昨天的交易信号确认出来的订单可以在今天的盘前处理函数中进行取消,以便对订单做更精细处理。
参数:
- context – 交易context,和handle_data中的参数一样
- data – 股票数据对象 BarData,和handle_data中的参数一样
支持函数
- .portfolio (Portfolio)- 交易账户 Portfolio
- .trading_calendar (TradingCalendar)- 交易日历
- TradingCalendar data – 股票信息BarData
示例代码
def before_trading_start(context, data):
for open_orders in context.get_open_orders().values():
for order in open_orders:
sid = order.sid
price = data.current(sid, 'price')
if math.isnan(price): # 股票停牌:没有价格数据,撤销订单以释放资金占用
context.cancel_order(context.order)
continue
除了这四个基本方法之外,你也可以自己定义其他方法/函数,只要包含context参数,那么就能获取和使用策略参数和账户数据。