除了通过行情记录模块记录实时Tick数据外,vnpy还提供了ctaHistoryData.py的脚本函数从通联数据API接口下载各类历史数据插入MongoDB中以便用户回测;用户也可以从MultiCharts,通信达等软件导出的历史数据插入Mongodb中用于回测;ctaHistoryData还提供了从tushare下载沪深股票日行情的代码demo,供用户参考。

  • 使用通联数据API下载历史数据

在使用ctaHistoryData.py下载历史数据前,需要获取相应数据授权Token。获取Token后,打开vn.Trader/ctaAlgo文件下的datayes.json文件,然后在token中输入相应的token即可。

{
"domain":"http://api/wmcloud.com/data",
"version":"v1",
"token":"575593eb7696aec7339224c0fac2313780d8645f68b77369dcb35f8bcb419a0b"
}
  • 下载股票/期货代码

    • 首次使用要先下载股票/期货代码插入Mongodb,便于后续行情下载是读取相应代码
      • downloadFuturesSymbol
      • 下载期货代码插入Mongodb
      • | 参数 | 类型 | 说明 | | :---: | :---: | :---: | | tradeDate | string | 交易日,如”20170207“ |

注:不输入则默认最近一个交易日

  • downloadEquitySymbol
    • 下载股票代码插入Mongodb
    • | 参数 | 类型 | 说明 | | :---: | :---: | :---: | | tradeDate | string | 交易日,如”20170207“ |
  • 下载期货合约行情

    • 下载期货合约日行情

      • downloadFuturesDailyBar
      • 该函数用于下载指定期货合约的日行情并插入Mongodb
      • | 参数 | 类型 | 说明 | | :---: | :---: | :---: | | symbol | string | 合约代码,如‘IF1705’ |

         日内分钟行情只有具体合约
        
  • 下载股票行情

    • 下载某只股票日行情
      • downloadEquityDailyBar
        • 该函数用于下载某只股票至最近一个交易日的历史数据 参数|类型|说明|symbol|string|股票代码

下载所有股票日行情

  • downloadAllEquityDailyBar

    • 调用该函数会下载所有A股上市公司至最近一个交易日的历史数据并插入Mongdb;
    • 采用单线程下载,代码如下
    start=time()
    print u'开始下载所有股票日行情‘
    
    productSymbolSet=self.readEquityProductSymbol()
    print u'代码列表读取成功,股票代买:%s' %productSymbolSet
    
    p=ThreadPool(10)
    p.map(self.downloadEquityDailyBar,productSymbolSet)
    p.close()
    p.join()
    print u'所有股票日行情已经全部下载完成,耗时%s秒‘ %(time()-start)
    

下载步骤

  1. 创建API下载引擎实例
e=HistoryDataEngine()

2.根据索要下载品种选择相应函数,如下载所有A股上市公司日行情

e.downloadAllEquityDailyBar()
  • 使用Multicharts/通达信导出的csv格式历史数据插入Mongodb

MultiCharts导出的1分K线csv数据格式如下:

"Date","Time","Open","High","Low","Close","TotalVolume"
2010/4/16,09:16:00,3450.0,3488.0,3450.0,3468.0,489
2010/4/16,09:17:00,3468.0,3473.8,3467.0,3467.0,302
2010/4/16,09:18:00,3467.0,3471.0,3466.0,3467.0,203
2010/4/16,09:19:00,3467.0,3468.2,3448.0,3448.0,280
2010/4/16,09:20:00,3448.0,3459.0,3448.0,3454.0,250

通达信导出的1分K线csv数据格式如下:

2013/08/19,0901,2326,2329,2325,2325,5932,395622,0
2013/08/19,0902,2326,2327,2325,2325,1066,395236,0
2013/08/19,0903,2326,2326,2325,2326,478,395168,0
2013/08/19,0904,2326,2326,2325,2325,208,395230,0
2013/08/19,0905,2325,2326,2324,2325,692,395672,0
2013/08/19,0906,2324,2325,2324,2324,370,395764,0

1.使用Multicharts导入历史数据

 import csv

 start=time()
 print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName,dbName,symbol)

 #锁定集合,并创建索引
 host,port,logging=loadMongoSetting()

 client=pymongo.MongoClient(host,port)
 collection=client[dbName][symbol]
 collection.ensure_index([('datetime',pymongo.ASCENDING)],unique=True)

 #读取数据和插入到数据库
 reader=csv.DictReader(file(fileName,'r'))
 for d in reader:
     bar=CtaBarData()
     bar.vtSymbol=symbol
     bar.symbol=symbol
     bar.open=float(d['Open'])
     bar.high=float(d['High'])
     bar.low=float(d['low'])
     bar.close=float(d['low'])
     bar.date=datetime.strptime(d['date'],'%Y/%m/%d').strftime('%Y%m%d')
     bar.time=d['Time']
     bar.datetime=datetime.strptime(bar.date+''+bar.time,'%Y%m%d %H:%M:%S')
     bar.volume=d['TotalVolume']

     flt={'datetime':bar.datetime}
     collection.update_one(flt,{'$set':bar/__dict__},upsert=True)
     print bar.date,bar.time

 print u'插入完毕,耗时:%s' %(time()-start)

LoadMcCsv

参数 类型 说明
fileName string Multicharts导出数据的文件名,如 ’IF0000_1min.csv‘
dbName string MongoDB数据类型,如’MINUTE_DB_NAME‘
symbol string 合约代码,如'IF0000'

导入命令

 loadMcCsv('IF0000_1min.csv',MINUTE_DB_NAME,'IF0000')
  • 使用通信达导入历史分钟数据

    • 代码如下
    import csv 
    
    start=time()
    print u'开始读取CSV文件%s中的数据插入到%s的%s中', %(fileName,dbName,symbol)
    
    #锁定集合,并创建索引
    host,port,logging=loadMongoSetting()
    client=pymongo.MongoClient(host,port)
    collection=client[dbName][symbol]
    collection.ensure_index([('datetime',pymongo.ASCENDING)],unique=True)
    
    #读取数据和插入到数据库
    reader=csv.reader(file(fileName,'r'))
    for d in reader:
        bar=CtaBarData()
        bar.vtSymbol=symbol
        bar.symbol=symbol
        bar.open=float(d[2])
        bar.high=float(d[3])
        bar.low=float(d[4])
        bar.close=float(d[5])
        bar.date=datetime.strptime(d[0],'%Y/%m/%d').strftime('%Y%m%d')
        bar.time=d[1][:2]+':'+d[1][2:4]+':00'
        bar.datetime=datetime.strptime(bar.date+''+bar.time,'%Y%m%d %H:%M:%S')
        bar.volume=d[6]
        bar.openInterest=d[7]
    
        flt={'datetime':bar.datetime}
        collection.update_one(flt,{'$set':bar.__dict__},upsert=True)
        print bar.date,bar.time
    
    print u'插入完毕,耗时:%s'%(time()-start)
    

loadTdxCsv

参数 类型 说明
fileName string 通达信导出数据的文件名,如‘CL8.csv')
dbName string MongoDB数据类型,如’MINUTE_DB_NAME'
symbol string 合约代码,如'c0000'

导入命令

loadTdxCsv('CL8.csv',MINUTE_DB_NAME,'c0000')
  • Tushare下载沪深股票日行情

    • 使用tushare下载沪深股票数据插入Mongodb:

      • 代码:

      ```
      def downloadEquityDailyBarts(self,symbol):

      """  
      下载股票的日行情,symbol是股票代买  
      """  
      import tushare as ts  
      print u'开始下载%s日行情',%symbol
      
      #查询数据库中已有数据的最后日期
      cl=self.dbClient[Daily_DB_NAME][symbol]
      cx.cl.find(sort=[('datetime',pymongo.DESCENDING)])
      if cx.count():
          last=cx[0]
      else:
          last=''
      #开始下载数据
      
      if last:
          start=last['date'][:4]+'-'+last['date'][4:6]+'-'+last['date'][6:]
      
      data=ts.get_k_data(symbol,start)
      
      if not data.empty:
          #创建datatime索引
          self.dbClient[DAILY_DB_NAME][symbol].ensure_index(['datetime',pymongo.ASCENDING)],unique=True)
      
          for index,d in data.iterrows():
              bar=CtaBarData()
              bar.vtSymbol=symbol
              bar.symbol=symbol
              try:
                  bar.open=d.get('open')
                  bar.high=d.get('high')
                  bar.low=d.get('low')
                  bar.close=d.get('close')
                  bar.date=d.get('date').replace('_','')
                  bar.time=''
                  bar.datetime=datetime.strptime(bar.date,%Y%m%d')
                  bar.volume=d.get('volume')
              except KeyError:
                  print d
      
              flt={'datetime':bar.datetime}
                  self.dfClient[DAILY_DB_NAME][symbol].update_one(flt,{'$set':bar.__dict__},upsert=True)
      
              print u'%s下载完成’%ssymbol
          else:
              print u'找不到合约%s‘ %symbol
      

      ```

downloadEquityDailyBars

参数 类型 说明
symbol string 合约代码,如’000001‘

下载步骤:

  1. 创建API下载引擎实例
e=HistoryDataEngine()

2.选择所要下载品种选择相应函数,如下载'000001'日行情

e.downloadEquityDailyBars('00001')

results matching ""

    No results matching ""