问题描述
解决方案
在 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字段。 - 筛选数据:利用 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 的多因子数据不是默认包含在安装包里的。你需要手动下载。
- 打开 QMT 客户端。
- 点击菜单栏的【数据管理】(或界面上的【数据】图标)。
- 选择【补充数据】标签页。
- 在左侧列表中找到【多因子数据】。
- 选择你需要的时间段(例如最近一年),点击下载。下载完成后再运行策略即可。
Q: 除了流通市值,还可以筛选总市值吗?
A: 可以。将代码中的字段名 Valuation_and_Market_Cap.NegMktValue 替换为 Valuation_and_Market_Cap.MktValue 即可获取总市值数据。
Q: 这个筛选是在盘中实时更新的吗?
A: QMT 的多因子数据通常是日频更新的(基于收盘价计算)。如果是盘中实时运行,获取到的通常是上一交易日的静态数据。如果需要盘中实时的流通市值(即:实时价格 * 流通股本),则需要使用 get_market_data_ex 获取最新价,配合 get_financial_data 获取流通股本自行计算。但对于“小于50亿”这种粗略筛选,使用因子数据通常已经足够。