聚寬提供的jqdatasdk,很好的使策略能在本地使用數據源,今天的修改就是使用jqdatasdk的數據,替換vnpy從mongodb獲取數據進行策略數據初始化的過程。
首先安裝完jqdatasdk后,在程序中引入
之后修改onInit函數,onInit函數是在策略初始化的過程中會調用到的函數。
1 def onInit(self): 2 """初始化策略(必須由用戶繼承實現)""" 3 self.writeCtaLog(u'%s策略初始化' %self.name) 4 self.writeCtaLog(u'測試') 5 6 # 獲取當前日期 7 self.today = str(self.ctaEngine.today)[0:10] 8 print(self.today) 9 10 # 初始化RSI入場閾值 11 self.rsiBuy = 50 + self.rsiEntry 12 self.rsiSell = 50 - self.rsiEntry 13 14 # 載入歷史數據,並采用回放計算的方式初始化策略數值 15 # initData = self.loadBar(self.initDays) 16 17 # jqdata登陸 18 jqdatasdk.auth(u'XXXXXX', u'XXXXXX') 19 20 initData = [] 21 trade_days_list = jqdatasdk.get_trade_days(end_date=self.today, count=self.initDays) 22 23 # 獲取前多日如數,按倒敘排序 24 minute_df = jqdatasdk.get_price('IC1808.CCFX', start_date=trade_days_list[0], end_date=self.today, frequency='minute') # Fix26 27 # 將數據轉換為loadCsv中處理的數據類型,方便處理 28 del minute_df['money'] 29 minute_df = minute_df.reset_index() 30 minute_df.rename(columns={'index': 'trade_date', 'open': 'Open', 'close': 'Close', 'high': 'High', 'low': 'Low','volume': 'TotalVolume'}, inplace=True) 31 minute_df["Date"] = minute_df["trade_date"].map(lambda x: str(x)[0:10]) 32 minute_df["Time"] = minute_df["trade_date"].map(lambda x: str(x)[11:]) 33 del minute_df['trade_date'] 34 35 # 將數據傳入到數據隊列當中 36 for index, row in minute_df.iterrows(): 37 bar = VtBarData() 38 bar.vtSymbol = "IC1808" # Fix 39 bar.symbol = "IC1808" # Fix 40 bar.open = float(row['Open']) 41 bar.high = float(row['High']) 42 bar.low = float(row['Low']) 43 bar.close = float(row['Close']) 44 bar.date = datetime.strptime(row['Date'], '%Y-%m-%d').strftime('%Y%m%d') 45 bar.time = row['Time'] 46 bar.datetime = datetime.strptime(bar.date + ' ' + bar.time, '%Y%m%d %H:%M:%S') 47 bar.volume = row['TotalVolume'] 48 49 initData.append(bar) 50 print bar.date, bar.time 51 52 for bar in initData: 53 self.onBar(bar) 54 55 self.putEvent() 56 self.writeCtaLog(u'策略初始化成功')
修改邏輯如下:
之前獲取數據的方式是從mongodb中獲取,由此修改為從jqdatasdk獲取時,VtBarData類型的數據,觸發onBar事件。
這樣修改的邏輯就變成了將jqdatasdk中獲取的數據格式化為VtBarData的數據類型就可以了。
在vnpy的ctaHistoryData.py文件中,定義了幾種從csv文件導入到mongodb數據庫的操作,借用此處的導入時數據處理成VtBarData的過程,變換從jqdatasdk獲取的DataFrame的數據到與csv數據同等格式,調用數據處理部分,轉化為VtBarData類型的數據,觸發onBar函數,完成數據的初始化過程。
只是做了一個簡單的demo,后續根據情況再進行封裝和修改。
Github代碼文件: