【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读
【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 data1.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 data2 Database架構
??vn.py最新版本(2.1.9)對數據庫管理端進行了重構(vnpy.database),采用類似gateway(底層接口)和app(上層應用)的設計模式。
- SQL類:SQLite(sqlite),輕量級單文件數據庫,無需安裝和配置數據服務程序,vn.py的默認選項,適合入門新手用戶;MySQL(mysql):世界最流行的開源關系型數據庫,文檔資料極為豐富,且可替換其他高NewSQL兼容實現(如TiDB);PostgreSQL(postgresql),特性更為豐富的開源關系型數據庫,支持通過擴展插件來新增功能,只推薦熟手使用。
- NoSQL類:MongoDB(mongodb),基于分布式文件儲存(bson格式)的非關系型數據庫,內置的熱數據內存緩存實現更快讀寫速度;InfluxDB(influxdb),針對時序數據專門設計的非關系型數據庫,列式數據儲存提供極高的讀寫效率和外圍分析應用。
Database的實現架構如下圖所示,具體實現的代碼就不往下展開了,一般不需要修改。
學習資料
總結
以上是生活随笔為你收集整理的【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Idea创建web项目,配置tomcat
- 下一篇: queue java 用法_Java队列