如果使用Joinquant做實盤行情資料,有一個比較大bug的要注意

張國平發表於2019-07-09

在我之前文章中,講了用Joinquant做資料來源,連結: http://blog.itpub.net/22259926/viewspace-2643621/ ,但是在我用作資料來源做實盤交易的時候, 發下一個很危險的bug,更新下。

如下圖,如果執行行情資料下載時候,是在交易日中的話比如2點半或者上午8點,如果填寫的endDate是當天或者之後的日期,那麼返回資料會自動填充到下午3點交易時候。此時之後的資料都是交易量為0,價格就是2點半時候價格。

所以在用作實盤資料分析時候,必須要填入endDate的分鐘時間為當前時間,才可以確保不會出現控制。整體程式碼更新如下:

# 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)

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

相關文章