期货回测配置

回测平台支持的期货行情数据包括:快照,分钟频率,日频。

引擎配置说明:

接口 createBacktester 的参数 config 和接口 createBacktestEngine 的参数 userConfig 的配置可参考下表:

key 说明 备注
"startDate" 开始日期 必须配置,DATE 类型。例如 2020.01.01。
"endDate" 结束日期 必须配置,DATE 类型。例如 2020.01.01。
"strategyGroup" 策略类型 必须配置,STRING 类型,例如 "futures"。
"cash" 初始资金 必须配置,DOUBLE 类型。
"dataType" 行情类型 必须配置,INT 类型,可选值为:
  • 1:快照
  • 3:分钟频
  • 4:日频
  • 7:快照+分钟频率(该模式仅由接口 createBacktester 创建的引擎支持,且不支持 JIT)
"frequency" 快照数据以指定频率合成 Bar

INT 类型, 默认为 0

  • 当 frequency = 0 时,不合成 Bar 行情,该参数无效。

  • 当 dataType=1 且 frequency > 0 时,引擎内部合成 frequency 频率的 Bar 行情触发 onBar 回调函数

"msgAsTable" 行情的数据格式 BOOL 类型,默认为 false。
  • false:字典

  • true:表(只能通过接口createBacktestEngine 创建引擎)

"matchingMode" 订单撮合模式 INT 类型,根据行情类型模式不同,可选值为:
  • 1:

    • 日频:以收盘价撮合订单。

    • 分钟频:行情时间大于订单时间时撮合订单。

  • 2:

    • 日频:以开盘价撮合订单。

    • 分钟频:行情时间等于订单时间时,以当前行情的收盘价撮合订单,后续未完成订单撮合订单同 matchingMode=1。

  • 3:以委托价格成交撮合订单。

当 dataType=1 时,该参数设置为 1 或 2 时无效,订单默认由模拟撮合引擎撮合。

"enableSettlementPrice" 是否使用结算价计算每日盘后权益指标 BOOL 类型,可选配置。
  • true:每日盘后计算组合权益指标时,使用行情表中该标的最新的 settlementPrice 作为估值价格。此设置仅对 getDailyTotalPortfolios 接口,以及 afterTrading 回调函数中调用的 getTotalPortfolios 生效。在其他回调函数中调用 getTotalPortfolios 时,仍使用最新价。
  • false:计算组合权益指标时使用最新价。

当设置为 true 时,输入的快照、分钟级或日级行情数据必须包含 settlementPrice 字段,否则回测报错。

"benchmark" 基准标的 STRING 或 SYMBOL 类型。

例如 "A2305",指定用于 getReturnSummary 接口进行收益表现比较的基准标的。

"latency" 订单延时 INT 类型,单位为毫秒,用来模拟用户订单从发出到被处理的时延。默认为0,表示无延迟。
"maintenanceMargin" 维保比例 DOUBLE 类型,默认 0.75,取值0~1.0 之间。
"enableAlgoOrder" 是否开启算法订单 BOOL 类型:
  • true:开启

  • false:不开启

"futuresType" 期货品种类型,如股指期货,商品期货等 STRING 或 SYMBOL 类型。

目前只支持期货

"enableIndicatorOptimize" 是否开启指标优化 BOOL 类型,默认为 false。
  • true:开启
  • false:不开启
"isBacktestMode" 是否为回测模式 BOOL 类型,默认为 true。
  • true:回测模式

  • false:模拟交易模式

"dataRetentionWindow" 开始指标优化时数据保留的窗口 STRING 类型。 当 enableIndicatorOptimize = true 时生效。
  • 当 isBacktestMode = true 时,默认为 "None",可设置为:

    • "ALL":全部数据保留

    • "20d":按交易日天数保留数据,如 "20d" 代表 20 个交易日。

    • "None":不保留数据

    • "20":按数据条数保留数据,如 "20" 代表每个 symbol 保留最新的 20 条数据。

  • isBacktestMode = false 时,无需设置

"addTimeColumnInIndicator" 指标订阅时是否给指标数表增加时间列 BOOL 类型,默认 false
  • true:增加

  • false:不增加

"context" 策略逻辑上下文类结构 DICT 类型,策略全局变量构成的字典,如:
context=dict(STRING,ANY)
context["buySignalRSI"]=70.
userConfig["context"]=context
"callbackForSnapshot" 快照行情触发回调模式
仅当 dataType = 1 时生效。INT 类型,可选值为:
  • 0:仅触发 onSnapshot 回调函数。
  • 1:同时触发 onSnapshot 和 onBar 回调函数。
  • 2:仅触发 onBar 回调函数。
默认为 0。当 frequency > 0 时,必须触发 onBar 回调函数,即 callbackForSnapshot 必须设置为 1 或 2。
"orderBookMatchingRatio" 与行情订单薄的成交百分比 仅当 dataType = 1 时生效。DOUBLE 类型,默认为 1.0,取值范围为 0~1.0。
"matchingRatio" 区间撮合比例 仅当 dataType = 1 时生效。DOUBLE 类型,默认为 1.0,取值范围为 0~1.0。默认值与 orderBookMatchingRatio 相同。
"msgAs​PiecesOnSnapshot" onSnapshot 回调的触发方式 BOOL 类型,默认值为 false。
  • false:每条行情数据依次触发 onSnapshot 回调函数。
  • true:同一时间戳的所有行情数据同时触发 onSnapshot 回调函数。
注:
不同的期货行情类型(dataType)支持的引擎配置参数有所不同。其中,callbackForSnapshot、orderBookMatchingRatio、matchingRatio 仅在 dataType = 1(快照行情)时生效。

基本信息表说明

createBacktester 和setSecurityReference 接口的 securityReference 参数所使用的基本信息表,其字段说明如下。

securityReference 支持以下两种模式:

  • 静态模式:表中不包含 tradeDate 列。回测期间始终使用已设置的基本信息。

  • 按交易日模式:表中包含 tradeDate 列。每个交易日盘前,引擎按以下规则读取每个期货合约的基本信息:

    • 若存在 tradeDate 等于当前交易日的记录,使用该记录。

    • 否则,使用 tradeDate 小于或等于当前交易日的最新一条记录。

静态模式和按交易日模式不能混用。创建引擎时传入的 securityReference 是否包含 tradeDate,必须与后续通过 Backtest::setSecurityReference 传入的基本信息表保持一致。

字段 类型 说明
symbol SYMBOL或STRING 期货合约代码
tradeDate DATE 交易日,不能包含空值。
multiplier DOUBLE 合约乘数
marginRatio DOUBLE 保证金比率
tradeUnit DOUBLE 合约单位
priceUnit DOUBLE 报价单位
priceTick DOUBLE 价格最小变动单位
commission DOUBLE 费用
deliveryCommissionMode INT 计费方式:
  • 1:费用*手数
  • 2:费用*金额
lastTradingDay DATE

合约最后交易日,在该日期收盘时会自动平仓。

自动平仓时不触发 onOrder 和 onTrade,在交易明细表中 orderStatus 为 1 且 label 为 __auto_close_position_on_last_trading_day 的记录表示由系统自动执行的平仓。

deliveryPrice DOUBLE

交割价。

最后交易日执行自动平仓时,系统将按照以下价格优先级成交。若高优先级价格未设置或不可用,则依次采用下一级价格:

1. 交割价

2. 结算价(settlement)

3. 最新成交价(lastPrice)

intradayClosingFee DOUBLE 日内平仓费用

在按交易日模式下,可通过不同 tradeDate 的记录更新 marginRatio、commission 等基本信息。对于同一合约,multiplier 和 tradeUnit 始终使用首次加载的值;后续记录中的修改不会生效,系统也不会报错。

快照

行情数据结构说明

通过 Backtest::appendQuotationMsg 写入的行情表结构如下:
colName=["symbol","symbolSource","timestamp","tradingDay","lastPrice","upLimitPrice",
        "downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
        "offerQty","highPrice","lowPrice","prevClosePrice","settlementPrice",
        "prevSettlementPrice"]
colType= ["STRING","STRING","TIMESTAMP","DATE","DOUBLE","DOUBLE","DOUBLE","LONG","LONG",
        "DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE","DOUBLE","DOUBLE",
        "DOUBLE","DOUBLE"]
messageTable=table(10000000:0, colName, colType)
注:
  • 上述为快照行情(callbackForSnapshot = 0)时的输入表结构,不适用于由快照行情合成 Bar 的场景。

  • 字段名须严格与下表中的定义严格一致。除首列必须为 symbol 外,其它字段的顺序不作要求。此外,输入表还可以包含 INT,DOUBLE,STRING 类型的扩展字段,或包含名为 signal 的 DOUBLE[] 类型的字段。

快照行情数据表必需字段如下所示:
字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
timestamp TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间成交买数量
totalOfferQty LONG 区间成交卖数量
bidPrice DOUBLE[] 委托买价
bidQty LONG[] 委托买量
offerPrice DOUBLE[] 委托卖价
offerQty LONG[] 委托卖价
highPrice DOUBLE 最高价
lowPrice DOUBLE 最低价

快照合成 Bar 行情的表结构(frequency > 0,callbackForSnapshot = 1 或者 2):

colName=["symbol","symbolSource","timestamp","tradingDay","lastPrice","upLimitPrice",
        "downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
        "offerQty","highPrice","lowPrice","signal","prevClosePrice","settlementPrice",
        "prevSettlementPrice","open", "close","low","high","volume"]
colType= ["STRING","STRING","TIMESTAMP","DATE","DOUBLE","DOUBLE","DOUBLE","LONG","LONG",
        "DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE","DOUBLE","DOUBLE","DOUBLE",
        "DOUBLE","DOUBLE","DOUBLE","DOUBLE",
        "DOUBLE","DOUBLE","LONG"]
messageTable=table(10000000:0, colName, colType)
注:
  • 快照行情合成 Bar 时,输入表还必须包含 open、close、low、high 和 volume 五个字段。

  • 字段名须严格与下表中的定义严格一致。除首列必须为 symbol 外,,其他字段的顺序不作要求。此外,输入表还可以包含 INT,DOUBLE,STRING 类型的扩展字段,或包含名为 signal 的 DOUBLE[] 类型字段。

快照行情数据表(用于合成 Bar 行情)的必需字段如下所示:

字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
timestamp TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间成交买数量
totalOfferQty LONG 区间成交卖数量
bidPrice DOUBLE[] 委托买价
bidQty LONG[] 委托买量
offerPrice DOUBLE[] 委托卖价
offerQty LONG[] 委托卖价
highPrice DOUBLE 最高价
lowPrice DOUBLE 最低价
open DOUBLE 合成 Bar 行情的开盘价
close DOUBLE 合成 Bar 行情的收盘价
low DOUBLE 合成 Bar 行情的最低价
high DOUBLE 合成 Bar 行情的最高价
volume LONG 合成 Bar 行情的成交量

回测行情回放结束时,发送一条 symbol 为 “END” 的消息:

messageTable=select top 1 * from messageTable
update messageTable set symbol="END" 
Backtest::appendQuotationMsg(engine,messageTable)

策略回调函数说明

快照行情回调函数 onSnapshot 的输入参数为 msg。

当 msg 为字典时,它是一个以 symbol 为 key 、以对应快照行情数据(snapShot)为 value 的字典。每个快照行情数据对象包含字段如下:

字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
timestamp TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间成交买数量
totalOfferQty LONG 区间成交卖数量
bidPrice DOUBLE[] 委托买价
bidQty LONG[] 委托买量
offerPrice DOUBLE[] 委托卖价
offerQty LONG[] 委托卖价
highPrice DOUBLE 最高价
lowPrice DOUBLE 最低价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价
open DOUBLE 合成 Bar 行情的开盘价。仅当 dataType = 1 或 2 ,且 callbackForSnapshot = 1 或 2 时包含该字段。
close DOUBLE 合成 Bar 行情的收盘价。仅当 dataType = 1 或 2 ,且 callbackForSnapshot = 1 或 2 时包含该字段。
low DOUBLE 合成 Bar 行情的最低价。仅当 dataType = 1 或 2 ,且 callbackForSnapshot = 1 或 2 时包含该字段。
high DOUBLE 合成 Bar 行情的最高价。仅当 dataType = 1 或 2 ,且 callbackForSnapshot = 1 或 2 时包含该字段。
volume LONG 合成 Bar 行情的成交量。仅当 dataType = 1 或 2 ,且 callbackForSnapshot = 1 或 2 时包含该字段。
注:
  • 快照合成 Bar 行情时, 输入参数 msg 还包含 open、close、low、high 和 volume 五个字段。

  • 当 callbackForSnapshot = 1 时,还会触发 onBar 回调函数,其输入参数 msg 的数据结构如下。

K 线行情回调函数 onBar 的输入参数为 msg。

当 msg 为字典时,它是一个以 symbol 为 key 、以对应分钟频率的 K 线数据为 value 的字典。每个 K 线包含字段如下:

字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
timestamp TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间成交买数量
totalOfferQty LONG 区间成交卖数量
bidPrice DOUBLE[] 委托买价
bidQty LONG[] 委托买量
offerPrice DOUBLE[] 委托卖价
offerQty LONG[] 委托卖价
highPrice DOUBLE 最高价
lowPrice DOUBLE 最低价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价

分钟频或日频

行情数据结构说明

通过 Backtest::appendQuotationMsg 写入的行情表结构如下:
colName=["symbol","symbolSource","tradeTime","tradingDay","open","low","high","close",
"volume","amount","upLimitPrice","downLimitPrice","prevClosePrice",
"settlementPrice","prevSettlementPrice"]
colType=["SYMBOL","SYMBOL","TIMESTAMP","DATE","DOUBLE","DOUBLE","DOUBLE","DOUBLE","LONG","DOUBLE",
"DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE"]
messageTable=table(10000000:0, colName, colType)
注:

字段名须与下表中的定义严格一致。除首列必须为 symbol 其他字段的顺序不作要求。此外,行情数据表可以包含以下扩展字段: INT,DOUBLE,STRING 类型的字段,以及名为 signal 的 DOUBLE[] 类型的字段。

分钟频行情数据表必需字段如下所示:
字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
tradeTime TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
open DOUBLE 开盘价
low DOUBLE 最低价
high DOUBLE 最高价
close DOUBLE 收盘价
volume LONG 成交量
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价

回测行情回放结束时,发送一条 symbol 为 “END” 的消息:

messageTable=select top 1 * from messageTable
update messageTable set symbol="END" 
Backtest::appendQuotationMsg(engine,messageTable)

策略回调函数说明

K 线行情回调函数 onBar的输入参数为 msg。

当 msg 是字典时,它是一个以 symbol 为 key 、以对应分钟频率的 K 线数据为 value 的字典。每个 K 线包含字段如下:

字段 类型 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
timestamp TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间成交买数量
totalOfferQty LONG 区间成交卖数量
bidPrice DOUBLE[] 委托买价
bidQty LONG[] 委托买量
offerPrice DOUBLE[] 委托卖价
offerQty LONG[] 委托卖价
highPrice DOUBLE 最高价
lowPrice DOUBLE 最低价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价

快照+分钟频率

行情数据结构说明

通过接口 appendQuotationMsg 向引擎中插入数据时,msg 为一个字典,其 key 支持 'ohlc','snapshot' 或 'indicator' 三个 key:

  • 'ohlc' 为分钟频行情表,结构如下:
    colName=["symbol","symbolSource","tradeTime","tradingDay","open","low","high","close",
    "volume","amount","upLimitPrice","downLimitPrice","prevClosePrice",
    "settlementPrice","prevSettlementPrice"]
    colType=["SYMBOL","SYMBOL","TIMESTAMP","DATE","DOUBLE","DOUBLE","DOUBLE","DOUBLE","LONG","DOUBLE",
    "DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE"]
    messageTable=table(10000000:0, colName, colType)
    注:

    字段名须与下表中的定义严格一致。除首列必须为 symbol 其他字段的顺序不作要求。此外,行情数据表可以包含以下扩展字段: INT,DOUBLE,STRING 类型的字段,以及名为 signal 的 DOUBLE[] 类型的字段。

    分钟频行情数据表必需字段如下所示:
    字段 类型 备注
    symbol SYMBOL 期货代码
    symbolSource STRING 交易所
    tradeTime TIMESTAMP 时间戳
    tradingDay DATE 交易日/结算日期
    open DOUBLE 开盘价
    low DOUBLE 最低价
    high DOUBLE 最高价
    close DOUBLE 收盘价
    volume LONG 成交量
    upLimitPrice DOUBLE 涨停价
    downLimitPrice DOUBLE 跌停价
  • 'snapshot' 为快照行情表,结构如下:
    colName=["symbol","symbolSource","timestamp","tradingDay","lastPrice","upLimitPrice",
            "downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
            "offerQty","highPrice","lowPrice","prevClosePrice","settlementPrice",
            "prevSettlementPrice"]
    colType= ["STRING","STRING","TIMESTAMP","DATE","DOUBLE","DOUBLE","DOUBLE","LONG","LONG",
            "DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE","DOUBLE","DOUBLE",
            "DOUBLE","DOUBLE"]
    messageTable=table(10000000:0, colName, colType)
    注:
    • 上述为快照行情(callbackForSnapshot = 0)时的输入表结构,不适用于由快照行情合成 Bar 的场景。

    • 字段名须严格与下表中的定义严格一致。除首列必须为 symbol 外,其它字段的顺序不作要求。此外,输入表还可以包含 INT,DOUBLE,STRING 类型的扩展字段,或包含名为 signal 的 DOUBLE[] 类型的字段。

    快照行情数据表必需字段如下所示:
    字段 类型 备注
    symbol SYMBOL 期货代码
    symbolSource STRING 交易所
    timestamp TIMESTAMP 时间戳
    tradingDay DATE 交易日/结算日期
    lastPrice DOUBLE 最新成交价
    upLimitPrice DOUBLE 涨停价
    downLimitPrice DOUBLE 跌停价
    totalBidQty LONG 区间成交买数量
    totalOfferQty LONG 区间成交卖数量
    bidPrice DOUBLE[] 委托买价
    bidQty LONG[] 委托买量
    offerPrice DOUBLE[] 委托卖价
    offerQty LONG[] 委托卖价
    highPrice DOUBLE 最高价
    lowPrice DOUBLE 最低价
  • 'indicator' 为供 onBar 回调使用的历史指标数据表。设置该表后,不能同时通过 subscribeIndicator 订阅 ohlc 或 kline 类型的指标。该表必须包含 symbol 和 timestamp 两个字段,其余字段可作为扩展字段,类型必须为 INT、DOUBLE 或 STRING。