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

udata返回的期货夜盘分钟数据格式是:
description
但是vnpy没有调整时间序列,直接把udata返回的时间戳当做了时间序列来存储,导致数据前后互换。

修改:
将vnpy_udata\udata_datafeed.py中query_futures_bar_history函数替换为:

    def query_futures_bar_history(self, req: HistoryRequest) -> Optional[List[BarData]]:
        """查询期货分钟K线数据"""
        symbol = req.symbol
        exchange = req.exchange
        interval = req.interval
        start = req.start
        end = req.end

        udata_symbol = convert_symbol(symbol, exchange)
        adjustment = timedelta(minutes=1)

        df: DataFrame = fut_quote_minute(
            en_prod_code=udata_symbol,
            begin_date=start.strftime("%Y-%m-%d"),
            end_date=end.strftime("%Y-%m-%d")
        )

        data: List[BarData] = []

        if len(df):
            last_day = None
            for _, row in df.iterrows():
                timestr = f"{row.date} {str(row.time).rjust(4, '0')}"
                date, time = timestr.split(' ')
                if time >= '0901' and time < '2100':
                    last_day = row.date

                if time >= '2100':
                    # 数据开始的第一天,周一就改周五,其余就改上一天
                    # 如果不是数据第一天,就把它改为last_day,这样可以避免小长假相隔时间不确定的问题
                    if last_day == None:
                        week = datetime.strptime(date, "%Y-%m-%d").weekday() + 1
                        if week == 1:
                            offset = timedelta(days=-3)
                        else:
                            offset = timedelta(days=-1)
                    else:
                        offset = timedelta(
                            days=(datetime.strptime(last_day, "%Y-%m-%d") - datetime.strptime(date, "%Y-%m-%d")).days)

                    timestr = (datetime.strptime(timestr, "%Y-%m-%d %H%M") + offset).strftime("%Y-%m-%d %H%M")

                dt = datetime.strptime(timestr, "%Y-%m-%d %H%M") - adjustment
                dt = CHINA_TZ.localize(dt)

                bar = BarData(
                    symbol=symbol,
                    exchange=exchange,
                    interval=interval,
                    datetime=dt,
                    open_price=row.open,
                    high_price=row.high,
                    low_price=row.low,
                    close_price=row.close,
                    volume=row.turnover_volume,
                    turnover=row.turnover_value,
                    open_interest=row.amount,
                    gateway_name="UDATA"
                )

                data.append(bar)

        data.sort(key=lambda d: d.datetime)
        return data

吐槽:
udata这个数据源是真的烂,接口不稳定,晚上经常调不通;数据莫名其妙缺失,比如螺纹钢2205 2022-1-18和2022-1-19的分钟数据没有了;返回的数据也不太准,我特意用udata返回的分钟数据与赢顺和同花顺软件上分钟数据对比,发现价格经常有出入。udata唯一的优势也就是价格便宜了吧。

Member
avatar
加入于:
帖子: 1471
声望: 105

感谢分享,看图片的意思是UData的日期字段,使用的不是实际日期而是CTP接口里的TradingDay嘛?

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

MTF wrote:

感谢分享,看图片的意思是UData的日期字段,使用的不是实际日期而是CTP接口里的TradingDay嘛?
是的,vnpy在这里没做处理

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

谢谢大佬,这样处理后就相当于把夜盘数据往前一天移了一天是吧?

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

听说是刚上线不久,还在公测阶段,但UDATA他们售后服务蛮到位的,你可以去他们官网看下帮助文档 https://udata.hs.net/help/299

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

沪公网安备 31011502017034号

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