Backtest
为了精准测试和验证策略在实盘交易中的效果,DolphinDB 基于分布式存储和计算、多范式的编程语言和模拟撮合引擎插件,实现了事件型回测引擎插件。该插件支持沪深交易所所有标的的逐笔+快照、逐笔(逐笔合成快照触发策略)、快照和快照+成交、分钟和日频行情策略回测;以及期货和期权的快照、分钟和日频的行情,以及银行间的现券等策略回测。
回测引擎主要包括四个核心部分:用户自定义策略函数、策略配置与创建、行情数据回放、执行回测引擎并获取回测结果。回测引擎提供了多个事件函数,包括策略初始化,每日盘前和盘后回调函数,逐笔、快照和K线行情的回调函数,委托和成交回报函数等。用户可以根据实际情况,在策略初始化中定义指标,并在其他相应的回调函数中编写自定义策略,实现不同事件下的策略逻辑。其次,用户可以配置策略的行情源、资金、订单延时和成交比例等信息。根据策略和配置,用户可以创建相应的回测引擎,然后回放数据源并执行回测引擎。最后,通过不同引擎接口获取反映回测表现的结果信息。
安装插件
版本要求
DolphinDB Server 2.00.12.2 和 3.00.0.2 及更高版本,支持 X86-64 的 Linux 和 Windows。
安装步骤
-
在 DolphinDB 客户端中使用
listRemotePlugins
命令查看插件仓库中的插件信息。注意:仅展示当前操作系统和 server 版本支持的插件。若无预期插件,可在 DolphinDB 用户社区进行反馈。
login("admin", "123456") listRemotePlugins()
-
使用
installPlugin
命令完成插件安装。installPlugin("Backtest")
-
使用
loadPlugin
命令加载插件。loadPlugin("Backtest")
插件依赖
回测引擎插件内部依赖模拟撮合引擎插件,因此加载回测引擎之前需要先加载模拟撮合引擎,该插件同样可以通过插件市场安装。
-
使用
installPlugin
命令完成模拟撮合引擎插件安装。installPlugin("MatchingEngineSimulator")
-
使用
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 |
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)
-
标的代码 symbol 必须带有交易所标识(".XSHG",".XSHE")结尾,如 "600000.XSHG",不然会报错。
-
引擎接收到 symbol 为 "END" 时,表示策略回测结束。
-
涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。
-
跌停价 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 | 前结算价 |
-
引擎接收到 symbol 为 "END" 时,表示策略回测结束。
-
涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。
-
跌停价 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 |
-
引擎接收到 symbol 为 "END" 时,表示策略回测结束。
-
涨停价 upLimitPrice 不为 0 时,委托买单价格大于等于涨停价会被拒单。
-
跌停价 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
接口创建的回测引擎句柄。