Backtest

为了精准测试和验证策略在实盘交易中的效果,DolphinDB 基于分布式存储和计算、多范式的编程语言和模拟撮合引擎插件,实现了事件型回测引擎插件。该插件支持沪深交易所所有标的的逐笔+快照、逐笔(逐笔合成快照触发策略)、快照和快照+成交、分钟和日频行情策略回测;以及期货和期权的快照、分钟和日频的行情,以及银行间的现券等策略回测。

回测引擎主要包括四个核心部分:用户自定义策略函数、策略配置与创建、行情数据回放、执行回测引擎并获取回测结果。回测引擎提供了多个事件函数,包括策略初始化,每日盘前和盘后回调函数,逐笔、快照和K线行情的回调函数,委托和成交回报函数等。用户可以根据实际情况,在策略初始化中定义指标,并在其他相应的回调函数中编写自定义策略,实现不同事件下的策略逻辑。其次,用户可以配置策略的行情源、资金、订单延时和成交比例等信息。根据策略和配置,用户可以创建相应的回测引擎,然后回放数据源并执行回测引擎。最后,通过不同引擎接口获取反映回测表现的结果信息。

安装插件

版本要求

DolphinDB Server 2.00.12.2 和 3.00.0.2 及更高版本,支持 X86-64 的 Linux 和 Windows。

安装步骤

  1. 在 DolphinDB 客户端中使用 listRemotePlugins 命令查看插件仓库中的插件信息。

    注意:仅展示当前操作系统和 server 版本支持的插件。若无预期插件,可在 DolphinDB 用户社区进行反馈。

    login("admin", "123456")
    listRemotePlugins()
  2. 使用 installPlugin 命令完成插件安装。

    installPlugin("Backtest")
  3. 使用 loadPlugin 命令加载插件。

    loadPlugin("Backtest")

插件依赖

回测引擎插件内部依赖模拟撮合引擎插件,因此加载回测引擎之前需要先加载模拟撮合引擎,该插件同样可以通过插件市场安装。

  1. 使用 installPlugin 命令完成模拟撮合引擎插件安装。

    installPlugin("MatchingEngineSimulator")
  2. 使用 loadPlugin 命令加载模拟撮合引擎插件。

    loadPlugin("MatchingEngineSimulator")

用户配置模块说明

用户可以配置回测的开始和结束日期,初始资金,手续费和印花税,订单的撮合模式。

key 说明 备注
startDate 开始日期
endDate 结束日期
strategyGroup 策略类型

股票:"stock"

期货:"future"

期权:"option"

cash 初始资金
commission 手续费
tax 印花税
dataType 行情类型:0:逐笔+快照1:快照2:快照+成交3: 分钟频率4:日频 frequency>0 and dataType=0 时,行情为逐笔行情,引擎内部合成 frequency 频率的快照行情触发回调函数 onSnapshot
matchingMode 订单撮合模式

日频:

模式一,以收盘价撮合订单

模式二,以开盘价撮合订单

分钟频率:

模式一,行情时间大于订单时间时撮合订单

模式二,行情时间等于订单时间时以当前行情的收盘价撮合订单,后续未完成订单撮合订单同模式一

benchmark 作为基准的标的
frequency frequency>0时,行情为逐笔行情,引擎内部合成 frequency 频率的行情触发 onSnapshot 默认为0
msgAsTable 行情的数据格式 行情的数据格式,table 或 dict
latency 订单延时
orderBookMatchingRatio 与行情订单薄的成交百分比
matchingRatio 快照区间成交百分比
maintainanceMargin 维保比例 期货回测时使用:标量(0-1),默认0
enableSubscriptionToTickQuotes 是否订阅逐笔行情 设置为 true 时,需定义 onTick 回调函数
outputQueuePosition 是否需要获取订单在行情中的位置 设置为 true 时,当订单还没有完全成交时,可以通过 getOpenOrders 接口实时获取优于委托订单价格的行情未成交委托总量,次于委托订单价格的行情未成交委托总量,等于委托订单价格的行情未成交委托总量,等于委托订单价格的但早于委托的行情未成交委托总量;订单提交时,订单状态明细表也可以获取以上统计指标
prevClosePrice 前收盘价数据表

为以下三列的表:[symbol,tradeDate,prevClosePrice]

在深交所的逐 笔行情时,科创版股票的前收盘价必须设置,否则订单撮合结果可能不符合预期

stockDividend 分红除权基本信息表 [symbol, endDate, annDate, recordDate, exDate, payDate, divListdate, bonusRatio, capitalConversion, afterTaxCashDiv, allotPrice, allotRatio]

分红除权基本信息表说明如下:

字段 名称
symbol 股票代码
endDate 分红年度
annDate 预案公告日
recordDate 股权登记日
exDate 除权除息日
payDate 派息日
divListDate 红股上市日
bonusRatio 每股送股比例
capitalConversion 每股转增比例
afterTaxCashDiv 每股分红(税后)
allotPrice 配股价格
allotRatio 每股配股比例
userConfig=dict(STRING,ANY)        
userConfig["startDate"]= 2022.04.13       
userConfig["endDate"]= 2022.04.13
// 策略类型,暂时固定股票
userConfig["strategyGroup"]= "stock"
// 初始资金
userConfig["cash"]= 100000000
// 手续费,        
userConfig["commission"]= 0.00015
// 印花税,
userConfig["tax"]= 0.001        
// 以指定的频率通过逐笔数据合成快照。(只有快照行情时,frequency设置无效)
userConfig["frequency"]= 1000
// dataType=0表示逐笔模式撮合,
// dataType=1表示按快照模式一撮合,
// dataType=2按快照模式二撮合
userConfig["dataType"]= 2
// 与行情订单薄的成交百分比
userConfig["orderBookMatchingRatio"]=1
// 快照模式下,快照的区间成交百分比
userConfig["matchingRatio"]=1
// tick的数据格式,table或dict
userConfig["msgAsTable"]= false
try{Backtest::dropBacktestEngine("backtestMM")}catch(ex){print ex}
engine = Backtest::createBacktestEngine("backtestMM", userConfig,, 
initialize, beforeTrading,onTick,onSnapshot,onOrder,onTrade,afterTrading,finalize)

行情数据模块说明

沪深交易所标的

逐笔+快照或逐笔合成快照行情

  • 行情为逐笔+快照或逐笔合成快照,输入表结构为:

colName=`msgTime`msgType`msgBody`symbol`channelNo`seqNum
colType= [TIMESTAMP, SYMBOL, BLOB,STRING,INT,LONG]
messageTable=streamTable(10000000:0, colName, colType)
注:

标的代码 symbol 必须带有交易所标识(".XSHG",".XSHE")结尾,如 "600000.XSHG",不然会报错。

带有逐笔行情时,msgType 有 "entrust", "trade", "snapshot", "END" 四种,使用逐笔合成指定频率的快照时可以不用 "snapshot" 行情,其中三个表结构分别如下:

逐笔数据 entrust 和 trade 的表结构如下:

name type 备注
symbol SYMBOL

股票代码

上交所以".XSHG"结尾

深交所以"XSHE"结尾

symbolSource STRING "XSHG"(上交所)或者"XSHE"(深交所)
timestamp TIMESTAMP
sourceType INT 0代表委托数据entrust;1代表成交表 trade
orderType INT

entrust:1 市价;2 限价;3 本方最优;10 撤单(仅上交所,即上交所撤单记录在entrust中)

trade:0 成交;1 撤单(仅深交所,即深交所撤单记录在 trade中)

price DOUBLE 订单价格
qty LONG 订单数量
buyNo LONG trade 对应其原始数据;entrust 中的委托单号填充
sellNo LONG trade 对应其原始数据;entrust 中的委托单号填充
direction INT 1(买 )or 2(卖)
channelNo INT 通道号
seqNum LONG 逐笔数据序号

逐笔行情时 snapshot 表如下:

name type 备注
symbol SYMBOL

股票代码

上交所以 ".XSHG" 结尾

深交所以 "XSHE" 结尾

symbolSource STRING "XSHG"(上交所)或者 "XSHE"(深交所)
timestamp TIMESTAMP 时间戳
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
totalBidQty LONG 区间买量
totalOfferQty LONG 区间卖量
bidPrice DOUBLE[] 委买价格列表
bidQty LONG[] 委买量列表
offerPrice DOUBLE[] 委卖价格列表
offerQty LONG[] 委卖量列表
signal DOUBLE[] 指标列表
seqNum LONG 逐笔数据序号
prevClosePrice DOUBLE 前收盘价
注:

msgType 为 "END" 时策略回测结束。可以在行情回放结束之后,增加一条 msgType 为 "END" 的消息。如下示例:

messageTable=select top 1* from messageTable where msgTime=max(msgTime)
update messageTable set msgType="END"
update messageTable set msgTime=concatDateTime(msgTime.date(),16:00:00)
Backtest::appendQuotationMsg(engine,messageTable)

快照或快照+成交行情

  • 为快照行情时:

colName=["symbol","symbolSource","timestamp","lastPrice","upLimitPrice","downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice","offerQty","signal","prevClosePrice"]
colType= ["STRING","STRING","TIMESTAMP","DOUBLE","DOUBLE","DOUBLE","LONG","LONG","DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","DOUBLE"]
messageTable=table(10000000:0, colName, colType)
  • 为快照+成交行情时:

colName=["symbol","symbolSource","timestamp","lastPrice","upLimitPrice","downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice","offerQty","tradePrice","tradeQty","signal","prevClosePrice"]
colType= ["STRING","STRING","TIMESTAMP","DOUBLE","DOUBLE","DOUBLE","LONG","LONG","DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","DOUBLE"]
messageTable=table(10000000:0, colName, colType)
注:

标的代码 symbol 必须带有交易所标识(".XSHG",".XSHE")结尾,如 "600000.XSHG",不然会报错。

快照(dataType=1)或快照+成交(dataType=2)行情数据字段如下(dataType=1 时,没有 tradePrice 和 tradeQty 两个字段)

name type 备注
symbol SYMBOL

股票代码

上交所以 ".XSHG" 结尾

深交所以 "XSHE" 结尾

symbolSource STRING "XSHG"(上交所)或者"XSHE"(深交所)
timestamp TIMESTAMP
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE
downLimitPrice DOUBLE
totalBidQty LONG
totalOfferQty LONG
bidPrice DOUBLE[]
bidQty LONG[]
offerPrice DOUBLE[]
offerQty LONG[]
tradePrice DOUBLE[] dataType = 2 时才有
tradeQty LONG[] dataType = 2 时才有
signal DOUBLE[] 指标列表
prevClosePrice DOUBLE
注:

引擎接收到 symbol 为 "END" 时,表示策略回测结束。

一般在回测行情回放结束之后,再发送一条 symbol 为 "END" 的消息,如下示例:

messageTable=select top 1* from messageTable where timestamp=max(timestamp)
update messageTable set symbol="END"
//update messageTable set msgTime=concatDateTime(timestamp.date(),16:00:00)
Backtest::appendQuotationMsg(engine,messageTable)

分钟频率或日频

为分钟频率或日频:

colName=`symbol`tradeTime`open`low`high`close`volume`amount`upLimitPrice`downLimitPrice`prevClosePrice`signal
colType=[SYMBOL,TIMESTAMP,DOUBLE,DOUBLE,DOUBLE,DOUBLE,LONG,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE[]]
messageTable=table(10000000:0, colName, colType)
注:
  1. 标的代码 symbol 必须带有交易所标识(".XSHG",".XSHE")结尾,如 "600000.XSHG",不然会报错。

  2. 引擎接收到 symbol 为 "END" 时,表示策略回测结束。

  3. 涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。

  4. 跌停价 downLimitPrice 不为 0 时,委托卖单价格小于等于跌停价会被拒单。

一般在回测行情回放结束之后,可以再发生一条 symbol 为 "END" 的消息,如下示例:

messageTable=select top 1* from messageTable where tradeTime=max(tradeTime)
update messageTable set symbol="END"
update messageTable set tradeTime=concatDateTime(tradeTime.date(),16:00:00)
Backtest::appendQuotationMsg(engine,messageTable)

期货行情

快照行情

  • 为快照行情时:

colName=["symbol","symbolSource","timestamp","tradingDay",lastPrice","upLimitPrice",
        "downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
        "offerQty","highPrice","lowPrice","signal","prevClosePrice","settlementPrice",
        "prevSettlementPrice"]
colType= ["STRING","STRING","TIMESTAMP","DATE",DOUBLE","DOUBLE","DOUBLE","LONG","LONG",
        "DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","DOUBLE","DOUBLE","DOUBLE",
        "DOUBLE","DOUBLE"]
messageTable=table(10000000:0, colName, colType)

具体字段说明如下:

name type 备注
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 前结算价
注:

引擎接收到 symbol 为 "END" 时,表示策略回测结束。

一般在回测行情回放结束之后,再发送一条 symbol 为 "END" 的消息,如下示例:

// signal字段生成demo
//update tb set signal =fixedLengthArrayVector([close])
// 或者在 select中通过 fixedLengthArrayVector([close])生成
messageTable=select top 1* from messageTable where timestamp=max(timestamp)
update messageTable set symbol="END"
Backtest::appendQuotationMsg(engine,messageTable)

分钟频率或日频

为分钟频率或日频:

colName=["symbol","symbolSource","tradeTime","tradingDay","open","low","high","close",
"volume","amount","upLimitPrice","downLimitPrice","signal","prevClosePrice",
"settlementPrice","prevSettlementPrice"]
 
colType=[SYMBOL,SYMBOL,TIMESTAMP,DATE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,LONG,DOUBLE,
DOUBLE,DOUBLE,DOUBLE[],DOUBLE,DOUBLE,DOUBLE]
messageTable=table(10000000:0, colName, colType)

具体字段说明如下:

name type 备注
symbol SYMBOL 期货代码
symbolSource STRING 交易所
tradeTime TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
open DOUBLE 开盘价
low DOUBLE 最低价
high DOUBLE 最高价
close DOUBLE 收盘价
volume LONG 成交量
amount DOUBLE 成交金额
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价
注:
  1. 引擎接收到 symbol 为 "END" 时,表示策略回测结束。

  2. 涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。

  3. 跌停价 downLimitPrice 不为 0 时,委托卖单价格小于等于跌停价会被拒单。

一般在回测行情回放结束之后,可以再发生一条 symbol 为 "END" 的消息,如下示例:

// signal 字段生成 demo
//update tb set signal =fixedLengthArrayVector([close])
messageTable=select top 1* from messageTable where tradeTime=max(tradeTime)
update messageTable set symbol="END"
Backtest::appendQuotationMsg(engine,messageTable)

合约基本信息表

名称代码 类型 名称
symbol SYMBOL或STRING 期货合约代码
multiplier DOUBLE 合约乘数
marginRatio DOUBLE 保证金比率
tradeUnit DOUBLE 合约单位
priceUnit DOUBLE 报价单位
priceTick DOUBLE 价格最小变动单位
commission DOUBLE 费用
deliveryCommissionMode INT

计费方式:

1:费用*手数

2:费用*金额

期权行情

快照行情

  • 为快照行情时:

colName=["symbol","symbolSource","timestamp","tradingDay",lastPrice","upLimitPrice",
        "downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
        "offerQty","highPrice","lowPrice","signal","prevClosePrice","settlementPrice",
        "prevSettlementPrice","underlyingPrice","Theta","Vega","Gamma","Delta","IV"]
colType= ["STRING","STRING","TIMESTAMP","DATE",DOUBLE","DOUBLE","DOUBLE","LONG","LONG",
        "DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE","DOUBLE","DOUBLE[]","DOUBLE",
        "DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE","DOUBLE"]
messageTable=table(10000000:0, colName, colType)

具体字段说明如下:

name

type

备注

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 前结算价
underlyingPrice DOUBLE 标的价格
Theta DOUBLE
Vega DOUBLE
Gamma DOUBLE
Delta DOUBLE
IV DOUBLE
注:

引擎接收到 symbol 为 "END" 时,表示策略回测结束。

一般在回测行情回放结束之后,再发送一条 symbol 为 "END" 的消息,如下示例:

// signal 字段生成 demo
//update tb set signal =fixedLengthArrayVector([close])
//或者在 select中通过 fixedLengthArrayVector([close])生成
messageTable=select top 1* from messageTable where timestamp=max(timestamp)
update messageTable set symbol="END"
Backtest::appendQuotationMsg(engine,messageTable)

分钟频率或日频

为分钟频率或日频:

colName=`symbol`symbolSource`tradeTime`tradingDay
    `open`low`high`close`volume`amount`upLimitPrice`downLimitPrice`signal`prevClosePrice`settlementPrice
    `prevSettlementPrice`underlyingPrice`Theta`Vega`Gamma`Delta`IV
colType=[SYMBOL,SYMBOL,TIMESTAMP,DATE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,LONG,DOUBLE,DOUBLE,DOUBLE,
        DOUBLE[],DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE]
messageTable=table(10000000:0, colName, colType)

具体字段说明如下:

name

type

备注

symbol symbol 期权代码
symbolSource STRING 交易所
tradeTime TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
open DOUBLE 开盘价
low DOUBLE 最低价
high DOUBLE 最高价
close DOUBLE 收盘价
volume LONG 成交量
amount DOUBLE 成交金额
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价
underlyingPrice DOUBLE 标的价格
Theta DOUBLE
Vega DOUBLE
Gamma DOUBLE
Delta DOUBLE
IV DOUBLE
注:
  1. 引擎接收到 symbol 为 "END" 时,表示策略回测结束。

  2. 涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。

  3. 跌停价 downLimitPrice 不为 0 时,委托卖单价格小于等于跌停价会被拒单。

一般在回测行情回放结束之后,可以再发生一条 symbol 为 "END" 的消息,如下示例:

//signal 字段生成 demo
//update tb set signal =fixedLengthArrayVector([close])
messageTable=select top 1* from messageTable where tradeTime=max(tradeTime)
update messageTable set symbol="END"
Backtest::appendQuotationMsg(engine,messageTable)

合约基本信息表

名称代码

类型

名称

symbol SYMBOL或STRING 合约代码
underlyingAssetType INT

期权品种;

1:商品期权

2:股指期权

3:etf 期权

multiplier DOUBLE 合约乘数
type INT

期权类型

1:看涨(call)

2:看跌(put)

strikePrice DOUBLE 行权价
marginRatio DOUBLE 保证金比率
tradeUnit DOUBLE 合约单位
priceUnit DOUBLE 报价单位
priceTick DOUBLE 价格最小变动单位
commission DOUBLE 手续费
deliveryCommissionMode INT

1:commission/手

2:成交额*commission

lastTradingDay DATE 合约最后交易日
exerciseDate DATE 期权行权日
exerciseSettlementDate DATE 行权交收日

策略编写模块

使用回测引擎进行策略回测时采取的是事件驱动机制,策略回测架构提供以下多个事件函数。

事件函数 说明
def initialize(mutable contextDict){} 策略初始化函数,只触发一次。可以在该函数中初始化一些变量,或者订阅指标计算。回调函数传入参数 contextDict 为逻辑上下文,是由回测引擎创建的字典变量。
def beforeTrading(mutable contextDict){} 策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等。
def onTick(mutable contextDict, msg){} 逐笔行情通知函数,行情更新时的处理函数,逐笔委托和成交。

def onSnapshot(mutable contextDict, msg){}

期货回测时,def onSnapshot(mutable contextDict, msg, indicator=NULL){}

快照行情通知函数,当期货回测时,函数的定义多出 indicator=NULL 参数,是订阅的指标。

def onBar(mutable contextDict, msg){}

期货回测时 def onBar(mutable contextDict, msg, indicator=NULL){}

K线行情回调函数,当期货回测时,函数的定义包括 indicator=NULL 参数,代表订阅的时序指标。
def onOrder(mutable contextDict,orders){} 委托回报通知函数,每个订单状态有变化时会触发。
def onTrade(mutable contextDict,trades){} 成交回报通知函数,有成交时会触发。
def afterTrading(mutable contextDict){} 策略每日盘后回调函数,每日盘后触发一次。可以在该函数统计当日的成交等信息
def finalize(mutable contextDict){} 策略结束之后回调函数

逐笔行情回调函数 onTick

contextDict 为上下文。

msg 为 tick 数据,为表或者字典。

字典是,包含 symbol 为 key 值的 tick 数据字典,每个 tick 对象包含字段如下:

name type 备注
symbol SYMBOL 股票代码
symbolSource STRING
timestamp TIMESTAMP
sourceType INT

0代表委托数据 entrust;

1代表成交表 trade

orderType INT

entrust:1市价;2限价;3本方最优;10撤单(仅上交所,即上交所撤单记录在entrust中)

trade:0成交;1撤单(仅深交所,即深交所撤单记录在trade中)

price DOUBLE 订单价格
qty LONG 订单数量
buyNo LONG
sellNo LONG
direction INT 1(买 )or 2(卖)
channelNo INT 通道号
seqNum LONG 逐笔数据序号

快照行情回调函数 onSnapshot

contextDict 为上下文;msg 为 snapShot 数据,为表或者字典;indicator 为订阅的指标数据,为表形式,仅在期货回测时有该参数。

沪深交易所标的 onSnapShot 回调函数 msg 消息字段说明

msg 为 snapShot 数据,为表或者字典。

字典包含 symbol 为 key 值的 snapShot 数据,每个 snapShot 对象包含字段如下:

名称 类型 含义
symbol SYMBOL 股票标的
symbolSource SYMBOL 证券市场:深交所、上交所
timestamp TIMESTAMP 时间
lastPrice DOUBLE 最新成交价
upLimitPrice DOUBLE 涨停板价
downLimitPrice DOUBLE 跌停板价
totalBidQty LONG 买单成交数量总和
totalOfferQty LONG 卖单成交数量总和
bidPrice DOUBLE[] 买单价格列表
bidQty LONG[] 买单数量列表
offerPrice DOUBLE[] 卖单价格列表
offerQty LONG[] 卖单数量列表
signal DOUBLE[]

期货 onSnapShot 回调函数 msg 消息字段说明

msg 为 snapShot 数据,为表或者字典。

字典是,包含 symbol 为 key 值的 snapShot 数据字典,每个 snapShot 对象包含字段如下:

name type 备注
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 前结算价

期权 onSnapShot 回调函数 msg 消息字段说明

msg 为 snapShot 数据,为表或者字典。

字典是,包含 symbol 为 key 值的 snapShot 数据字典,每个 snapShot 对象包含字段如下:

name

type

备注

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 前结算价
underlyingPrice DOUBLE 标的价格
Theta DOUBLE
Vega DOUBLE
Gamma DOUBLE
Delta DOUBLE
IV DOUBLE

K线行情回调函数 onBar

contextDict 为上下文;msg 为K线数据,为表或者字典;indicator 为订阅的指标数据,为表形式,仅在期货回测时有该参数。

沪深交易所标的 onBar 中 msg 字段说明

msg 是字典,包含 symbol 为 key 值的日频或者分钟频率的 K 线数据字典,每个 K 线包含字段如下:

字段 类型 名称 备注
symbol SYMBOL 标的代码 ".XSHE"或者 ".XSHG"结尾标识
tradeTime TIMESTAMP 交易日
open DOUBLE 开盘价
low DOUBLE 最低价
high DOUBLE 最高价
close DOUBLE 收盘价
volume LONG 成交量
amount DOUBLE 成交额
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
prevClosePrice DOUBLE 前收盘价
signal DOUBLE[] 其它

期货 onBar 中 msg 字段说明

msg 是字典,包含 symbol 为 key 值的日频或者分钟频率的 K 线数据字典,每个 K 线包含字段如下:

name type 备注
symbol symbol 期货代码
symbolSource STRING 交易所
tradeTime TIMESTAMP 时间戳
tradingDay DATE 交易日/结算日期
open DOUBLE 开盘价
low DOUBLE 最低价
high DOUBLE 最高价
close DOUBLE 收盘价
volume LONG 成交量
amount DOUBLE 成交金额
upLimitPrice DOUBLE 涨停价
downLimitPrice DOUBLE 跌停价
signal DOUBLE[] 其他字段列表
prevClosePrice DOUBLE 前收盘价
settlementPrice DOUBLE 结算价
prevSettlementPrice DOUBLE 前结算价

期权 onBar 中 msg 字段说明

msg 是字典,包含 symbol 为 key 值的日频或者分钟频率的 K 线数据字典,每个 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 前结算价
underlyingPrice DOUBLE 标的价格
Theta DOUBLE
Vega DOUBLE
Gamma DOUBLE
Delta DOUBLE
IV DOUBLE

委托回报 onOrder

contextDict 为上下文。

orders 为订单信息的字典列表:

名称 含义
orderId 委托订单 id
symbol 标的代码
timestamp 委托时间
qty 委托数量
price 委托价格
status 委托状态

4:已报

0:部成

1:已成

2:撤单成功

-1:审批拒绝

-2:撤单拒绝

direction 委托方向
tradeQty 成交数量
tradeValue 成交金额
label 标签
updateTime 更新时间

成交回报函数 onTrade

contextDict 为上下文。

trades 为订单信息的字典列表:

字段 名称 备注
orderId 委托订单 id
symbol 标的代码
tradePrice 成交价格
tradeQty 成交数量 int
tradeValue 成交金额
totalFee 总费用
totalVolume 累计成交量
totalValue 累计成交金额
direction 委托方向
tradeTime 成交时间
orderPrice 委托价格
label 标签

沪深交易所标的回测示例:

def initialize(mutable contextDict){
	//订阅指标
	print("initialize")
	d=dict(STRING,ANY)
	d["zdf"]=<zdf(lastPrice,prevClosePrice)>
	d["totalSellAmount"]=<totalSellAmount(offerQty)>
	Backtest::subscribeIndicator(contextDict["engine"], "snapshot", d) 
	//订阅逐笔行情的指标
	d=dict(STRING,ANY)
	d["zdf_30s"]=<zdf_30s(price,time,sourceType,orderType)>
	d["tradeVol_5m"]=< tradeVol_5m(qty,time,sourceType,orderType)>
	//d["sourceType"]=<sourceType>
	Backtest::subscribeIndicator(contextDict["engine"], "tick", d) 
}
def beforeTrading(mutable contextDict){
	//每日盘前回调函数
	//1、通过contextDict["tradeDate"]可以获取当日;
	print("before_trading")
}  
def onTick(mutable contextDict, msg){
	////msg可以为字典或表,最新时刻的tick数据
	///1、通过contextDict["tradeTime"]获取最新时间
	for (istock in msg.keys()){
		askPrice=msg[istock]["offerPrice"][0]
		bidPrice=msg[istock]["bidPrice"][0]
		if(any([askPrice,bidPrice]<=0) or any(isNull([askPrice,bidPrice]))){
			continue
			}
		buyQty=100
		sellQty=100
		buyOrderId=Backtest::submitOrder(contextDict["engine"], 
		(istock, contextDict["tradeTime"], 5, bidPrice, buyQty, 1, 1))[0]
	}			
}
def onOrder( mutable contextDict,orders){
	/*
	 orderId->474
	symbol->688157.XSHG
	timestamp->2022.04.11T09:50:43.000
	amount->1100
	price->94.319999999999993
	status->9
	direction->2
	tradeQty->1100
	tradeValue->0
	label->"a"
	updateTime->2022.04.11T09:50:43.000
	 */
}
def onTrade(mutable contextDict,trades){
	/*
	 * trades为字典列表
	orderId->376
	symbol->688157.XSHG
	tradePrice->93.959999999999993
	tradeQty->200
	tradeTime->2022.04.11T09:53:16.220
	direction->2
	tradeValue->18792//成交金额
	label->
	 */
	// 成交主推回调
	for(itrade in trades){}
}
def afterTrading(mutable contextDict){
	print ("after_trading")
	//print 
	// 每日盘后回调函数
	
	}
def finalize(mutable contextDict){
    // 回测结束前回调函数
	
 }

引擎接口

createBacktestEngine

语法

Backtest::createBacktestEngine(name, userConfig, basicInfo, initialize, beforeTrading, onTick, onSnapshot, onOrder, onTrade, afterTrading, finalize)

详情

创建回测引擎,并设置所有的回调函数。

返回创建的回测引擎句柄。

参数

name STRING 类型标量,表示回测引擎名称。

userConfig 一个字典,键是 STRING 类型,代表配置项的名称,值是配置项对应的值。

basicInfo 基础信息表,可选参数。

initialize 初始化回测函数,回测开始时会触发调用。

beforeTrading 策略回调函数,每日开盘前触发调用。

onTick/onBar 策略回调函数,不同模式下填写的函数不同,可选参数。处理逐高频行情时会触发调用 onTick,中低频行情时触发调用 onBar。

onSnapshot 策略回调函数,处理快照行情时会触发调用。

onOrder 策略回调函数,订单变更时触发调用。

onTrade 策略回调函数,订单交易时触发调用。

afterTrading 策略回调函数,每日收盘时触发调用。

finalize 策略回调函数,回测结束时会触发调用。

appendQuotationMsg

语法

Backtest::appendQuotationMsg(engine, msg)

详情

插入行情执行策略回测。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

msg 行情输入表。

subscribeIndicator

语法

subscribeIndicator(engine, type, metrics)

详情

订阅指标。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

type STRING 类型标量,表示要订阅指标的行情类型,支持 "tick", "snapshot" 和 "kline"。

metrics 一个字典,键是 STRING 类型,代表指标名,值是以元代码的形式表示计算公式,代表如何计算指标。

示例

d=dict(STRING,ANY)
d["mavg"]=<mavg(lastPrice,20)>
Backtest::subscribeIndicator(contextDict["engine"], "snapshot", d) 
Backtest::subscribeIndicator(contextDict["engine"], "tick", d)
d=dict(STRING,ANY)
d["mavg"]=<mavg(trade,20)>
Backtest::subscribeIndicator(contextDict["engine"], "trade", d) 
d=dict(STRING,ANY)
d["mavg"]=<mavg(clsoe,20)>
Backtest::subscribeIndicator(contextDict["engine"], "kline", d)

订阅行情指标时,内部创建了相应的响应式状态引擎,状态因子的编写参考 DolphinDB 响应式状态引擎介绍教程

submitOrder

语法

Backtest::submitOrder(engine, msg, label="")

详情

向回测引擎发送订单。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

msg 订单内容,一个元组,表示订单内容。

  • 订单格式:

    • 沪深交易所标的:(股票代码, 下单时间, 订单类型, 订单价格, 订单数量, 买卖方向)

    • 期货:(期货标的, 交易所代码, 时间, 订单类型, 委托订单价格, 止损价/止盈价,委托订单数量,买卖方向,委托订单有效性),注意止损价/止盈价暂不支持,默认0。

  • 订单类型:

    • 上交所:0:市价单中最优五档即时成交剩余撤销委托订单;1:市价单中最优五档即时成交剩余转限价委托订单;2:市价单中本方最优价格委托订单;3:市价单中对手方最优价格委托订单;5:限价单;6:撤单。

    • 深交所:0:市价单中最优五档即时成交剩余撤销委托订单;1:市价单中即时成交剩余撤销委托订单;2:市价单中本方最优价格委托订单;3: 市价单中对手方最优价格委托订单;4:市价单中全额成交或撤销委托订单;5:限价单;6:撤单。

    • 期货:0:市价单,以涨跌停价委托,并遵循时间优先原则;5:限价单;6:撤单。

  • 买卖方向:INT 类型正数,1 代表买开,2 代表卖开,3 代表卖平,4 代表买平。

  • 期货订单的委托订单有效性:0:当日有效(默认);1:立即全部成交否则自动撤销(FOK);2:立即成交剩余自动撤销(FAK)。

label STRING 类型标量,对该订单增加备注信息。

setUniverse

语法

Backtest::setUniverse(engine, symbolList)

详情

设置股票池。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

symbolList STRING 类型向量,内含证券代码。

cancelOrder

语法

Backtest::cancelOrder(engine, symbol="", orders=NULL, label="")

详情

取消订单。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

symbol SYMBOL 类型标量,要取消的订单的证券代码,可选参数。

orders DOUBLE 类型向量,要取消的订单 ID 列表,可选参数。

label STRING 类型标量,要取消的订单的备注信息。

getOpenOrders

语法

Backtest::getOpenOrders(engine, symbol="", orders=NULL, label="", outputQueuePosition=false)

详情

查询未成交订单。

返回未成交订单表,包含如下列:

注意:仅当 outputQueuePosition=1 和 2 时,才包含 openVolumeWithBetterPrice, openVolumeWithWorsePrice, openVolumeAtOrderPrice, priorOpenVolumeAtOrderPrice, depthWithBetterPrice 五列。

名称 类型 含义
orderId LONG 订单 ID
timestamp TIMESTAMP 时间
symbol STRING 股票标的
price DOUBLE 委托价格
totalQty LONG 用户订单数量
openQty LONG 用户订单余量
direction INT 1(买 ),2(卖)
isMacthing INT 订单是否到达撮合时间
openVolumeWithBetterPrice LONG 优于委托价格的行情未成交委托单总量
openVolumeWithWorsePrice LONG 次于委托价格的行情未成交委托单总量
openVolumeAtOrderPrice LONG 等于委托价格行情未成交委托单总量
priorOpenVolumeAtOrderPrice LONG 等于委托价格行情且比自己早的行情未成交委托单总量
depthVolumeWithBetterPrice INT 优于委托价格的行情未成交价格档位深度
updateTime TIMESTAMP 最新更新时间

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

symbol SYMBOL 类型标量,证券代码,可选参数。

orders DOUBLE 类型向量,订单 ID 列表,可选参数。

label STRING 类型标量,用作备注,可选参数。

outputQueuePosition BOOL 类型标量,是否输出额外信息,可选参数。

dropBacktestEngine

语法

Backtest::dropBacktestEngine(engine)

详情

删除回测引擎。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getPosition

语法

Backtest::getPosition(engine, symbol="")

详情

获取持仓信息表。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

symbol SYMBOL 类型标量,证券代码,可选参数。

返回值

返回持仓信息表

字段 名称
symbol 标的代码
lastDayLongPosition 昨买持仓数量 昨日收盘时的买开的持仓量 买开,买卖标志为1
lastDayShortPosition 昨卖持仓数量 昨日收盘时的卖开的持仓量 卖开,买卖标志为2
longPosition 买持仓量 sum(买开成交数量-卖平成交数量) 买卖标志为1的成交数量-买卖标志为3的成交数量
longPositionAvgPrice 买成交均价 sum(买开成交数量*买开成交价格)\sum(买开成交数量) 买开时计算
shortPosition 卖持仓量 sum(卖开成交数量-买平成交量) 卖开,买卖标志为2
shortPositionAvgPrice 卖成交均价 sum(卖开成交数量*卖开成交价格)\sum(卖成交数量) 卖开时计算
todayBuyVolume 当日买成交数量 sum(当日买开成交数量)
todayBuyValue 当日买成交金额 sum(当日买开成交数量*当日买开成交价格)
todaySellVolume 当日卖成交数量 sum(当日卖开成交数量)
todaySellValue 当日卖成交金额 sum(当日卖开成交数量*当日卖开成交价格)

getTradeDetails

语法

Backtest::getTradeDetails(engine)

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

详情

获取交易明细表,并返回:

字段 含义
orderId 订单号
symbol 证券代码
direction 订单委托买卖标志
sendTime 订单委托时间
orderPrice 订单委托价格
orderQty 订单委托数量
tradeTime 订单成交时间
tradePrice 成交价格
tradeQty 成交数量
orderStatus orderStatus表示订单状态。4:已报,0:部成,1:已成,2:撤单成功,-1:审批拒绝,-2:撤单拒绝,-3:未成交的订单
label 备注

getAvailableCash

语法

Backtest::getAvailableCash(engine)

详情

查询账户可用现金。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getTodayPnl

语法

Backtest::getTodayPnl(engine, symbol)

详情

查询当日股票盈亏情况,并返回:

字段 含义
symbol 证券代码
pnl 当日账户盈亏金额(包含昨仓)
todayPnl 当日盈亏金额(不包含昨仓)

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

symbol SYMBOL 类型标量,表示证券代码。

getDailyPosition

语法

Backtest::getDailyPosition(engine)

详情

获取每日盘后的持仓数据详情,并返回:

字段 名称
symbol 标的代码
tradeDate 交易日
lastDayLongPosition 昨日买持仓
lastDayShortPosition 昨日卖持仓
longPosition 买持仓
longPositionAvgPrice 买成交均价
shortPosition 卖成交数量
shortPositionAvgPrice 卖成交均价
todayBuyVolume 当日买成交数量
todayBuyValue 当日买成交金额
todaySellVolume 当日卖成交数量
todaySellValue 当日卖成交金额

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getTotalPortfolios

语法

Backtest::getTotalPortfolios(engine)

详情

可以在回测中实时调用,实时获取当前策略权益指标表,表结构如下:

  • stock:

字段名称 字段说明
tradeDate 日期
cash 可用资金
totalMarketValue 账户总市值
totalEquity 账户总权益
netValue 账户单位净值
totalReturn 截至当日的累计收益率
ratio 账户每日收益率
pnl 账户当日盈亏
  • future 和 option:

字段名称 字段说明 备注
tradeDate 日期
margin 保证金占用 参考:实时保证金占用计算:=∑买开持仓的最新价×买开持仓数量该标的合约乘数该标的合约单位保证金比例+∑卖开持仓的最新价×卖开持仓数量该标的合约乘数该标的合约单位保证金比例
floatingPnl 浮动盈亏 ∑[∑(买开持仓最新价-买开成交价)*买开持仓数量]+∑[∑(卖开持仓成交价-卖开持仓最新价)*卖开持仓数量]
realizedPnl 已实现累计盈亏
totalPnl 累计盈亏 已实现累计盈亏+ floatingPnl
cash 可用资金 初始资金+累计盈亏-保证金占用-保证金预扣【盘后预扣的保证金需要释放】
totalEquity 账户总权益 初始资金+累计盈亏
marginRatio 保证金占用比例 实时保证金占用/账户总权益
pnl 账户当日盈亏 账户总权益-昨日收盘时的账户总权益
netValue 账户单位净值 账户总权益/初始资金
totalReturn 截至当日的累计收益率 netValue-1
ratio 账户每日收益率 账户总权益/昨日收盘时的账户总权益 -1

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getDailyTotalPortfolios

语法

Backtest::getDailyTotalPortfolios(engine)

详情

获取策略每日权益指标表,表结构与 getTotalPortfolios 接口返回的权益指标表相同。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getReturnSummary

语法

Backtest::getReturnSummary(engine)

详情

回测结束时计算策略的收益概述,返回一张收益概述表。

计算公式中的 value 为每日净值 netValue;price 为基准每日净值数据(设置 benchmark 时),第i日的净值=第i日的收盘价\回测开始日时的前收盘价

字段名称 字段说明 计算公式
totalReturn 总收益 last(value)-1
annualReturn 年化收益率 pow(last(value), 252\size(value)) - 1
annualVolatility 年化波动率 std(deltas(value)\prev(value)) * sqrt(252)
annualSkew 收益率偏度 skew(deltas(value)\prev(value))
annualKur 收益率峰度 kurtosis(deltas(value)\prev(value))
sharpeRatio 夏普率 (getAnnualReturn(value) - r)\getAnnualVolatility(value)
maxDrawdown 最大回撤 i = imax((cummax(value) - value) \ cummax(value))if (i==0){return 0}j = imax(value[:i])(value[j] - value[i]) \ (value[j])
drawdownRatio 收益回撤比 getAnnualReturn(value) \ getMaxDrawdown(value)
beta beta系数 covar(deltas(value)\prev(value), deltas(price)\prev(price)) \ std(deltas(price)\prev(price))
alpha a系数 annualReturn(value) - beta(value, price) * (annualReturn(price) )
benchmarkReturn 基准收益 last(value)-1
annualExcessReturn 年化超额收益 annualReturn(value) - annualReturn(price)
turnoverRate 换手率 每日换手率=len(set(当日持股股票集合)-set(前一交易日股票集合))/len(set(前一交易日股票集合));avg(abs(每日换手率))
dailyWinningRate 日胜率 当日盈亏大于0的次数/总的交易日
maxMarginRatio 策略最大保证金占用比例 期货独有

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。

getBacktestEngineList

语法

Backtest::getBacktestEngineList()

详情

获取所有的回测引擎。

getContextDict

语法

Backtest::getContextDict(engine)

详情

返回逻辑上下文。

参数

engine 通过 createBacktestEngine 接口创建的回测引擎句柄。