期货多品种轮动标的池:天勤 query_quotes 筛品种写法

前言

国内期货多品种轮动策略,逻辑是每周或每月从几十个商品里挑「当前活跃」的品种做趋势:天勤程序给每个入选品种订 5 分钟 K 线,算动量或均线信号,再对各品种的 TargetPosTask 调仓。标的池若靠手工维护 symbols.txt,很快过期------新合约上市、旧合约下市、主力从 m2509 换到 m2511,都要人工改文件。春节后忘了换豆粕主力、程序还在远月挂单一周几乎不成交,是实盘里真实发生过的低级事故。

天勤 api.query_quotes 可向合约服务按 ins_class(期货/主连等)、exchange_id、product_id、expired、has_night 等条件批量查询,返回当前可交易的 symbol 列表,适合作为盘前自动刷池的第一道筛子,再叠加 quote.open_interest、volume 二次过滤。下面说明参数用法和与主循环的衔接。

一、query_quotes 参数摘要

见 api.py:

参数 示例 作用
ins_class "FUTURE" 只要期货
exchange_id "SHFE" 或列表 交易所
product_id "rb" 品种代码
expired False 排除已下市
has_night True 只要含夜盘品种

返回 SymbolList,可迭代合约代码字符串,如 SHFE.rb2510。

二、构建标的池示例

python 复制代码
from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("账户", "密码"))
api.wait_update()

# 上期所、大商所、郑商所未下市期货
pool = api.query_quotes(
    ins_class="FUTURE",
    exchange_id=["SHFE", "DCE", "CZCE"],
    expired=False,
)

注意:query_quotes 返回的是合约级代码,不是主连。轮动若跟主力,还需按持仓量或成交量选具体月份,或订阅 KQ.m@ 做信号、映射到主力月份下单。

三、二次过滤:成交量与持仓

对池内每个 symbol 订 quote(注意订阅数量),在 wait_update 后读:

  • quote.volume 当日成交量
  • quote.open_interest 持仓量
  • quote.expire_rest_days 排除临期
python 复制代码
def rank_by_oi(api, symbols, top_n=10):
    rows = []
    for s in symbols:
        q = api.get_quote(s)
    api.wait_update()
    for s in symbols:
        q = api.get_quote(s)
        if q.open_interest == q.open_interest:
            rows.append((s, q.open_interest))
    rows.sort(key=lambda x: -x[1])
    return [s for s, _ in rows[:top_n]]

全市场扫一遍成本高,可先按 product_id 选品种再取各品种主力合约。

四、与策略主循环集成

  • 标的池刷新频率:日频或周频即可,放在开盘前任务,不要每分钟 query_quotes。
  • 刷新后重建 TargetPosTask 需停机发版规则:换月窗口集中切换。
  • 池外品种必须 cancel 订阅,降低 CPU。

五、和 DataDownloader 分工

历史研究用 DataDownloader 或 get_kline_data_series 拉长期数据;query_quotes 管「当前有哪些合约可交易」。两者结合:quotes 出池,downloader 出回测样本。

六、按 product_id 聚类再选主力

全市场 query_quotes 可能返回数百合约。先按 product_id 分组,每组只保留持仓量最大的一两个月份进池,能把订阅数从几百降到几十。

七、池刷新与 task 重建

池变化意味着 trade_symbol 变化,须走停机发版:平旧月、建新 TargetPosTask、更新配置 VERSION。不要在持仓中在线改 symbol。

八、has_night 筛选

只做夜盘策略时用 has_night=True,避免把无夜盘品种放进池浪费 CPU。日盘策略可设 False 或 None。

九、盘前检查清单

  • 运行 query_quotes,确认无已下市合约混入
  • 各品种主力 open_interest 排名前二是否变化
  • expire_rest_days 小于阈值的合约已剔除
  • 池内合约数与 CPU 占用可接受
  • 配置文件 pool_version 递增并提交
  • 旧月 TargetPosTask 已平、新月 task 已建
  • 日志记录今日池与昨日 diff

总结

多品种轮动离不开可维护的标的池。天勤 query_quotes 按交易所、品种、是否下市、是否有夜盘等条件批量拉合约列表,再叠加 quote.open_interest、volume、expire_rest_days 做主力与流动性筛选,比手写月份表更抗换月。控制刷新频率与订阅数量,把池更新放在盘前任务里,轮动策略才能长期跑而不被合约生命周期拖垮。标的池不是越全越好,能成交、能解释、能换月,三张表缺一不可。

FAQ

1)query_quotes 要 wait_update 吗?

调用后建议 wait_update 再读结果,确保列表到齐。

2)能筛股指国债吗?

exchange_id="CFFEX",product_id 如 IF。

3)返回含期权吗?

ins_class="OPTION" 单独查,别与期货混池。

4)主连 CONT 怎么查?

ins_class="CONT",下单仍用具体月份。


本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。

相关推荐
VidDown2 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
ZDGJ60994 小时前
国际期货交易时段流动性影响因素
区块链
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook6 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺7 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川7 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦8 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python
小羊没烦恼!8 小时前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net