我的米筐账号试用期到了,看到张国平一篇聚宽的接入文章《利用聚宽(Joinquant)数据源为vnpy添加期货行情数据》深受启发,整了一个聚宽数据(JDDataSDK)集成方案,可以和米筐数据并存,自由配置切换,具体特性如下:

1)抽象了行情数据接口

2)实现了vn_symobl到jq_symbol的转换

3)避免了jqdata在交易日自动填充交易量为0的脏数据BUG,原理参考国平的文章《如果使用Joinquant做实盘行情数据,有一个比较大bug的要注意》

4)实现了和VNPY的深度集成,可以采用VNPY的配置界面实现傻瓜式配置。

聚宽数据的具体介绍,包括如何申请账号在国平的文章里已经写得很清楚了,需要了解的兄弟可以参考上文链接,本文主要介绍如何与VNPY集成在一起。

第一步:配置行情数据源,具体如下图所示:

行情配置的代码很简单,在setting.py文件里加上三行代码即可,具体如下:

"mddata.api": "rqdata",

"jqdata.username": "",

"jqdata.password": "",

第二步:抽象了行情数据接口,所有文件集中在 trader/mddata 文件夹中:

dataapi.py文件是抽象类:

from abc import ABC, abstractmethod

from vnpy.trader.object import HistoryRequest

class MdDataApi(ABC):

"""

抽象数据接口

"""

@abstractmethod

def init(self, username="", password=""):

"""

初始化行情数据接口

:param username: 用户名

:param password: 密码

:return:

"""

pass

@abstractmethod

def query_history(self, req: HistoryRequest):

"""

查询历史数据接口

:param req:

:return:

"""

pass

jqdata.py是聚宽数据接口的具体实现

import jqdatasdk as jq

from datetime import timedelta, datetime

from typing import List

from vnpy.trader.constant import Exchange, Interval

from vnpy.trader.mddata.dataapi import MdDataApi

from vnpy.trader.object import BarData, HistoryRequest

from vnpy.trader.setting import SETTINGS

INTERVAL_VT2JQ = {

Interval.MINUTE: "1m",

Interval.HOUR: "60m",

Interval.DAILY: "1d",

}

INTERVAL_ADJUSTMENT_MAP_JQ = {

Interval.MINUTE: timedelta(minutes=1),

Interval.HOUR: timedelta(hours=1),

Interval.DAILY: timedelta() # no need to adjust for daily bar

}

class JqdataClient(MdDataApi):

"""聚宽JQData客户端封装类"""

def __init__(self):

""""""

self.username = SETTINGS["jqdata.username"]

self.password = SETTINGS["jqdata.password"]

self.inited = False

def init(self, username="", password=""):

""""""

if self.inited:

return True

if username and password:

self.username = username

self.password = password

if not self.username or not self.password:

return False

try:

jq.auth(self.username, self.password)

except Exception as ex:

print("jq auth fail:" + repr(ex))

return False

self.inited = True

return True

def to_jq_symbol(self, symbol: str, exchange: Exchange):

"""

CZCE product of RQData has symbol like "TA1905" while

vt symbol is "TA905.CZCE" so need to add "1" in symbol.

"""

if exchange in [Exchange.SSE, Exchange.SZSE]:

if exchange == Exchange.SSE:

jq_symbol = f"{symbol}.XSHG" # 上海证券交易所

else:

jq_symbol = f"{symbol}.XSHE" # 深圳证券交易所

elif exchange == Exchange.SHFE:

jq_symbol = f"{symbol}.XSGE" # 上期所

elif exchange == Exchange.CFFEX:

jq_symbol = f"{symbol}.CCFX" # 中金所

elif exchange == Exchange.DCE:

jq_symbol = f"{symbol}.XDCE" # 大商所

elif exchange == Exchange.INE:

jq_symbol = f"{symbol}.XINE" # 上海国际能源期货交易所

elif exchange == Exchange.CZCE:

# 郑商所 的合约代码年份只有三位 需要特殊处理

for count, word in enumerate(symbol):

if word.isdigit():

break

# Check for index symbol

time_str = symbol[count:]

if time_str in ["88", "888", "99", "8888"]:

return symbol

# noinspection PyUnboundLocalVariable

product = symbol[:count]

year = symbol[count]

month = symbol[count + 1:]

if year == "9":

year = "1" + year

else:

year = "2" + year

jq_symbol = f"{product}{year}{month}.XZCE"

return jq_symbol.upper()

def query_history(self, req: HistoryRequest):

"""

Query history bar data from JQData.

"""

symbol = req.symbol

exchange = req.exchange

interval = req.interval

start = req.start

end = req.end

jq_symbol = self.to_jq_symbol(symbol, exchange)

# if jq_symbol not in self.symbols:

# return None

jq_interval = INTERVAL_VT2JQ.get(interval)

if not jq_interval:

return None

# For adjust timestamp from bar close point (RQData) to open point (VN Trader)

adjustment = INTERVAL_ADJUSTMENT_MAP_JQ.get(interval)

# For querying night trading period data

# end += timedelta(1)

now = datetime.now()

if end >= now:

end = now

elif end.year == now.year and end.month == now.month and end.day == now.day:

end = now

df = jq.get_price(

jq_symbol,

frequency=jq_interval,

fields=["open", "high", "low", "close", "volume"],

start_date=start,

end_date=end,

skip_paused=True

)

data: List[BarData] = []

if df is not None:

for ix, row in df.iterrows():

bar = BarData(

symbol=symbol,

exchange=exchange,

interval=interval,

datetime=row.name.to_pydatetime() - adjustment,

open_price=row["open"],

high_price=row["high"],

low_price=row["low"],

close_price=row["close"],

volume=row["volume"],

gateway_name="JQ"

)

data.append(bar)

return data

jqdata_client = JqdataClient()

rqdata.py文件是VNPY已经提供的米筐数据接口实现,这里就改了一句,增加对标准接口MdDataApi的继承

class RqdataClient(MdDataApi):

init.py文件会根据setting.py的配置文件加载具体的行情数据接口

from vnpy.trader.mddata.dataapi import MdDataApi

from vnpy.trader.mddata.jqdata import jqdata_client

from vnpy.trader.mddata.rqdata import rqdata_client

from vnpy.trader.setting import SETTINGS

if SETTINGS["mddata.api"] == "jqdata":

mddata_client: MdDataApi = jqdata_client

else:

mddata_client: MdDataApi = rqdata_client

第三步:使用mddata_client替换rqdata_client即可,例如cta_strategy/engine.py文件的改造如下:

注意:script_trader/engine.py,cta_backtester/engine.py,cta_strategy/engine.py 这三个文件都要改造

from vnpy.trader.mddata import mddata_client

def init_rqdata(self):

"""

Init RQData client.

"""

result = mddata_client.init()

md_data_api = SETTINGS["mddata.api"]

if result:

self.write_log(f"{md_data_api}数据接口初始化成功")

def query_bar_from_rq(

self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime

):

"""

Query bar data from RQData.

"""

req = HistoryRequest(

symbol=symbol,

exchange=exchange,

interval=interval,

start=start,

end=end

)

try:

data = mddata_client.query_history(req)

except Exception as ex:

self.write_log(f"{symbol}.{exchange.value}合约下载失败:{ex.args}")

return None

return data

聚宽数据python_聚宽数据(JDDataSDK)集成方案(试用期长达一年)相关推荐

  1. 聚宽数据python_聚宽量化(Zen)

    一.基本 网址:https://www.joinquant.com 自己用过的jupyter在登陆后的首页--"我的研究文件"里面. 二.取数 通过在线jupyter取数 impo ...

  2. 解析列表中的数据python_将html数据解析成python列表进行操作

    我会采取完全不同的方法.我们使用LXML来抓取html页面 我们切换的原因之一是因为BS有一段时间没有被维护,或者我应该说是更新了.在 在我的测试中,我运行了以下内容import requests f ...

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

    ----------------July 9 2019--------------- ----------------July 9 2019--------------- 现在基于网络量化平台做的都很 ...

  4. 拉取并且mongo保存聚宽的期货分钟线数据

    聚宽服务 在聚宽官网申请账号,然后阅读相关 api 文档. https://www.joinquant.com/view/user/floor?type=mainFloor 安装 SDK 并且登录 使 ...

  5. 聚宽 get_price 多个股票数据_聚宽量化一个命令获取全部股票全部的财务报表数据...

    -- 本篇文章 by Richard 通过这个代码,可以获得全部股票从2010年开始的三大报表数据.聚宽的财务数据是每季度更新,因此我们获取2010年以来全部的季度数据,已沪深300为例.数据由JQD ...

  6. 聚宽 get_price 多个股票数据_量化交易入门教程,获取典型常用数据

    获取典型常用数据 摘要 聚宽数据 获取指数成分股 获取股票行情数据 获取股票财务数据 自测与自学 聚宽数据 在聚宽数据这个页面可以看到聚宽平台集成好的各大类数据,如下图,点击可以查看详情与用法. 但实 ...

  7. 读写位宽不同的FIFO,数据输入输出顺序是怎么样的?BRAM又如何呢?

    原文地址:https://wenku.baidu.com/view/7d7cf156284ac850ac0242b6.html 对于BRAM: 1)写位宽小于读位宽: 先入存低位,后入存高位: 如写4 ...

  8. R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表、对转化为长表的数值数据列进行离散化、pivot_wider将数据转化为宽表

    R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表.对转化为长表的数值数据列进行离散化.pivot_wider将数据转化为宽表 ...

  9. 数据离散化 - 等宽等频聚类离散 - Python代码

    目录 等宽离散 等频离散 聚类离散 附录: rolling_mean函数解释 cut函数解释 其他数据预处理方法 一些数据挖掘算法中,特别是某些分类算法(eg:ID3算法.Aprioroi算法等),要 ...

最新文章

  1. 中国电子信息产业发展研究院主办的2018中国软件大会上大快搜索“又双叒叕”获奖了...
  2. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...
  3. curl不通 k8s_如何利用curl命令访问Kubernetes API server
  4. 南阳oj 1的个数
  5. 解决Win10不能访问共享文件夹的问题
  6. android第五天晚:surfaceView
  7. Django--网页管理实例解析
  8. NG Updata(升级)
  9. jqgrid使用小记
  10. mysql 权限管理无效_mysql 权限控制笔记
  11. matlab 机器学习相关函数、api
  12. python 知乎美女_听说知乎大神用python爬取高颜值美女,是怎么操作的?
  13. 【笔记】人工智能 一种现代方法 第1章 绪论
  14. 亿佰特Wifi模块、蓝牙模块和Zigbee模块协议在物联网智能家居上的应用指南
  15. 笑话:如果你在河边等待得足够久,你会看到你的敌人的尸体漂过,是怎么翻译出来的?
  16. 网页版飞信(Fetion)的安全问题
  17. 【毕业设计】基于java web的医院预约挂号系统
  18. opensuse15.0测试使用snapper
  19. scala在idea中的配置
  20. 利用qrcode生成二维码

热门文章

  1. java-swing-列表框
  2. 想在领英开发客户,却发现举步维艰,如何解锁领英开发客户新模式
  3. 新版「李雷与韩梅梅」深度好文
  4. asp.net花店购物商城系统
  5. Jenkins 配置相关:Poll SCM 和 Build periodically 区别
  6. 论文阅读——Self-Attention with Relative Position Representations
  7. 查询局域网内所有再用ip
  8. 考研机试:数学问题之日期类问题
  9. 组队学习(数列极限)
  10. 国投新股研究所 IPO 报告 :融信服务 02207 HK