量化学习: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代码文件:

jqdatasdk初始化vnpy策略数据

 

posted @ 2018-08-01 19:26  新生印记  阅读(2880)  评论(0编辑  收藏  举报