3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 中筛选流通市值小于 50 亿的股票,最直接且高效的方法是使用 多因子数据接口 (ContextInfo.get_factor_data)。
QMT 的因子库中提供了 Valuation_and_Market_Cap.NegMktValue(流通市值)字段。相比于手动获取股本和价格进行计算,直接调用因子数据可以避免处理除权除息和股本变动的复杂性。
get_stock_list_in_sector 获取全市场股票(如“沪深A股”)。handlebar 中获取当前 K 线的时间,以便在回测中获取历史对应时刻的市值。ContextInfo.get_factor_data 获取 Valuation_and_Market_Cap.NegMktValue 字段。# -*- 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: QMT 的多因子数据不是默认包含在安装包里的。你需要手动下载。
Q: 除了流通市值,还可以筛选总市值吗?
A: 可以。将代码中的字段名 Valuation_and_Market_Cap.NegMktValue 替换为 Valuation_and_Market_Cap.MktValue 即可获取总市值数据。
Q: 这个筛选是在盘中实时更新的吗?
A: QMT 的多因子数据通常是日频更新的(基于收盘价计算)。如果是盘中实时运行,获取到的通常是上一交易日的静态数据。如果需要盘中实时的流通市值(即:实时价格 * 流通股本),则需要使用 get_market_data_ex 获取最新价,配合 get_financial_data 获取流通股本自行计算。但对于“小于50亿”这种粗略筛选,使用因子数据通常已经足够。