【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读

  • 写在前面
  • 1 RqdataClient架构
    • 1.1 query_history
    • 1.2 query_tick_history
  • 2 Database架构
  • 学习资料

写在前面

  笔者刚接触量化投资,对量化投资挺感兴趣,在闲暇时间进行量化投资的学习,只能进行少量资金进行量化实践。目前在进行基于vnpy的A股市场的量化策略学习,主要尝试攻克的技术难点在:A股市场日线数据的免费获取维护、自动下单交易、全市场选股程序、选股策略的回测程序、基于机器学习的股票趋势预测。
  现阶段的计划是阅读vn.py的源码,学习vn.py架构机制,在学习的过程中,会以分享的形式记录,以加深对vn.py的理解,有不对的地方欢迎大家批评指正。
  欢迎志同道合的朋友加我QQ(1163962054)交流。
  分享的github仓库:https://github.com/PanAndy/quant_share。


  这次来看一看vn.py的数据服务是怎么写的,与数据服务相关的主要是对rqdata的封装和database模块。参考rqdata的封装,我实现了一个对tushare获取股票日线数据的封装,可以参考之前的文章《基于tushare的A股市场行情维护程序》。下一篇将会来学习vn.py 核心trader的最后一部分代码vnpy/trader/utility.py的内容。

1 RqdataClient架构

  对rqdata数据服务的封装位于vnpy/trader/rqdata.py内,主要是通过RqdataClient类来实现的。RqdataClient主要包含四个变量username、password、inited、symbols,四个函数init、to_rq_symbol、query_history、query_tick_history,其中主要以query_history和query_tick_history向外提供服务。query_history和query_tick_history的基本逻辑就是构造查询内容,向rqdata查询,然后将返回的df拼接成list[bardata],再返回给调用者。

1.1 query_history

    def query_history(self, req: HistoryRequest) -> Optional[List[BarData]]:"""Query history bar data from RQData."""if self.symbols is None:return Nonesymbol = req.symbolexchange = req.exchangeinterval = req.intervalstart = req.startend = req.endrq_symbol = self.to_rq_symbol(symbol, exchange)if rq_symbol not in self.symbols:return Nonerq_interval = INTERVAL_VT2RQ.get(interval)if not rq_interval:return None# For adjust timestamp from bar close point (RQData) to open point (VN Trader)adjustment = INTERVAL_ADJUSTMENT_MAP[interval]# For querying night trading period dataend += timedelta(1)# Only query open interest for futures contractfields = ["open", "high", "low", "close", "volume"]if not symbol.isdigit():fields.append("open_interest")df = rqdata_get_price(rq_symbol,frequency=rq_interval,fields=fields,start_date=start,end_date=end,adjust_type="none")data: List[BarData] = []if df is not None:for ix, row in df.iterrows():dt = row.name.to_pydatetime() - adjustmentdt = CHINA_TZ.localize(dt)bar = BarData(symbol=symbol,exchange=exchange,interval=interval,datetime=dt,open_price=row["open"],high_price=row["high"],low_price=row["low"],close_price=row["close"],volume=row["volume"],open_interest=row.get("open_interest", 0),gateway_name="RQ")data.append(bar)return data

1.2 query_tick_history

    def query_tick_history(self, req: HistoryRequest) -> Optional[List[TickData]]:"""Query history bar data from RQData."""if self.symbols is None:return Nonesymbol = req.symbolexchange = req.exchangestart = req.startend = req.endrq_symbol = self.to_rq_symbol(symbol, exchange)if rq_symbol not in self.symbols:return None# For querying night trading period dataend += timedelta(1)# Only query open interest for futures contractfields = ["open","high","low","last","prev_close","volume","limit_up","limit_down","b1","b2","b3","b4","b5","a1","a2","a3","a4","a5","b1_v","b2_v","b3_v","b4_v","b5_v","a1_v","a2_v","a3_v","a4_v","a5_v",]if not symbol.isdigit():fields.append("open_interest")df = rqdata_get_price(rq_symbol,frequency="tick",fields=fields,start_date=start,end_date=end,adjust_type="none")data: List[TickData] = []if df is not None:for ix, row in df.iterrows():dt = row.name.to_pydatetime()dt = CHINA_TZ.localize(dt)tick = TickData(symbol=symbol,exchange=exchange,datetime=dt,open_price=row["open"],high_price=row["high"],low_price=row["low"],pre_close=row["prev_close"],last_price=row["last"],volume=row["volume"],open_interest=row.get("open_interest", 0),limit_up=row["limit_up"],limit_down=row["limit_down"],bid_price_1=row["b1"],bid_price_2=row["b2"],bid_price_3=row["b3"],bid_price_4=row["b4"],bid_price_5=row["b5"],ask_price_1=row["a1"],ask_price_2=row["a2"],ask_price_3=row["a3"],ask_price_4=row["a4"],ask_price_5=row["a5"],bid_volume_1=row["b1_v"],bid_volume_2=row["b2_v"],bid_volume_3=row["b3_v"],bid_volume_4=row["b4_v"],bid_volume_5=row["b5_v"],ask_volume_1=row["a1_v"],ask_volume_2=row["a2_v"],ask_volume_3=row["a3_v"],ask_volume_4=row["a4_v"],ask_volume_5=row["a5_v"],gateway_name="RQ")data.append(tick)return data

2 Database架构

  vn.py最新版本(2.1.9)对数据库管理端进行了重构(vnpy.database),采用类似gateway(底层接口)和app(上层应用)的设计模式。

  1. 在vnpy.trader.database中,定义数据库管理端的通用接口,包括:抽象模板类BaseDatabase、数据库时区常量DB_TZ、时区转换函数convert_tz、以及K线数据整体概况BarOverview类,用于大幅提高DataManager组件的数据库概况查询速度。
  2. 在vnpy.database模块下,继承BaseDatabase实现具体的数据库管理端,包括:
  • SQL类:SQLite(sqlite),轻量级单文件数据库,无需安装和配置数据服务程序,vn.py的默认选项,适合入门新手用户;MySQL(mysql):世界最流行的开源关系型数据库,文档资料极为丰富,且可替换其他高NewSQL兼容实现(如TiDB);PostgreSQL(postgresql),特性更为丰富的开源关系型数据库,支持通过扩展插件来新增功能,只推荐熟手使用。
  • NoSQL类:MongoDB(mongodb),基于分布式文件储存(bson格式)的非关系型数据库,内置的热数据内存缓存实现更快读写速度;InfluxDB(influxdb),针对时序数据专门设计的非关系型数据库,列式数据储存提供极高的读写效率和外围分析应用。

Database的实现架构如下图所示,具体实现的代码就不往下展开了,一般不需要修改。

学习资料

  1. vn.py发布v2.1.9 - 数据库管理端剥离重构

【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读相关推荐

  1. java存入光盘_java 这是 学习笔记(jdk7)书中的光盘里的源码,不知大家需要不,里面都是新手 的好 Develop 238万源代码下载- www.pudn.com...

    文件名称: java下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1272 KB 上传时间: 2013-04-01 下载次数: 18 提 供 者: 孙鹏启 详细 ...

  2. 学习笔记之js中导出表格到excel详解+源码

    在系统开发中,经常会遇到要将一个表格数据导出到excel中,刚刚做完,把示例代码共享一下,话不多说直接上代码. <!DOCTYPE html> <html> <head ...

  3. 【Flink】Flink 源码阅读笔记(16)- Flink SQL 的元数据管理

    1.概述 转载:Flink 源码阅读笔记(16)- Flink SQL 的元数据管理 Flink 源码阅读笔记(17)- Flink SQL 中的时间属

  4. Live555源码阅读笔记(一):源码介绍文档 及 源码目录结构

    目录 一.Live555介绍 1.Live555项目介绍 2.官网及帮助文档介绍 二.源码目录结构 1.UsageEnvironment 2.BasicUsageEnvironment 3.group ...

  5. 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期

    [vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...

  6. 【vn.py学习笔记(八)】vn.py utility、BarGenerator、ArrayManager源码阅读

    [vn.py学习笔记(八)]vn.py utility.BarGenerator.ArrayManager源码阅读 写在前面 1 工具函数 2 BarGenerator 2.1 update_tick ...

  7. 【vn.py学习笔记(五)】vn.py Base、Log、Oms、Email Engine源码阅读

    [vn.py学习笔记(五)]vn.py Base.Log.Oms.Email Engine源码阅读 写在前面 1 BaseEngine 2 LogEngine 3 OmsEngine 3.1 构造函数 ...

  8. 【vn.py学习笔记(二)】vn.py底层接口 学习笔记

    [vn.py学习笔记(二)]vn.py底层接口 学习笔记 1 CTP API的工作原理 1.1 CTP介绍 1.2 API功能介绍 1.3 CTP API文件 1.4 API 通用规则 2 CTP A ...

  9. 【vn.py学习笔记(三)】vn.py事件引擎 学习笔记

    [vn.py学习笔记(三)]vn.py事件引擎 学习笔记 1 时间驱动 2 事件驱动 3 事件引擎工作流程 4 事件引擎结构 4.1 事件队列 4.2 事件处理线程 4.3 事件处理函数字典/通用事件 ...

  10. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

最新文章

  1. MVC实现简单的上传功能
  2. 从零写一个编译器(四):语法分析之构造有限状态自动机
  3. 什么是响应式布局设计
  4. android studio 触摸锁,学习AndroidStudio布局,并编写一个图案解锁demo
  5. 【报告分享】2021年社区团购研究报告.pdf(附下载链接)
  6. (转载)php flush()刷新不能输出缓冲的原因分析
  7. 用java或c语言编写真值表,离散数学C语言
  8. 桌面时间的最佳管理者-软媒时间_我是亲民_新浪博客
  9. 手机充当电脑 麦克风 扬声器 摄像头
  10. eclipse官方下载安装、JDK官方下载安装和环境变量配置
  11. Java练习——小游戏 模拟雷电
  12. linux dbm数据库,Linux dbm遇到的一些问题
  13. libdmtx结合OpenCV识别DataMatrix二维码
  14. 成为阿里云大使的笔记
  15. Visual C++ 图像与文字的合成
  16. fabric-ca-client 详解动态添加组织
  17. solidworks2022 - 双开
  18. java junit 覆盖率_java单元测试篇:使用clover为junit单元测试做覆盖率分析(二)...
  19. 安装Mac os High Sierra 10.13.6 17g10021
  20. 腾讯开放平台荣获“中国互联网生态价值之星”

热门文章

  1. android qq纯净输入法,QQ输入法纯净版更新 同步手机词库
  2. Java源代码加密工具(Allatori)用法说明
  3. windows10安装oracle10 g客户端
  4. c语言背包问题非递归算法,数据结构基础 背包问题(一) 之 非递归解
  5. 玩转C语言Socket网络编程
  6. 一台设备驱动万物:苹果和三星即将推陈出新
  7. 西瓜播放器xgplayer的简单使用demo
  8. 软件测试-黑盒测试方法(一)---等价类划分、边界值、因果图、判定表
  9. linux 桌面版 黑屏,安装ubuntu时黑屏的解决办法(3种)
  10. 产品读书《大败局 I》 《大败局II》