金融数据找不到?那是你没见识到joinquant的利器——JQData

Python kingmo888 1645℃ 0评论

金融数据找不到?那是你没见识到joinquant的利器——JQData

——记一次用JQData补充本地缺失期货1分钟行情数据。

缘起

我们的策略体系涵盖范围比较多,有股票、期货为交易标的的各类策略,单就期货部分而言,高频的数据用的比较少,Tick级的数据也是后来才开始落地储备。

近期因为某些需求,需要整理2010年以来的期货全品种全合约的1分钟数据,此前从朋友那里刷脸拿来一批高质量1分钟数据,数据截止到2017年10月27日,而我们自己的tick数据是从2017年底才开始落地,中间差不多缺失了1个月左右的数据。

缺失的数据怎么补充?从哪补充?质量是否可靠?

最终通过多维度的对比,我选择了——JQData。主要原因有几个:

第一、轻量化。像Wind之类的终端,不安装终端是没可能获取数据的,而终端有滚动7日1000万条数据(按字段)的限制,一条标准的1分钟K线数据包含:【时间戳、开盘价、最高价、最低价、收盘价、持仓量、成交量】,一条数据就有7个字段。所以看起来1000万不小实际没多少。只要用完,wind终端其他数据查询功能也用不了。而JQData现在是每天100万条数据,记住,是条!这一条中1个字段是一条,10个字段还是一条!

第二、质量。质量高不高,是用出来的、对不出来的,经过与多个数据源对比,质量很可靠。

第三、高效反馈。JoinQuant的社区真不是摆设,官方人员长期潜伏,遇到问题瞬间冒头这事儿真的容易圈粉,扛不住啊扛不住。而且,社区里高质量的帖子很多,潜水大神很多。当然啦,谁都有事情要忙的嘛,关于提问,给一个建议:能用搜索解决的问题一定别放过百度/Google。

第四、使用门槛低、成本无。时间成本不用考虑,用什么都需要时间。但JQData除了需要申请一下,其他啥成本也没有了。付费??不存在的。福利之所以称之为福利原因有2个:1、够不着付费的门槛。2、穷。  没错,金融的世界就是这么现实!

还好有joinquant来送温暖。

但是,申请入口请自行百度。总不能让人把饭喂到嘴里才算能吃下去。

安装篇

直接在cmd命令行下使用python的pip方式安装即可:

pip install jqdatasdk

如果安装过程中出现如下错误:

Cannot uninstall 'sqlalchemy’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

可以对安装命令增加一个参数–ignore-installed,即使用如下命令:

pip install --ignore-installed jqdatasdk

其作用是忽略已安装的某些模块。

一般而言,如果你的Python环境没有魔改过,或者多个版本在一层内并存的话,不会出现什么问题。如果真的遇到了问题,没关系,社区有安装问答贴—>https://www.joinquant.com/post/12479

使用篇

使用前,首先引入jqdata所有方法:

from jqdatasdk import *

引入后,可以通过是否能够成功登陆来测试,

auth('账号','密码') #账号是申请时所填写的手机号;密码为聚宽官网登录密码,新申请用户默认为手机号后6位

在最新版本(JQData1.5.3)中,登陆成功后会有信息打印出来。同时,可以使用get_query_count()方法来查看剩余可用调数。如下图:

看到截图中的数据是否表示表示好奇?数据有问题啊,前文说100万,为啥博主这里是1000万了?——————就在写本文的过程中,已然获得JQ官方的支持。如果想要增加流量,甚至获得机构版的JQ终端,都是有很大机会的!哪怕复制粘贴是的!哪怕复制粘贴!

对于jqdata的登录,原版auth的登录无论是否登录成功都不会有结果返回,如果自动化任务定时执行时,需要对是否登录成功进行判断,利用官方接口中如果登录失败会报错,登录成功则打印信息的逻辑,封装一个登录方法:

def login(user, pw):
    try:
        auth(user, pw)
        return True
    except Exception as e:
        print(e)
        return False

考虑到期间有可能存在交割品种事件,要精确到每个品种自身的日线行情的时间区间。因此需要获取到每个品种的行情首尾日期。
当然,聚宽提供了更简单的方法,get_future_contracts('M','2017-10-28'),就可以获取到当日该品种所有的在市合约列表了。
但物尽其用,本地有数据就没必要浪费接口资源。

引入jqdata之外的其他必要库:

import os
import pymssql
# 引入自己的包
from baselib import getdata, getsymtype
from lzh.Config import Config

从数据库中拉取分钟线中缺失时间段的日线行情: 

islogin = login('******', '******')

cn = Config('config.ini')
conn = pymssql.connect(
        host=cn.getConfig('mssqldb','server'), 
        user=cn.getConfig('mssqldb','user'),
        password=cn.getConfig('mssqldb','password'),
        database=cn.getConfig('mssqldb','database'),
        charset="UTF-8")

sdate = '20171027'
edate = '20171130'

# 自定义函数, 获取本地数据库日线行情
mktdata = getdata(conn, sdate, edate, 'day')
mktdata = mktdata.set_index('date')

行情结构如下:

接下来,我们只要这数据中的合约代码、每个合约行情的起始时间。

symtype_dates = {}
for x, symcode_data in mktdata.groupby('symbol'):
    symtype_dates[x] = []
    if len(symcode_data)<=2:
        # 确保该时间内数据大于2条,否则该品种太不活跃,无存在意义。
        continue
    symtype_dates[x].extend([symcode_data.index[0], symcode_data.index[-1]])
        

如图所见,确实存在着起始日期不一致的情况,单独处理是必要的:

在取得上述信息后,就可以愉快的通过jqdata获取行情了。

get_price是获取行情的方法。具体用法参见官方文档(非常详细)。

对于get_price方法,是可以传入多个合约/股票代码的。更加高效和简洁。
但考虑到本次数据区间较短、起止时间可能有差异,因此采用逐个传入的方式下载1分钟期货数据。

统一品种交易所后缀,取该品种主力后缀,每个品种仅取一次。

exchangedata = {}    #品种所属交易所。
#fields = ['open', 'high', 'low', 'close', 'volume', 'position']
for symcode in symtype_dates.keys():
    print(symcode)
    fpath = r'data/{}.csv'.format(symcode)
    if os.path.exists(fpath):
        continue
    tmp_sdate, tmp_edate = symtype_dates[symcode]
    symtype = getsymtype(symcode)   # 将合约代码转为品种
    if symtype not in exchangedata.keys():
        tmpsymcode = get_dominant_future(symtype)
        exchangedata[symtype] = tmpsymcode.split('.')[-1]
    
    symcode2 = '{}.{}'.format(symcode, exchangedata[symtype])
    data = get_price(symcode2, start_date=tmp_sdate, end_date=tmp_edate, \
                     frequency='1m', fields=None, skip_paused=True, fq=None, count=None)
    
    data.to_csv(fpath)

写到这里,基本上JQData的最基础用法已经介绍完了,而行情对于聚宽所能提供的数据来说,只是沧海一粟,完全不值得单独拿出来讲,但既然用到了,说一说还是有必要的。

那JQData还能提供啥呢?

我想一句话能够概括——“你想到的金融数据,聚宽都有。如果,它没有,它可以有。

最后,感谢所有帮助过我的朋友们、平台们。谢谢。

 

转载请注明:Python量化投资 » 金融数据找不到?那是你没见识到joinquant的利器——JQData

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址