🚀 AI 一键生成 qmt 策略代码

QMT 选股实战:如何获取并筛选股票的流通市值?

qmt | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

如何筛选出流通市值小于 50 亿的股票?

解决方案

在 QMT 中筛选流通市值小于 50 亿的股票,最直接且高效的方法是使用 多因子数据接口 (ContextInfo.get_factor_data)

QMT 的因子库中提供了 Valuation_and_Market_Cap.NegMktValue(流通市值)字段。相比于手动获取股本和价格进行计算,直接调用因子数据可以避免处理除权除息和股本变动的复杂性。

实现步骤

  1. 获取股票列表:使用 get_stock_list_in_sector 获取全市场股票(如“沪深A股”)。
  2. 获取当前时间:在 handlebar 中获取当前 K 线的时间,以便在回测中获取历史对应时刻的市值。
  3. 调用因子数据:使用 ContextInfo.get_factor_data 获取 Valuation_and_Market_Cap.NegMktValue 字段。
  4. 筛选数据:利用 Pandas 对数据进行筛选,找出值小于 5,000,000,000(50亿)的股票。

注意事项

  • 数据下载:使用此功能前,请务必在 QMT 客户端界面点击【数据管理】->【补充数据】,勾选【多因子数据】并下载对应时间段的数据,否则获取到的结果可能为空或 NaN。
  • 单位:QMT 因子数据的流通市值单位通常为

策略代码

# -*- coding: gbk -*-
import pandas as pd

def init(ContextInfo):
    # 1. 设置股票池范围,这里选取沪深A股
    # 注意:全市场股票数量较多,获取因子数据可能需要一点时间
    ContextInfo.stock_list = ContextInfo.get_stock_list_in_sector('沪深A股')
    print(f"初始化完成,股票池数量: {len(ContextInfo.stock_list)}")

def handlebar(ContextInfo):
    # 为了演示,我们只在最后一根K线(如果是实时运行)或回测的每一天进行筛选
    # 如果是分钟线回测,建议控制频率,不要每分钟都去拉取因子数据
    
    # 获取当前K线的时间戳并转换为 YYYYMMDD 格式
    timetag = ContextInfo.get_bar_timetag(ContextInfo.barpos)
    current_date = timetag_to_datetime(timetag, '%Y%m%d')
    
    # 2. 定义需要的因子字段:流通市值
    # 字段名:Valuation_and_Market_Cap.NegMktValue
    field_list = ['Valuation_and_Market_Cap.NegMktValue']
    
    # 3. 获取因子数据
    # 参数:字段列表, 股票列表, 开始时间, 结束时间
    # 返回:DataFrame (Index=股票代码, Columns=因子字段)
    factor_data = ContextInfo.get_factor_data(
        field_list, 
        ContextInfo.stock_list, 
        current_date, 
        current_date
    )
    
    # 4. 数据处理与筛选
    if factor_data is not None and not factor_data.empty:
        # 提取流通市值列
        mkt_value_series = factor_data['Valuation_and_Market_Cap.NegMktValue']
        
        # 筛选条件:流通市值 < 50亿 (50 * 10^8)
        # 注意:因子数据中的单位通常是 元
        threshold = 50 * 100000000
        
        # 过滤出符合条件的股票
        # dropna() 用于去除没有数据的股票
        filtered_stocks = mkt_value_series[mkt_value_series < threshold].dropna()
        
        # 获取股票代码列表
        target_list = filtered_stocks.index.tolist()
        
        # 打印结果
        print(f"日期: {current_date}")
        print(f"筛选条件: 流通市值 < 50亿")
        print(f"符合条件的股票数量: {len(target_list)}")
        
        # 打印前10只股票作为示例
        if len(target_list) > 0:
            print("部分股票示例:", target_list[:10])
            
            # 可以在这里将筛选出的股票设置为新的股票池,用于后续交易逻辑
            # ContextInfo.set_universe(target_list)
    else:
        print(f"{current_date} 未获取到因子数据,请检查是否已下载多因子数据。")

常见问题 Q&A

Q: 为什么运行代码后提示“未获取到因子数据”或结果为空?
A: QMT 的多因子数据不是默认包含在安装包里的。你需要手动下载。

  1. 打开 QMT 客户端。
  2. 点击菜单栏的【数据管理】(或界面上的【数据】图标)。
  3. 选择【补充数据】标签页。
  4. 在左侧列表中找到【多因子数据】。
  5. 选择你需要的时间段(例如最近一年),点击下载。下载完成后再运行策略即可。

Q: 除了流通市值,还可以筛选总市值吗?
A: 可以。将代码中的字段名 Valuation_and_Market_Cap.NegMktValue 替换为 Valuation_and_Market_Cap.MktValue 即可获取总市值数据。

Q: 这个筛选是在盘中实时更新的吗?
A: QMT 的多因子数据通常是日频更新的(基于收盘价计算)。如果是盘中实时运行,获取到的通常是上一交易日的静态数据。如果需要盘中实时的流通市值(即:实时价格 * 流通股本),则需要使用 get_market_data_ex 获取最新价,配合 get_financial_data 获取流通股本自行计算。但对于“小于50亿”这种粗略筛选,使用因子数据通常已经足够。