VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 9
声望: 0

IF88是啥合约啊,只有IF8888

Member
avatar
加入于:
帖子: 25
声望: 0

谢谢,终于下载成功了,还是上github复制的,我自己改代码,总是错。

Member
avatar
加入于:
帖子: 3
声望: 0

Traceback (most recent call last):
File "E:\vnstudio\lib\site-packages\vnstation\cli.py", line 90, in run_trader
module = importlib.import_module(d["module"])
File "E:\vnstudio\lib\importlib__init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "E:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\
init__.py", line 9, in <module>
from .engine import CtaEngine
File "E:\vnstudio\lib\site-packages\vnpy\app\cta_strategy\engine.py", line 40, in <module>
from vnpy.trader.mddata import mddata_client
ImportError: cannot import name 'mddata_client' from 'vnpy.trader.mddata' (unknown location)

楼主,这是什么错误,请指正一下,谢谢。

Member
avatar
加入于:
帖子: 3
声望: 0

可以了,是init.py 函数命名错误

Member
avatar
加入于:
帖子: 3
声望: 0

测试可以了。但在模拟时,点启动,提示找不到合约,那位有类似的经历。

Member
avatar
加入于:
帖子: 259
声望: 3

Traceback (most recent call last):
File "C:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 69, in init_rqdata
result = mddata_client.init()
File "C:\vnstudio\lib\site-packages\vnpy\trader\mddata\rqdata.py", line 54, in init
('rqdatad-pro.ricequant.com', 16011))
File "C:\vnstudio\lib\site-packages\rqdatac\client.py", line 166, in init
quota = get_client().execute("user.get_quota")
File "C:\vnstudio\lib\site-packages\rqdatac\decorators.py", line 59, in wrap
return func(args, **kwargs)
File "C:\vnstudio\lib\site-packages\rqdatac\thread_local.py", line 43, in execute
return self._execute(self._get_connection(), method, args, kwargs)
File "C:\vnstudio\lib\site-packages\rqdatac\thread_local.py", line 39, in _execute
raise e
File "C:\vnstudio\lib\site-packages\rqdatac\thread_local.py", line 34, in _execute
return conn.execute(method,
args, **kwargs)
File "rqdatac\connection.py", line 120, in rqdatac.connection.Connection.execute
File "rqdatac\connection.py", line 90, in rqdatac.connection.Connection._read_one_packet
rqdatac.share.errors.QuotaExceeded: quota exceeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\vnstudio\lib\site-packages\vnpy\trader\ui\mainwindow.py", line 278, in open_widget
widget = widget_class(self.main_engine, self.event_engine)
File "C:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\ui\widget.py", line 49, in init
self.backtester_engine.init_engine()
File "C:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 62, in init_engine
self.init_rqdata()
File "C:\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 74, in init_rqdata
self.write_log(f"{md_data_api}初始化异常{e.args}")
UnboundLocalError: local variable 'md_data_api' referenced before assignment

@tonywang_efun 老师您好,报这个错,您知道是怎么回事儿吗?望回答,万分感激

Member
avatar
加入于:
帖子: 259
声望: 3

description

description

description
望楼主解答,万分感激,按照JQData的规则输入主力合约代码:IC9999.CCFX ,均报错如图所示

Member
avatar
加入于:
帖子: 41
声望: 3

感谢分享!

Member
avatar
加入于:
帖子: 11
声望: 1

description
数据下载了一晚上也没有下载完,请问这个是什么问题?

Member
avatar
加入于:
帖子: 12
声望: 0

也遇到楼上的问题了,数据一直下载不下来。

Member
avatar
加入于:
帖子: 2
声望: 0

description
配置好后可以连接Jqdata。下载数据卡死不动,通过cmd启动vnpy发现抱错“xsge” is not a vaild Exchange。
请问有知道是哪有问题的帮忙解答一下

Member
avatar
加入于:
帖子: 25
声望: 0

Exception in thread Thread-5:
Traceback (most recent call last):
File "D:\vnstudio D\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "D:\vnstudio D\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "D:\vnstudio D\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 351, in run_downloading
symbol, exchange = extract_vt_symbol(vt_symbol)
File "D:\vnstudio D\lib\site-packages\vnpy\trader\utility.py", line 28, in extract_vt_symbol
return symbol, Exchange(exchange_str)
File "D:\vnstudio D\lib\enum.py", line 309, in call
return cls.new(cls, value)
File "D:\vnstudio D\lib\enum.py", line 543, in new
return cls.missing(value)
File "D:\vnstudio D\lib\enum.py", line 556, in missing
raise ValueError("%r is not a valid %s" % (value, cls.name))
ValueError: 'CFEX' is not a valid Exchange
我这个问题,怎么破

Member
avatar
加入于:
帖子: 21
声望: 1

02:08:25 初始化CTA回测引擎
02:08:25 策略文件加载完成
02:08:27 ----------------------------------------
02:08:27 IF88.CFFEX-1m开始下载历史数据
02:08:27 数据下载失败,触发异常:
Traceback (most recent call last):
File "d:\quant\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 384, in run_downloading
data = mddata_client.query_history(req)
File "d:\quant\vnstudio\lib\site-packages\vnpy\trader\mddata\jqdata.py", line 123, in query_history
if end >= now:
TypeError: can't compare offset-naive and offset-aware datetimes

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

这是什么问题?

Member
avatar
加入于:
帖子: 18
声望: 1

请教个问题,我按照您说的把代码改了而且添加了文件,尤其是setting里面,但是配置里jqdata的信息出不来怎么回事?

description

Member
加入于:
帖子: 7
声望: 2

setting.py要改一下才能出来

yangliu wrote:

请教个问题,我按照您说的把代码改了而且添加了文件,尤其是setting里面,但是配置里jqdata的信息出不来怎么回事?

description

Member
加入于:
帖子: 7
声望: 2

现在是多时区了,jqdata要改下,加上
CHINA_TZ = timezone("Asia/Shanghai")

....

now = CHINA_TZ.localize(now)

tonywang_efun wrote:

我的米筐账号试用期到了,看到张国平一篇聚宽的接入文章《利用聚宽(Joinquant)数据源为vnpy添加期货行情数据》深受启发,整了一个聚宽数据(JDDataSDK)集成方案,可以和米筐数据并存,自由配置切换,具体特性如下:
1)抽象了行情数据接口
2)实现了vn_symobl到jq_symbol的转换
3)避免了jqdata在交易日自动填充交易量为0的脏数据BUG,原理参考国平的文章《如果使用Joinquant做实盘行情数据,有一个比较大bug的要注意
4)实现了和VNPY的深度集成,可以采用VNPY的配置界面实现傻瓜式配置。

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

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

description

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

    "mddata.api": "rqdata",

    "jqdata.username": "",
    "jqdata.password": "",

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

description

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
Member
avatar
加入于:
帖子: 18
声望: 1

悟空 wrote:

setting.py要改一下才能出来

yangliu wrote:

请教个问题,我按照您说的把代码改了而且添加了文件,尤其是setting里面,但是配置里jqdata的信息出不来怎么回事?

description
我已经在setting.py 里面修改了,还是不行

description

Member
avatar
加入于:
帖子: 4680
声望: 285

你mddata.api上不是写的rqdata吗

Member
avatar
加入于:
帖子: 18
声望: 1

xiaohe wrote:

你mddata.api上不是写的rqdata吗

感谢回复,这样还是没有变化

description

Member
avatar
加入于:
帖子: 4
声望: 0

清风 wrote:

02:08:25 初始化CTA回测引擎
02:08:25 策略文件加载完成
02:08:27 ----------------------------------------
02:08:27 IF88.CFFEX-1m开始下载历史数据
02:08:27 数据下载失败,触发异常:
Traceback (most recent call last):
File "d:\quant\vnstudio\lib\site-packages\vnpy\app\cta_backtester\engine.py", line 384, in run_downloading
data = mddata_client.query_history(req)
File "d:\quant\vnstudio\lib\site-packages\vnpy\trader\mddata\jqdata.py", line 123, in query_history
if end >= now:
TypeError: can't compare offset-naive and offset-aware datetimes

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

这是什么问题?
我今天刚用,也遇到这个问题,您解决了么?

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】