【vn.py学习笔记(一)】vn.py架构学习笔记

  笔者刚接触量化投资,对量化投资挺感兴趣,在闲暇时间进行量化投资的学习,只能进行少量资金进行量化实践。目前在进行基于vnpy的A股市场的量化策略学习,主要尝试攻克的技术难点在:A股市场日线数据的免费获取维护、自动下单交易、全市场选股程序、选股策略的回测程序、基于机器学习的股票趋势预测。
  书中介绍的的是vn.py v1.9.2LTS版本,笔者接下来的vn.py学习笔记将基于vn.py最新的源码进行学习分享,有不对的地方欢迎大家指出,共同学习。
  欢迎志同道合的朋友加我QQ(1163962054)交流。
  github仓库:https://github.com/PanAndy/quant_share。

1 基础架构

  vn.py的架构分为3层,分别是底层接口、中层引擎和上层应用,一个交易app的构建即是按这三层进行构建的,如下图所示。
在这里插入图片描述
  从vn.py的脚本运行方式也可以直观地看出三层架构的关系。

def main():
    """Start VN Trader"""
    qapp = create_qapp()

    event_engine = EventEngine() # vn.py的事件引擎
    main_engine = MainEngine(event_engine)	# vn.py的中层核心引擎
    
    main_engine.add_gateway(CtpGateway) # vn.py的底层接口
    main_engine.add_app(CtaStrategyApp) # vn.py的上层应用

    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()

    qapp.exec()

if __name__ == "__main__":
    main()

2 底层接口

  底层接口负责对接行情和交易API,将数据推送到系统核心中,以及发送指令,比如下单、数据请求等。底层AP接口代码位于vnpy/api下,包含所有原生的C++API接口,封装为Python交易接口的相关程序代码及编译后的结果。
  vnpy/trader/gateway.py内定义了vn.py交易接口的抽象类,可以基于它编写自己的编写自己的交易接口,笔者后期也会开源出基于easytrader和easyquotation写的交易接口,欢迎关注。
  vn.py目前支持的接口列在这了,大家有兴趣可以去看相应的源码。基本套路是一样的,先看vnpy/trader/gateway.py里的抽象内,然后看vnpy/api/xxxgateway的具体实现。

vnpy.gateway,盖国内外所有交易品种的交易接口:

国内市场
	CTP(ctp):国内期货、期权
	CTP Mini(mini):国内期货、期权
	飞马(femas):国内期货
	宽睿(oes):国内证券(A股)
	中泰XTP(xtp):国内证券(A股)
	华鑫奇点(tora):国内证券(A股)

海外市场
	富途证券(futu):港股、美股
	老虎证券(tiger):全球证券、期货、期权、外汇等
	Interactive Brokers(ib):全球证券、期货、期权、外汇等
	易盛9.0外盘(tap):全球期货

数字货币
	BitMEX(bitmex):数字货币期货、期权、永续合约
	OKEX合约(okexf):数字货币期货
	火币合约(huobif):数字货币期货
	币安(binance):数字货币现货
	OKEX(okex):数字货币现货
	火币(huobi):数字货币现货
	Bitfinex(bitfinex):数字货币现货
	1Token(onetoken):数字货币券商(现货、期货)

特殊应用
	RPC服务(rpc):跨进程通讯接口,用于分布式架构

3 中层引擎

  中层引擎包括事件引擎、订单路由和数据引擎,往下对接各种交易接口,往上服务于各种应用模块,它可以提供数据缓存、风险管理、订单路由等一系列理化交易中的通用功能。换句话说,中层引擎的功能是将程序中的各个组件,例如底层接口、数据库接口等,融合到一个类中,便于上层应用调用。
  vn.py的核心交易引擎位于vnpy/trader/engine.py内,它包括MainEngine、BaseEngine、LogEngine、OmsEngine、EmailEngine。事件引擎位于vnpy/event/engine.py内。需要注意的是,在具体应用的实现过程中,会编写特定的引擎,例如CtaStrategy应用中,就有主引擎CtaEngine(BaseEngine)和回测BacktestingEngine,位于vnpy/app/cta_strategy下。
  中层引擎的具体工作流程如下:当底层接口接收行情推送后,行情数据会被推送到事件引擎上。事件引擎会在上层应用中检查哪个模块订阅了这个事件类型,并把行情数据推送到相应的应用模块中。当应用模块处理完行情数据后,直接调用主引擎的某些函数,再把对应的请求发送到底层接口中。
在这里插入图片描述
  事件引擎是vn.py的核心组件,也是大多数交易系统或回测引擎、甚至大多数交互程序的设计基础。事件驱动程序设计模型的运行流程是由用户的动作(鼠标的按键、键盘的按键动作)或者其他程序的消息(如最新行情的推送)来决定的。在量化交易领域,事件引擎是为了解决Python全局锁GIL导致的多线程性能问题而开发的,通过单线程异步工作模式实现事件流的处理和分发,从而提高整个交易系统的性能。事件引擎部分的代码是值得好好看看的。

4 上层应用

上层应用主要位于vnpy/app下,开箱即用的各类量化策略交易应用:

  • cta_strategy:CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)。CTA策略模块主要用于单标的的期货CTA策略和股票T+0日内交易策略,回测引擎和实盘引擎设计采用了完全兼容的API函数,用户可以使用同一套策略代码实现回测研究和执行实盘交易 。在扩展方面,基于Python生态丰富的机器学习库,用户可以在策略代码中轻松实现各种机器学习算法来提高效率。这也是我后期要研究的重点。
  • cta_backtester:CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作
  • algo_trading:算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等等,支持常用算法配置保存
  • script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能
  • rpc_service:RPC服务模块,允许将某一VN Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统
  • csv_loader:CSV历史数据加载器,用于加载CSV格式文件中的历史数据到平台数据库中,用于策略的回测研究以及实盘初始化等功能,支持自定义数据表头格式
  • data_recorder:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化
  • risk_manager:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能

参考资料

猜你喜欢

转载自blog.csdn.net/PAN_Andy/article/details/114269119
今日推荐