udata返回的期货夜盘分钟数据格式是:
但是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唯一的优势也就是价格便宜了吧。