策略回测架构
由qxiao创建,最终由small_q 被浏览 514 用户
策略回测架构
使用BigTrader交易引擎进行策略回测时采取的是事件驱动机制,策略回测有特定的架构,架构包含以下多个事件函数。
名称 | 说明 |
---|---|
initialize | 策略初始化函数,只触发一次。可以在该函数中初始化一些变量,如读取配置等 |
before_trading | 策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等 |
handle_bar | 当根bar行情通知函数,每根bar时间周期会触发,包括日线和分钟。注册多个合约时,每个合约都会调用一次handlebar。handlebar和handle_data不能同时使用。 |
handle_data | 行情通知函数,频率支持日线和分钟。注册多个合约时,handle_data会等待所有合约数据到齐后统一触发一次。例如多合约套利时,需要同时处理多个合约建议用handle_data。handle_data和handlebar不能同时使用。 |
handle_tick | Tick快照行情通知函数,每个标的的行情有变化时则会触发。 |
handle_l2trade | 逐笔成交行情更新时的处理函数 |
handle_order | 委托回报通知函数,每个订单状态有变化时会触发。 |
handle_trade | 成交回报通知函数,有成交时会触发。 |
主要事件函数说明
有两个使用频率很高的函数:initialize函数和handle_data(handle_bar)函数,理解了这两个函数开发策略就再也不是什么难事了,结合下面K线图来理解这两个函数。
从图中可以看出,其实一共有26个事件,即26根K线,第一根K线既对应黑色箭头,又对应灰色箭头,其余都只对应灰色箭头。Initialize函数只在第一个事件上调用,即第一根K线,因此很多初始设置可以放在Initialize函数里面。每个K线都对应灰色箭头,表示每个事件都会调用handle_data函数,即从第一根K线到最后一根K线都会运行handle_data一次,于是很多策略逻辑部分就可以放在handle_data里。
策略典型代码结构
下图给出了一个典型策略需要的代码结构
from biglearning.api import M
#给每个策略取一个名字
STRATEGY_NAME = "STRATEGY_name"
def initialize(context):
"""策略初始化函数,只触发一次。可以在该函数中初始化一些变量,如读取配置和全局使用数据"""
#输出关键日志
msg = "initialize:"
context.write_log(msg, stdout=1)
def before_trading(context, data):
"""盘前处理,策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等"""
#输出关键日志
msg = "before_trading dt:{}".format(data.current_dt)
context.write_log(msg, stdout=1)
#如果需要处理tick数据,需要添加tick处理函数:handle_tick(context, tick):
#如果需要使用handle_data,需要添加处理函数:handle_data(context, data):
def handle_data(context, data):
"""Bars行情通知函数,每个bar时间周期会触发,包括日线和分钟"""
#输出关键日志
msg = "handle_bar dt:{}".format(data.current_dt)
context.write_log(msg, stdout=1)
def handle_order(context, order):
"""委托回报通知函数,每个订单状态有变化时会触发"""
#输出关键日志
msg = "handle_order data:{}".format(order.log_str())
context.write_log(msg, stdout=1)
def handle_trade(context, trade):
"""成交回报通知函数,有成交时会触发"""
#输出关键日志
msg = "handle_trade data:{}".format(trade.log_str())
context.write_log(msg, stdout=1)
backtest_result = M.hftrade.v2(
instruments=['000002.SZA'],
start_date='2022-01-01',
end_date='2023-01-01',
handle_data=handle_data,
initialize=initialize,
volume_limit=0.025,
order_price_field_buy='open',
order_price_field_sell='close',
capital_base=1000000,
frequency='daily',
price_type='真实价格',
product_type='股票',
plot_charts=True,
backtest_only=False,
benchmark='000300.HIX'
)
一些通用说明
- 该框架对标的,均是 代码.后缀 的形式,如 000001.SZA, 600000.SHA, RB2110.SHF,注意这里期货代码时,统一为 大写产品代码+4位年月+后缀,而目前后缀主要有:DCE, CZC, SHF, INE, CFX。其中,郑商所的实际交易代码为 SR109,但在该平台中为 SR1109 或 SR2109,即补全为4位年月的数字。
- 回测时,平台内部会自动读取历史行情进行回测,当然也支持外部传入自定义历史数据进行回测。
\