日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 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(上層應用)的設計模式。

  • 在vnpy.trader.database中,定義數據庫管理端的通用接口,包括:抽象模板類BaseDatabase、數據庫時區常量DB_TZ、時區轉換函數convert_tz、以及K線數據整體概況BarOverview類,用于大幅提高DataManager組件的數據庫概況查詢速度。
  • 在vnpy.database模塊下,繼承BaseDatabase實現具體的數據庫管理端,包括:
    • SQL類:SQLite(sqlite),輕量級單文件數據庫,無需安裝和配置數據服務程序,vn.py的默認選項,適合入門新手用戶;MySQL(mysql):世界最流行的開源關系型數據庫,文檔資料極為豐富,且可替換其他高NewSQL兼容實現(如TiDB);PostgreSQL(postgresql),特性更為豐富的開源關系型數據庫,支持通過擴展插件來新增功能,只推薦熟手使用。
    • NoSQL類:MongoDB(mongodb),基于分布式文件儲存(bson格式)的非關系型數據庫,內置的熱數據內存緩存實現更快讀寫速度;InfluxDB(influxdb),針對時序數據專門設計的非關系型數據庫,列式數據儲存提供極高的讀寫效率和外圍分析應用。

    Database的實現架構如下圖所示,具體實現的代碼就不往下展開了,一般不需要修改。

    學習資料

  • vn.py發布v2.1.9 - 數據庫管理端剝離重構
  • 總結

    以上是生活随笔為你收集整理的【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。