量化学习:vnpy使用jqdatasdk进行初始化数据
聚宽提供的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代码文件: