期货回测配置
回测平台支持的期货行情数据包括:快照,分钟频率,日频。
引擎配置说明:
接口 createBacktester 的参数 config 和接口
createBacktestEngine 的参数 userConfig 的配置可参考下表:
| key | 说明 | 备注 |
|---|---|---|
| "startDate" | 开始日期 | 必须配置,DATE 类型。例如 2020.01.01。 |
| "endDate" | 结束日期 | 必须配置,DATE 类型。例如 2020.01.01。 |
| "strategyGroup" | 策略类型 | 必须配置,STRING 类型,例如 "futures"。 |
| "cash" | 初始资金 | 必须配置,DOUBLE 类型。 |
| "dataType" | 行情类型 | 必须配置,INT 类型,可选值为:
|
| "frequency" | 快照数据以指定频率合成 Bar |
INT 类型, 默认为 0
|
| "msgAsTable" | 行情的数据格式 | BOOL 类型,默认为 false。
|
| "matchingMode" | 订单撮合模式 | INT 类型,根据行情类型模式不同,可选值为:
当 |
| "enableSettlementPrice" | 是否使用结算价计算每日盘后权益指标 | BOOL 类型,可选配置。
当设置为 true 时,输入的快照、分钟级或日级行情数据必须包含 settlementPrice 字段,否则回测报错。 |
| "benchmark" | 基准标的 | STRING 或 SYMBOL 类型。 例如 "A2305",指定用于
|
| "latency" | 订单延时 | INT 类型,单位为毫秒,用来模拟用户订单从发出到被处理的时延。默认为0,表示无延迟。 |
| "maintenanceMargin" | 维保比例 | DOUBLE 类型,默认 0.75,取值0~1.0 之间。 |
| "enableAlgoOrder" | 是否开启算法订单 | BOOL 类型:
|
| "futuresType" | 期货品种类型,如股指期货,商品期货等 | STRING 或 SYMBOL 类型。 目前只支持期货 |
| "enableIndicatorOptimize" | 是否开启指标优化 | BOOL 类型,默认为 false。
|
| "isBacktestMode" | 是否为回测模式 | BOOL 类型,默认为 true。
|
| "dataRetentionWindow" | 开始指标优化时数据保留的窗口 | STRING 类型。 当 enableIndicatorOptimize = true 时生效。
|
| "addTimeColumnInIndicator" | 指标订阅时是否给指标数表增加时间列 | BOOL 类型,默认 false
|
| "context" | 策略逻辑上下文类结构 | DICT 类型,策略全局变量构成的字典,如:context=dict(STRING,ANY) context["buySignalRSI"]=70. userConfig["context"]=context |
| "callbackForSnapshot" | 快照行情触发回调模式 | 仅当 默认为 0。当 dataType = 1 时生效。INT 类型,可选值为:
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 相同。 |
| "msgAsPiecesOnSnapshot" | onSnapshot 回调的触发方式 |
BOOL 类型,默认值为 false。
|
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 | 计费方式:
|
| lastTradingDay | DATE |
合约最后交易日,在该日期收盘时会自动平仓。 自动平仓时不触发 |
| 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。
