当前位置: 首页 > 后端技术 > Python

一招搞定WonderTrader本地模拟环境

时间:2023-03-25 21:54:15 Python

前言最近群里的小伙伴都在讨论simnow的停用问题。从3月31日开始将持续一个半月,如无意外要到5月中旬才能恢复。.因此,很多从事CTA的研发人员最近可能会面临到哪里找仿真环境的问题。笔者不禁想到,几年前市面上还没有simnow的时候,要找期货模拟环境真的很麻烦。一方面要看期货公司是否部署了模拟环境。只有期货公司有模拟环境,才能进行测试;另一方面,可以交易的交易所和合约也非常有限;而且所有的单子都是需要交易对手的,不然他们根本不知道怎么撮合,所以在测试的过程中,还是要请期货公司的人帮忙下交易对手的单子,不然就得自己做自己的交易。本文的主要内容是介绍如何使用WonderTrader搭建本地模拟环境。TraderMocker简介WonderTrader在v0.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是为一般用途而设计的,它无法考虑到所有货币。如果加入验资机制,会增加复杂性。另一方面,WonderTrader的1+N执行结构实际上将策略与关注资金隔离开来。即使做了验资,也不能把问题转嫁给策略。无结算处理TraderMocker不执行结算处理以简化处理。如果引入结算机制,将会增加复杂性,并且还需要仿真器保持在线,直到收到结算价格。但在策略的实际操作中,其实主要关注的是入场价和出厂价,结算对策略的意义不大。但是,如果没有结算,所有仓位都是当前仓位。因此,对于部分品种,模拟环境中的手续费设置需要设置为与昨天相同。命令都在内存中。对于像TraderMocker这样简单的模拟模块,只会落地必要的数据。目前TraderMocker只保存仓位数据,而订单数据和交易数据只在内存中。一旦平台重启,订单和交易将消失。交易订单简化为了兼容不同品种,TraderMocker只能实现通用订单,即买卖订单和撤单。不支持其他特殊订单,如ETF申购与赎回、期权报价与执行等订单。当然,TraderMocker只是作者草草写的一个简单的模拟模块。由于使用场景有限,还有很多模拟功能没有完全实现。读者如果有兴趣,可以根据自己的需要进行完善。到时候如果愿意分享给大家,也可以提交PR。如何搭建本地模拟环境上一篇介绍了TraderMocker模块。下面的文章将介绍如何使用WonderTrader搭建这样一个本地模拟环境。搭建本地仿真环境,需要两个demo,datakit_fut和hft_fut_mocker。这两个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}]}isinuse,将parsers部分的CTP前缀和账号密码改成生产环境,修改代码为你需要订阅的合约代码,然后启动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","费用”:“费用.json”,},“数据”:{“商店”:{“路径”:“./FUT_Data/”}},“交易员”:[{“活动”:真,“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自然会依赖数据服务器组件提供的行情广播服务。修改配置后查看策略启动入口:fromwtpyimportWtEngine,EngineTypefromstrategies.HftStraDemoimportHftStraDemoif__name__=="__main__":#创建运行环境,添加策略引擎=WtEngine(EngineType.ET_HFT)引擎。init('./common/',"config.json")engine.commitConfig()straInfo=HftStraDemo(name="hft_IF",code="CFFEX.IF.2104",expsecs=5,偏移量=100,freq=0)engine.add_hft_strategy(straInfo,'mocker')engine.run()kw=input('按任意键退出\n')最后运行run.py即可正常进行模拟测试,如图:如果有要进行股票模拟,只需要修改./common目录下相应的基础文件,在配置文件中修改行情模块的配置文件即可。如有不明之处,读者也可私信咨询作者。结论如何使用WonderTrader的模拟模块TraderMocker搭建本地模拟环境,可以概括为两步:先运行数据服务器,再运行模拟环境。通过两个简单的步骤,您可以创建一个模拟环境。我相信这对有需要的人来说是一件很容易的事情。对于想使用simnow的用户,在simnow不在的期间,只需要一个CTPs真实账户进行模拟测试即可。对于那些对券商提供的股票模拟环境不满意的人,本文介绍的策略可能会提高您的模拟测试效率。当然,笔者水平有限,TraderMocker的开发也比较仓促,难免有很多错误和疏漏。读者在使用时需要判断是否满足自己的需求。另外,模拟毕竟不是真实offer,需要仔细辨别策略的表现是否合理。最后说说WonderTraderWonderTrader旨在为量化从业者提供更好的轮子,将技术相关的东西封装在平台中,力求为策略研发带来更好的策略开发体验。WonderTrader的github地址:https://github.com/wondertrad...WonderTrader官网地址:https://wondertrader.github.iowtpy的github地址:https://github.com/wondertrad...市场有风险,投资需谨慎。以上声明仅为对历史事件的回顾,不代表对未来的看法,不作为任何投资建议。