🚀 AI 一键生成 joinquant 策略代码

为什么在JoinQuant回测环境中无法通过query获取期货龙虎榜排名信息?

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

query函数在回测环境中为什么无法获得龙虎榜排名信息?

def calculate_sentiment_index(commodity, date):

commodity = commodity
date = date
contract_list = get_future_contracts(commodity, date=date)
dominant_contract = get_dominant_future(commodity, date)

#获取该主力合约在某交易日的成交龙虎榜数据
volume_q = query(finance.FUT_MEMBER_POSITION_RANK.day,
finance.FUT_MEMBER_POSITION_RANK.code,
finance.FUT_MEMBER_POSITION_RANK.rank_type,
finance.FUT_MEMBER_POSITION_RANK.rank,
finance.FUT_MEMBER_POSITION_RANK.member_name,
finance.FUT_MEMBER_POSITION_RANK.indicator,).filter(finance.FUT_MEMBER_POSITION_RANK.code==dominant_contract,\
finance.FUT_MEMBER_POSITION_RANK.rank_type_ID==501001,finance.FUT_MEMBER_POSITION_RANK.day == date,
).order_by(finance.FUT_MEMBER_POSITION_RANK.day.desc()).limit(40)
volume_rank = finance.run_query(volume_q)
log.info(volume_rank)
上面这段代码在研究环境里是可以获取到龙虎榜的排名数据的。但是放在回测环境里,去没有办法获得,是什么原因?

解决方案

出现这个问题的原因通常与数据的更新时间以及回测引擎的防未来函数机制有关。\n\n### 问题原因分析\n在研究环境中,您查询的是历史日期,此时该日期的盘后数据(如龙虎榜排名)已经生成并入库,因此可以正常获取。\n但在回测环境中,如果您传入的 date 是当前交易日(例如 context.current_dt.date()),由于期货龙虎榜(持仓排名)数据是在每日收盘后才会由交易所发布并更新到数据库中,在盘中(如 9:30 或 15:00)是绝对无法获取到当天的龙虎榜数据的。回测引擎为了模拟真实的交易场景并防止引入未来数据,当您查询 day == date 时,自然会返回空结果。\n\n### 解决方法\n在回测中,您只能获取到前一个交易日(或更早)的龙虎榜数据。因此,需要将查询条件中的日期改为前一个交易日,或者直接查询小于当前日期的最新数据。\n\n#### 修改方案:使用前一交易日\n如果您在 handle_data 或定时运行函数中调用此逻辑,请将传入的 date 改为 context.previous_date。\n\npython\ndef calculate_sentiment_index(commodity, current_date, previous_date):\n # 获取前一交易日的主力合约\n dominant_contract = get_dominant_future(commodity, previous_date)\n\n # 获取该主力合约在前一交易日的成交龙虎榜数据\n volume_q = query(\n finance.FUT_MEMBER_POSITION_RANK.day,\n finance.FUT_MEMBER_POSITION_RANK.code,\n finance.FUT_MEMBER_POSITION_RANK.rank_type,\n finance.FUT_MEMBER_POSITION_RANK.rank,\n finance.FUT_MEMBER_POSITION_RANK.member_name,\n finance.FUT_MEMBER_POSITION_RANK.indicator\n ).filter(\n finance.FUT_MEMBER_POSITION_RANK.code == dominant_contract,\n finance.FUT_MEMBER_POSITION_RANK.rank_type_ID == 501001,\n finance.FUT_MEMBER_POSITION_RANK.day == previous_date # 使用前一交易日\n ).order_by(\n finance.FUT_MEMBER_POSITION_RANK.day.desc()\n ).limit(40)\n \n volume_rank = finance.run_query(volume_q)\n log.info(volume_rank)\n return volume_rank\n\n\n### 总结\n1. 研究环境:可以获取任意历史日期的盘后数据。\n2. 回测/模拟环境:盘中只能获取到昨天的盘后数据。请务必使用 context.previous_date 作为查询条件,避免触发未来数据限制或查出空表。