量化學習:聚寬jqdatasdk對接vnpy的數據服務


數據服務:使用聚寬jqdatasdk獲取分鍾數據按vnpy的Bar格式導入至mongodb中

提供downloadAllMinuteBar(),可以通過定時任務的形式,按vnpy的數據格式,每日獲取分鍾數據寫入到mongodb當中

提供downloadMinuteBarByDate,可以輸入開始日期與結束日期,將時間段內的分鍾數據寫入到mongodb當中

在config文件中配置jqdatasdk的用戶名密碼

每日增量數據獲取(作為數據服務,每日自動運行,將當日的增量數據插入到數據庫中):

#----------------------------------------------------------------------
# 當日數據下載,定時任務使用
def downloadAllMinuteBar():
    jqdatasdk.auth(JQDATA_USER, JQDATA_PASSWORD)
    """下載所有配置中的合約的分鍾線數據"""
    print('-' * 50)
    print(u'開始下載合約分鍾線數據')
    print('-' * 50)

    today = datetime.today().date()

    trade_date_list = jqdatasdk.get_trade_days(end_date=today, count=2)

    symbols_df = jqdatasdk.get_all_securities(types=['futures'], date=today)
    
    for index, row in symbols_df.iterrows():
        downMinuteBarBySymbol(index, row, str(today), str(trade_date_list[-2]))

    print('-' * 50)
    print(u'合約分鍾線數據下載完成')
    print('-' * 50)
    return

某段時間內的全量數據(為了補全某一段時間的全量數據進行使用):

#----------------------------------------------------------------------
# 按日期一次性補全數據
def downloadMinuteBarByDate(start_date, end_date=datetime.today().date()):
    jqdatasdk.auth(JQDATA_USER, JQDATA_PASSWORD)
    """下載所有配置中的合約的分鍾線數據"""
    print('-' * 50)
    print(u'開始下載合約分鍾線數據')
    print('-' * 50)

    trade_date_list = jqdatasdk.get_trade_days(start_date=start_date, end_date=end_date)

    i = 0
    for trade_date in trade_date_list:
        if i == 0:
            i = 1
            continue

        symbols_df = jqdatasdk.get_all_securities(types=['futures'], date=trade_date)

        for index, row in symbols_df.iterrows():
            downMinuteBarBySymbol(index, row, str(trade_date_list[i]), str(trade_date_list[i-1]))

        i += 1

    print('-' * 50)
    print(u'合約分鍾線數據下載完成')
    print('-' * 50)
    return

具體合約當日的數據下載函數與vnpy的Bar類型數據的生成插入數據庫的過程:

#----------------------------------------------------------------------
def generateVtBar(symbol, time, d):
    """生成K線"""
    bar = VtBarData()
    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['close'])
    bar.date = datetime.strptime(time[0:10], '%Y-%m-%d').strftime('%Y%m%d')
    bar.time = time[11:]
    bar.datetime = datetime.strptime(bar.date + ' ' + bar.time, '%Y%m%d %H:%M:%S')
    bar.volume = d['volume']
    
    return bar

#----------------------------------------------------------------------
def downMinuteBarBySymbol(symbol, info, today, pre_trade_day):
    start = time()

    symbol_name = info['name']
    cl = db[symbol_name]
    cl.ensure_index([('datetime', ASCENDING)], unique=True)  # 添加索引

    # 在此時間段內可以獲取期貨夜盤數據
    minute_df = jqdatasdk.get_price(symbol, start_date=pre_trade_day + " 20:30:00",end_date=today + " 20:30:00", frequency='minute')

    # 將數據傳入到數據隊列當中
    for index, row in minute_df.iterrows():
        bar = generateVtBar(symbol_name, str(index), row)
        d = bar.__dict__
        flt = {'datetime': bar.datetime}
        cl.replace_one(flt, d, True)

    e = time()
    cost = (e - start) * 1000

    print(u'合約%s數據下載完成%s - %s,耗時%s毫秒' % (symbol_name, pre_trade_day, today, cost))

vnpy中提供了好幾個數據服務的實現,功能也比較簡單,但是能有不錯的功效,聚寬的jqdatasdk也提供了很好的數據服務,十分有利於建立本地的體系。

Github:

JQdataServiceForVNPY


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM