利用聚寬(Joinquant)資料來源為vnpy新增期貨行情資料

張國平發表於2019-05-07

----------------July 9 2019---------------

更新了原始碼,因為有個bug。 http://blog.itpub.net/22259926/viewspace-2650011/

----------------July 9 2019---------------


現在基於網路量化平臺做的都很專業,richquant也是vnpy資料來源的提供方;不過richquant的試用版只有30天,而聚寬 (Joinquant)有一年試用期,而且也提供連續主力資料。


我就東抄西抄,利用以後logic,做了使用 聚寬(Joinquant)資料來源JQData為vnpy新增期貨行情資料。

程式碼就兩個檔案,一個config.json主要放登陸使用者名稱和期貨品種名稱對應表,因為期貨品種在聚寬的名稱是不一樣的。

JQDataload.py是提供分鐘級別下載方法,和一個 期貨品種名稱對照列表從聚寬下載。

聚寬一天提供100萬條資料下載,所以每次下載結束會有倒數計時提供。其實程式碼很簡單,唯一難點就是就是vnpy是每天9點00開始點,而聚寬是每天9點01為開始點;就抄抄之前vnpy已有程式碼解決。

結構如下

-JDDataService

  |--config.json

  |--JQDataload.py


其實使用很簡單,步驟如下:

1.執行 pip install jqdatasdk , 安裝jqdata的sdk

2.在聚寬平臺註冊試用資料,連結:

3.在config.json中維護登入名和密碼,

4.執行JQDataload.py


config.json 程式碼如下:

{
   "Username": "聚寬申請",
   "Password": "聚寬申請",
   "rb1910":"RB1910.XSGE",
   "zn1807": "ZN1807.XSGE",
   "rb0000": "RB9999.XSGE"
}

JQDataload.py程式碼如下:

# encoding: UTF-8
  
from __future__ import print_function
import sys
import json
from datetime import datetime,date,timedelta
from time import time, sleep
  
from pymongo import MongoClient, ASCENDING
import pandas as pd
  
from vnpy.trader.vtObject import VtBarData, VtTickData
from vnpy.trader.app.ctaStrategy.ctaBase import (MINUTE_DB_NAME,
                                                 DAILY_DB_NAME,
                                                 TICK_DB_NAME)
  
import jqdatasdk as jq
  
# 載入配置
config = open('config.json')
setting = json.load(config)
  
mc = MongoClient()  # Mongo連線
dbMinute = mc[MINUTE_DB_NAME]  # 資料庫
# dbDaily = mc[DAILY_DB_NAME]
# dbTick = mc[TICK_DB_NAME]
  
USERNAME = setting['Username']
PASSWORD = setting['Password']
jq.auth(USERNAME, PASSWORD)
  
FIELDS = ['open', 'high', 'low', 'close', 'volume']
  
  
# ----------------------------------------------------------------------
def generateVtBar(row, symbol):
    """生成K線"""
    bar = VtBarData()
  
    bar.symbol = symbol
    bar.exchange = "SHFE"
    bar.vtSymbol = bar.vtSymbol = '.'.join([bar.symbol, bar.exchange])
    bar.open = row['open']
    bar.high = row['high']
    bar.low = row['low']
    bar.close = row['close']
    bar.volume = row['volume']
    bardatetime = row.name
    bar.date = bardatetime.strftime("%Y%m%d")
  
    bar.time = bardatetime.strftime("%H%M%S")
    # 將bar的時間改成提前一分鐘
    hour = bar.time[0:2]
    minute = bar.time[2:4]
    sec = bar.time[4:6]
    if minute == "00":
        minute = "59"
  
        h = int(hour)
        if h == 0:
            h = 24
  
        hour = str(h - 1).rjust(2, '0')
    else:
        minute = str(int(minute) - 1).rjust(2, '0')
    bar.time = hour + minute + sec
  
    bar.datetime = datetime.strptime(' '.join([bar.date, bar.time]), '%Y%m%d %H%M%S')
    return bar
  
  
# ----------------------------------------------------------------------
def jqdownloadMinuteBarBySymbol(symbol,startDate,endDate):
    """下載某一合約的分鐘線資料"""
    start = time()
  
    cl = dbMinute[symbol]
    cl.ensure_index([('datetime', ASCENDING)], unique=True)  # 新增索引
  
    df = jq.get_price(setting[symbol],start_date = startDate,end_date = endDate, frequency='1m', fields=FIELDS,skip_paused = True)
    for ix, row in df.iterrows():
        bar = generateVtBar(row, symbol)
        d = bar.__dict__
        flt = {'datetime': bar.datetime}
        cl.replace_one(flt, d, True)
  
    end = time()
    cost = (end - start) * 1000
  
    print(u'合約%s的分鐘K線資料下載完成%s - %s,耗時%s毫秒' % (symbol, df.index[0], df.index[-1], cost))
    print(jq.get_query_count())
  
def jqdownloadMappingExcel(exportpath = "C:\Project\\"):
    getfuture = jq.get_all_securities(types=['futures'], date=None)
    # list: 用來過濾securities的型別, list元素可選: ‘stock’, ‘fund’, ‘index’, ‘futures’, ‘etf’, ‘lof’, ‘fja’, ‘fjb’.types為空時返回所有股票, 不包括基金, 指數和期貨
    getfuture.to_excel(
                    exportpath + "Mapping" + str(date.today())  + "futures.xls",
                    index=True, header=True)
  
  
# ----------------------------------------------------------------------
def downloadAllMinuteBar(days=10):
    """下載所有配置中的合約的分鐘線資料"""
    print('-' * 50)
    print(u'開始下載合約分鐘線資料')
    print('-' * 50)
  
    startDt = datetime.today() - days * timedelta(1)
    startDate = startDt.strftime('%Y-%m-%d')
  
    # 新增下載任務
    enddt = datetime.today()
    endDate = enddt.strftime('%Y-%m-%d %H:%M:%S')
  
  
    jqdownloadMinuteBarBySymbol('rb1910', startDate, endDate)
  
    print('-' * 50)
    print
    u'合約分鐘線資料下載完成'
    print('-' * 50)
  
if __name__ == '__main__':
    # jqdownloadMappingExcel()
    #下載主力合約
  
    downloadAllMinuteBar(days=10)
    #下載單個品種
    # jqdownloadMinuteBarBySymbol('510050.XSHG',startDate,endDate)

可以在我的github的 JDDataService資料夾下載。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2643621/,如需轉載,請註明出處,否則將追究法律責任。

相關文章