tqsdk.backtest - 策略回测/复盘工具

class tqsdk.backtest.BtQuote(api)

Quote 是一个行情对象

class tqsdk.backtest.TqBacktest(start_dt: datetime.date, end_dt: datetime.date)

天勤回测类

将该类传入 TqApi 的构造函数, 则策略就会进入回测模式。

回测模式下 k线会在刚创建出来时和结束时分别更新一次, 在这之间 k线是不会更新的。

回测模式下 quote 的更新频率由所订阅的 tick 和 k线周期确定:
  • 只要订阅了 tick, 则对应合约的 quote 就会使用 tick 生成, 更新频率也和 tick 一致, 但 只有下字段 : datetime/ask&bid_price1/ask&bid_volume1/last_price/highest/lowest/average/volume/amount/open_interest/ price_tick/price_decs/volume_multiple/max&min_limit&market_order_volume/underlying_symbol/strike_price

  • 如果没有订阅 tick, 但是订阅了 k线, 则对应合约的 quote 会使用 k线生成, 更新频率和 k线的周期一致, 如果订阅了某个合约的多个周期的 k线, 则任一个周期的 k线有更新时, quote 都会更新. 使用 k线生成的 quote 的盘口由收盘价分别加/减一个最小变动单位, 并且 highest/lowest/average/amount 始终为 nan, volume 始终为0

  • 如果即没有订阅 tick, 也没有订阅k线或 订阅的k线周期大于分钟线, 则 TqBacktest 会 自动订阅分钟线 来生成 quote

注意 :如果未订阅 quote,模拟交易在下单时会自动为此合约订阅 quote ,根据回测时 quote 的更新规则,如果此合约没有订阅K线或K线周期大于分钟线 则会自动订阅一个分钟线

模拟交易要求报单价格大于等于对手盘价格才会成交, 例如下买单, 要求价格大于等于卖一价才会成交, 如果不能立即成交则会等到下次行情更新再重新判断。

回测模式下 wait_update 每次最多推进一个行情时间。

回测结束后会抛出 BacktestFinished 例外。

组合合约 进行回测时需注意:只能通过订阅 tick 数据来回测,不能订阅K线,因为K线是由最新价合成的,而交易所发回的组合合约数据中无最新价。

创建天勤回测类

Args:

start_dt (date/datetime): 回测起始时间, 如果类型为 date 则指的是交易日, 如果为 datetime 则指的是具体时间点

end_dt (date/datetime): 回测结束时间, 如果类型为 date 则指的是交易日, 如果为 datetime 则指的是具体时间点

class tqsdk.backtest.TqReplay(replay_dt: datetime.date)

天勤复盘类

除了传统的回测模式以外,TqSdk 提供独具特色的复盘模式,它与回测模式有以下区别

1.复盘模式为时间驱动,回测模式为事件驱动

复盘模式下,你可以指定任意一天交易日,后端行情服务器会传输用户订阅合约的当天的所有历史行情数据,重演当天行情,而在回测模式下,我们根据用户订阅的合约周期数据来进行推送

因此在复盘模式下K线更新和实盘一模一样,而回测模式下就算订阅了 Tick 数据,回测中任意周期 K 线最后一根的 close 和其他数据也不会随着 Tick 更新而更新,而是随着K线频率生成和结束时更新一次

2.复盘和回测的行情速度

因为两者的驱动机制不同,回测会更快,但是我们在复盘模式下也提供行情速度调节功能,可以结合web_gui来实现

3.复盘目前只支持单日复盘

因为复盘提供对应合约当日全部历史行情数据,对后端服务器会有较大压力,目前只支持复盘模式下选择单日进行复盘

Args:

replay_dt (date): 指定复盘交易日

set_replay_speed(speed: float = 10.0)None

调整复盘服务器行情推进速度

Args:

speed (float): 复盘服务器行情推进速度, 默认为 10.0

Example:

from datetime import date
from tqsdk import TqApi, TqReplay
replay = TqReplay(date(2019, 9, 10))
api = TqApi(backtest=replay, auth=("信易账户,账户密码"))
replay.set_replay_speed(3.0)
quote = api.get_quote("SHFE.cu1912")
while True:
    api.wait_update()
    if api.is_changing(quote):
        print("最新价", quote.datetime, quote.last_price)