继续对vnpy的代码解析
vnpy中用peewee作为数据库的ORM,也就是一个和数据的mapping,这样调用访问数据会更有秩序而不是到处都是sql语句,这和java中的hibernate之类很类似。
vnpy因为越做越大的关系,但其实对于新手,往往开始不一定需要这样一个把所有数据库类型都兼容,也不一定需要那么的券商实盘接口,因为往往也就在一家券商开实盘和读行情,甚至也不一定需要多种品种,股票期货数字货币vnpy都支持了,但很多早期学习者可能只需要了解一个品种就够了,了解整体的逻辑再加其他品种也不迟。
既然如此,说明vnpy的解读其实是可以从减法来入手的,也就是思考一个问题,如何把vnpy裁剪为最简化的一个版本,够用就好。首先看数据库兼容,假设就只支持一种数据库mysql,那么在trader目录下有一个database目录,保留database.py(一个抽象类)和databasesql.py(sql数据库包括mysql,sqlite等),那么database_mongo.py就可以减掉了。如果初期也不考虑回测精度,就去掉分钟线回测,就保留个日线回测跑通即可,后期需要做高频策略的时候再加分钟线和tick
上个图吧
vnpy2.0之后应该是重构了,结构更清晰了
- 核心的交易代码在trader包里,app.py是 实现链接各application的类,constant是常量定义,engine.py是引擎的基类,gateway.py是链接各个 api接口的基类, rqdata.py(因为vnpy应该是和rqdata深度合作了,所以vnpy基本只有这一个数据源了)
- trader下有个ui目录,这里是 界面显示 的一些基类,包括各种单元格,列表等,从这里看得出vnpy在显示方面是很克制的,虽然外部有很多很丰富的图表,显示k线,显示回测结果,但是vnpy还是 坚持用最原生的QtWidget来做显示,包括在根目录下有个chart目录,是用qtwidget做了一个k线图,真不容易,小小一个k线图,要考虑的实现细节还是很多的
- api目录是 各种市场的api接口,所以里边有很多是.c结尾的头文件和dll,vnpy等于把这些都封装了,确实为广大量化从业人员节省了很多时间
- app,这个是非常重要的目录,实际上 如果把vnpy抽象为多层结构,那么api是在底层,链接交易市场,trader在api之上,封装了量化交易核心代码, app在trader之上,封装了应用,包括algotrading(算法交易,比如大单拆分算法等), cta_backtester(cta回测), data_manager(这个可以看到本地数据的完整度,也蛮实用的), option_master(期权部分), risk_manager(风险控制), spread_trading(价差交易)
对比了 市场多个开源的量化交易系统,vnpy的确是 架构设计上最为精炼简洁的,目录层级很清晰。