利用聚宽(Joinquant)数据源为vnpy添加期货行情数据

本文介绍了利用聚宽(Joinquant)数据源JQData为vnpy添加期货行情数据的方法。对比了richquant和聚宽的试用期限,给出了实现代码的结构和使用步骤,包括安装sdk、注册试用数据、维护登录信息等,代码可在github下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----------------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.在聚宽平台注册试用数据,链接: https://www.joinquant.com/default/index/sdk

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文件夹下载。

https://github.com/BillyZhangGuoping/MarketDataAnaylzerbyDataFrame





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-2643621/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22259926/viewspace-2643621/

期货全品种行情下载工具和行情重播回测API 期货市场全品种行情tick数据收集工具3.1 支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情, 当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api 调用方法,通知服务器停止回播实时行情。 目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。 对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会 完整的并发解决方案。 期货市场全品种行情tick数据收集工具3.0 (1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题 未来升级版本将优化性能 期货市场全品种行情tick数据收集工具2.9b 清理了不需要的.lib,不会再提示缺少ctp的dll文件,删除了不需要的方法 支持任意IP地址的连接,可以实现连接云主机运行的行情收集服务器,或局域网里的行情收集服务器。 期货市场全品种行情tick数据收集工具2.9 修复了多个API进程之间回调数据时互相影响 当前合约数约323个合约,最大范围1200个合约,视合约产品而定。 本例正式发布版本2.7 可以自由设置行情服务器 模拟simnow24小时行情服务器在交易日上午没有数据,要在下午4点之后才有数据。 模拟simnow实盘同步时间服务器,和实盘同步。 可改为期货公司的服务器IP,见“快期”软件设置“测试和代理”中的行情IP地址 双击合约文件列表可打开分时图 TestPythonApi可以调用DataCollectServer收集的行情数据(给定合约和时间段) 2017.3.11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值