一、实现思路
QMT 没有内置 “一键获取市场排名” 的独立接口,成交量榜单需要三步走:
定义目标股票池(沪深 A 股、自选股、指数成分股);
通过get_market_data_ex批量获取当日volume(成交量)、amount(成交额)、最新价、涨跌幅;
提取最新一日数据,使用 Pandas 降序排序,输出成交量 TOP 榜单。
区分两个概念:
volume:成交量(手);amount:成交额(元)
日常热度榜单大多使用成交额排序,脚本内可自由切换。
二、运行前置条件
成功登录 QMT 客户端 /;
Python 环境已导入xtquant;
盘前建议执行行情数据下载,避免缺数;盘中可开启实时订阅。
三、完整代码
# -*- coding:utf-8 -*-
from xtquant import xtdata
import pandas as pd
def get_volume_rank(stock_list, top_n=30):
"""
QMT 获取成交量排名
:param stock_list: 股票代码列表 ['600000.SH','000001.SZ']
:param top_n: 返回榜单数量
:return: 排序后的DataFrame榜单
"""
# 批量读取日线行情,取最新1根K线(当日数据)
data = xtdata.get_market_data_ex(
field_list=["close", "volume", "amount"],
stock_list=stock_list,
period="1d",
count=1,
fill_data=False
)
res = []
for code in stock_list:
df = data.get(code, None)
if df is None or len(df) == 0:
continue
row = df.iloc[-1]
res.append({
"code": code,
"close": row["close"],
"volume": row["volume"], # 成交量(手)
"amount": round(row["amount"]/1e8,2) # 成交额,单位:亿元
})
df_rank = pd.DataFrame(res)
# 按成交量降序;如需成交额排序改为 ascending=False
df_rank = df_rank.sort_values("volume", ascending=False).head(top_n)
df_rank.reset_index(drop=True, inplace=True)
df_rank["排名"] = df_rank.index + 1
cols = ["排名","code","close","volume","amount"]
return df_rank[cols]
if __name__ == "__main__":
# 示例:自定义股票池;可替换为全市场A股、自选股列表
stock_pool = [
"600000.SH","601318.SH","000001.SZ",
"300750.SZ","600519.SH","002594.SZ"
]
rank_result = get_volume_rank(stock_pool, top_n=20)
print("=======成交量排名榜单=======")
print(rank_result)
四、策略模型内调用版本(QMT 策略编辑器 Python 模型)
如果你要写在init/handlebar策略中使用,适配 Context 环境:
# -*- coding:gbk -*-
import pandas as pd
def init(ContextInfo):
stock_list = ["600000.SH","000001.SZ"]
df = get_volume_rank_strategy(ContextInfo, stock_list, 10)
print(df)
def get_volume_rank_strategy(ContextInfo, stock_list, top_n):
res = []
for code in stock_list:
bar = ContextInfo.get_market_data(
stock_code=code, period="1d", count=1,
fields=["close","volume","amount"]
)
if len(bar) == 0:
continue
res.append({
"code":code,
"close":bar["close"][-1],
"volume":bar["volume"][-1],
"amount":bar["amount"][-1]/1e8
})
df = pd.DataFrame(res).sort_values("volume",ascending=False).head(top_n)
return df
五、常见优化拓展方向
切换成交额榜单
排序字段由volume改为amount,市场活跃度参考价值更高;
盘中动态刷新榜单
添加xtdata.subscribe_quote()订阅行情,定时循环重新执行排序,实现实时榜单;
增加量比、换手率过滤
搭配get_instrument_detail或实时行情接口,剔除长期低迷个股;
导出榜单至 Excel
df_rank.to_excel("成交量排名.xlsx",index=False)自动保存文件;
行业分组排行
先对股票按行业分类,再分组计算成交量排名,寻找板块轮动机会。
六、高频踩坑提醒
全市场一次性传入几千只股票会超时
建议分批次循环获取标的数据,不要一次性传入 4000 + 个股;
非交易时间无当日 volume 数据
收盘前、盘中运行脚本效果最佳;盘前只能读取前一交易日成交量;
退市、停牌标的 volume 为 0,脚本已做简单过滤,可继续加强剔除逻辑;
七、量化应用场景
盘中自动扫描每日成交量 TOP 标的,监控放量突破机会;
构建放量选股因子,用于回测多因子策略;
联动自动预警,当个股成交量进入榜单前 50 推送提醒;
批量导出每日榜单,长期统计历史高活跃股票清单。