乐趣区

关于量化:一招搞定WonderTrader本地仿真环境

前言

  最近群里的小伙伴们都在探讨 simnow 停用的事件,从 3 月 31 日开始,要继续一个半月,不出意外的话也要 5 月中旬能力复原。于是很多搞 CTA 的研发人员可能最近都面临着到哪里去找仿真环境的问题。
  笔者不由得想起来,若干年前市面上还没有 simnow 的时候,要找一个期货仿真环境真的是很麻烦。一方面要看期货公司是不是部署了仿真环境,只有期货公司有仿真环境才好测试;另一方面,可能交易的交易所和合约也是十分无限的;而且,所有的订单都须要对手盘,不然基本不会撮合,所以在测试的过程中还须要请期货公司的人帮忙下对手单,要不然就只有本人搞自成交了。
  本文次要内容就是介绍 如何利用 WonderTrader 搭建本地仿真环境

TraderMocker 简介

  WonderTraderv0.3.6 公布的时候,公布过一个 TraderMocker 模块,基于该模块用户能够非常容易地搭建一个纯本地的仿真环境,而不必依赖任何第三方环境。
  笔者最后在设计 TraderMocker 的时候,正在给 WonderTrader 适配股票交易。过后接入的是中泰 XTP 接口,XTP比拟风行也比拟容易接入,有互联网的测试环境,API也十分敌对。
  不过市面上很多股票测试环境多少都有一些问题,总结下来大略如下:

  • 有些仿真环境是基于撮合的,如果没有对手盘,根本无法成交
  • 有些仿真环境是按几率撮合的,如果下单时没有成交,那就永远不会成交了,不合乎失常的撮合逻辑
  • 有些仿真环境可能是没有接入实时行情,所以不论以后什么价格,价格如何变动,成交价都是挂单价

  显然在这样的仿真环境下测试,策略仿真的后果其实是有很大的迷惑性的。在这样的状况下,笔者便决定本人开发一个仿真环境。然而 WonderTrader 作为一个量化交易框架,自身都是各用户独立部署的,也没有中心化的服务,开发一套 C/S 的仿真环境,还须要硬件投入。对于 WonderTrader 这样的开源平台来说,老本太高的话是不事实的。另外仿真环境的部署个别要依据市场、种类别离部署,对于 WonderTrader 这样面向全市场全种类的平台来说,老本就更是翻了好几倍了。笔者纵然违心分享源码,然而也没有方法持续性的投入资金去保护这样的仿真服务。基于这些根本考量,TraderMocker这种全本地化的、去核心的仿真模块就应运而生了。

  为了尽量的模仿实在的接口调用,TraderMocker在设计上也有一些特点:

  • 异步执行

    异步执行的次要目标是为了还原实在交易的事件产生程序。以下单为例,生产环境下,调用下单接口遵循以下数据:下单接口调用 -> 下单后果返回 -> 订单回报 -> 成交回报。如果不采纳异步执行的机制,那么就会呈现下单接口还没有返回的时候,曾经收到订单回报和成交回报了,这样就不合乎生产环境的实在场景了。

  • 依据价格撮合

    TraderMocker天然不可能是一个齐全的仿真环境,所以撮合的机制也绝对简略。然而为了尽量模仿实盘环境,TraderMocker会严格依照价格优先的机制进行撮合。这里的撮合,指的是不须要对手盘的撮合,即只有价格条件满足,即间接撮合成交,推送订单回报和成交回报。

  • 反对不同的种类

    TraderMocker作为一个辅助的简化的本地仿真模块,要充分考虑对不同的种类的反对。这样能力减少 TraderMocker 的利用场景。

  基于以上的设计准则,TraderMocker也体现出一些特点:

  • 仿真的水平无限

    TraderMocker毕竟不是真正的撮合零碎,只是利用行情对订单做一个仿真解决。而且接入的行情,就算是期货,也是 500ms 一笔的快照。另外,思考到不同行情源档位不同,所以撮合解决的时候只利用了买一卖一的数据。TraderMocker对订单之间的竞争也不思考进去,对立依照最新的 tick 的委托量进行解决。

  • 不适宜大单测试

    TraderMocker并没有解决订单对限价订单簿的冲击。次要思考到期货行情只有一档,无奈进行冲击的处测算,所以就简化了。所以当一个订单的委托价格高于对手价的时候,一次撮合不完会等到下一笔 tick 进来再利用对手价进行撮合,这显然不大合乎实在场景。因而大单仿真的还原水平会更低,参考性也更低了。

  • 不做验资操作

    TraderMocker因为其特殊性,不会进行资金查看,只有非法的订单都能下单胜利。一方面是因为 TraderMocker 是为通用性设计的,所以无奈兼顾所有的币种,如果减少验资的机制会减少复杂性。另外一方面,WonderTrader1+ N 执行架构,实际上是断绝了策略对资金的关注,即便做验资,也无奈将问题传递给策略。

  • 不做结算解决

    TraderMocker为了简化解决,不会进行结算解决。如果引入结算机制,会减少复杂性,而且还会要求仿真器始终在线直到接管到结算价为止。然而在策略的实操中,其实都次要关怀的还是进场价和出厂价,结算的意义对于策略来说并不大。不过如果不结算,所有的持仓都是今仓,因而对于有些种类来说,仿真环境中的手续费的设置就须要把平今设置为跟平昨统一。

  • 订单都在内存中

    对于 TraderMocker 这样的繁难仿真模块,只会把必要的数据落地 。目前TraderMocker 只会保留持仓数据,而 订单数据和成交数据都只在内存中。一单平台重启,订单和成交就都都没有了。

  • 交易指令简化

    TraderMocker为了兼容不同的种类,所以 只能实现通用的指令 ,即 交易和撤单的指令 。其余的非凡指令就不反对了,比方ETF 申赎、期权的报价和执行等指令。

  当然 TraderMocker 只是笔者仓促写进去的一个繁难的仿真模块,有很多仿真性能因为应用场景无限,并没有齐全实现。如果各位读者有趣味的话,能够自行依据本人的需要进行欠缺。到时候如果违心分享给大家的话,也能够提交一个PR

如何搭建本地仿真环境

  前文介绍了一下 TraderMocker 模块,上面本文就将介绍如何在利用 WonderTrader 搭建这样的本地仿真环境。搭建本地仿真环境,须要用到 datakit_futhft_fut_mocker两个 demo。这两个demo 笔者曾经提交到 wtpy/demos 下,有须要的读者能够自行获取,如果 master 分支没有的话,请到 dev 分支下载即可。

  • 行情配置
    datakit_fut 是通过 CTP 接口落地行情数据的数据组件demo,根本配置如下:

    {
    "basefiles":{
        "session":"./common/sessions.json",
        "commodity":"./common/commodities.json",
        "contract":"./common/contracts.json",
        "holiday":"./common/holidays.json"
    },
    "writer":{
        "path":"./FUT_Data/",
        "savelog":false,
        "async":false,
        "groupsize":20
    },
    "parsers":[
        {
            "active":true,
            "module":"ParserCTP.dll",
            "front":"tcp://180.168.146.187:10111",
            "broker":"9999",
            "user":"你的 SIMNOW 账号",
            "pass":"你的 SIMNOW 明码",
            "code":"CFFEX.IF2005,SHFE.au2012"
        }
    ],
    "broadcaster":{
        "active":true,
        "bport":3997,
        "broadcast":[
            {
                "host":"255.255.255.255",
                "port":9001,
                "type":2
            }
        ]
    }

在应用的时候,将 parsers 大节的 CTP 前置和账号密码改成生产环境,并将 code 改成本人须要的合约代码进行订阅,而后启动 runDT.py 就能够失常运行了。

  • 仿真配置
    hft_fut_mocker 则是从 UDP 播送通道接入行情,并调用 TraderMocker 进行仿真,配置如下:

    {
    "basefiles":{
        "session":"./common/sessions.json",
        "commodity":"./common/commodities.json",
        "contract":"./common/contracts.json",
        "holiday":"./common/holidays.json",
        "hot":"./common/hots.json"
    },
    "env":{
        "name":"hft",
        "mode": "product",
        "product":{"session":"TRADING"},
        "filters":"filters.json",
        "fees":"fees.json",
    },
    "data":{
        "store":{"path":"./FUT_Data/"}
    },
    "traders":[
        {
            "active":true,
            "id":"mocker",
            "module":"TraderMocker.dll",
            "front":"mocker://localhost",
            "mockerid":9999,
            "span":100,
            "newpx":true,
            "maxqty":100,
            "minqty":1,
            "user":"mocker9999",
            "udp_port":9001,
            "savedata":true
        }
    ],
    "parsers":[
        {
            "active":true,
            "id":"parser1",
            "module":"ParserUDP.dll",
            "host":"127.0.0.1",
            "bport":9001,
            "sport":3997,
            "filter":""
        }
    ],
    "bspolicy":"actpolicy.json"
    }

从下面的配置能够看出,TraderMocker仿真器,要从 udp 播送通道接管最新的行情,能力进行撮合。可能有人会有疑难:为什么不从行情通道通过 WonderTrader 间接向 TraderMocker 传递行情数据呢?其实也很好解释,因为 Trader 模块解耦当前,WonderTrader只和 Trader 交互交易数据,而行情数据,不在接口反对的数据范畴内,所以 TraderMocker 只能本人解决行情接入的问题。因而 TraderMocker 天然就会依赖数据伺服组件提供的行情播送服务了。

配置批改好了当前,再检查一下策略启动入口:

from wtpy import WtEngine,EngineType
from strategies.HftStraDemo import HftStraDemo

if __name__ == "__main__":
    #创立一个运行环境,并退出策略
    engine = WtEngine(EngineType.ET_HFT)
    engine.init('./common/', "config.json")
    engine.commitConfig()

    straInfo = HftStraDemo(name="hft_IF", code="CFFEX.IF.2104", expsecs=5, offset=100, freq=0)
    engine.add_hft_strategy(straInfo, 'mocker')

    engine.run()

    kw = input('press any key to exit\n')

最初,运行 run.py 就能够失常进行仿真测试了,如图:

如果有须要进行股票仿真的,只须要批改 ./common 目录下相应的根底文件,并批改配置文件中的行情接入模块的配置文件即可。如有不明确的中央,读者也能够私信征询笔者。

结束语

  如何利用 WonderTrader 的仿真模块 TraderMocker 来搭建本地的仿真环境,总结下来就是两个步骤:先运行一个数据伺服,再运行仿真环境。简略的两个步骤,就能够搞定一个仿真环境。置信对于有须要的人来说,这是一个很轻松的事件。
  对于想用 simnow 的用户来说,在 simnow 缺位的这段时间,只须要一个 CTP s 实盘账号即可进行仿真测试。对于那些不满足于券商提供的股票仿真环境的人来说,本文介绍的这个攻略兴许能够晋升你仿真测试的效率。
  当然,笔者程度无限,TraderMocker 的开发也比拟仓促,不免有很多错漏之处, 各位读者在应用的时候还须要自行判断一下是否满足本人的需要。另外,仿真毕竟不是实盘,策略的体现是否正当还须要各位认真分别。

  最初再安利一下 WonderTrader
  WonderTrader 旨在给各位量化从业人员提供更好的轮子,将技术相干的货色都封装在平台中,力求给策略研发带来更好的策略开发体验。

WonderTradergithub 地址:https://github.com/wondertrad…

WonderTrader官网地址:https://wondertrader.github.io

wtpygithub 地址:https://github.com/wondertrad…


市场有危险,投资需谨慎。以上陈说仅作为对于历史事件的回顾,不代表对将来的观点,同时不作为任何投资倡议。

退出移动版