小市值策略:市值排序与空仓月(QMT / PTrade)
小市值是库里副本最多的股票策略之一:全市场(或中证 1000 一类)先过滤,再按市值从小到大取前几只,空仓月整月不碰股票。QMT 常见是果仁转日更版,PTrade 常见是周二周更版。阈值、月份、只数都是示例,不是操作指令。不构成投资建议,不代操盘。
逻辑简述
- 选股。去掉次新、ST、停牌后,按总市值或流通市值升序。QMT 果仁转还会加上市天数、销售净利率、行业只数上限这类过滤。
- 持仓。目标只数很少(常见 5~7 只),等权或按可用资金平分。
- 空仓月。1 月、4 月(有的实现再加 12 月)不持股票。空仓时有的清仓,有的切黄金 / 货币 ETF。
- 卖出。市值排名掉出池子、持有过久、个股止损、涨停破板,各实现略有不同。
- 调仓。先卖后买,中间留几分钟等成交回报。
这和 涨停基因小市值 不是同一套:小市值主排序是市值;涨停基因还要看历史涨停密度。
QMT 版本(果仁转)
账号由策略交易界面注入。逻辑放 handlebar:回测只走 K 线;实盘判断最后一根、是否当天。日更常见 14:30 卖、14:50 买。空仓月示例会切黄金 ETF,后缀必须是 .SH。

客户端回测截图。区间、资金、滑点和成交假设跟你本机不会一样。不是实盘,不能当收益预期,不构成投资建议。
python
#coding:gbk
def init(C):
try:
g.accountid = account
g.acct_type = accountType
except:
g.accountid = ''
g.acct_type = 'STOCK'
g.stock_pool_size = 20
g.buy_stock_num = 5
g.min_market_cap = 10 # 亿元,示例
g.max_market_cap = 100
g.sell_time = (14, 30)
g.buy_time = (14, 50)
g.empty_months = (1, 4, 12)
def handlebar(C):
if not C.is_last_bar():
return
# 空仓月、选股、14:30 卖 / 14:50 买见附件 QMT_小市值策略.txt历史用 get_market_data_ex,不要用 get_full_tick 做回测。passorder 返回不等于成交,用 get_trade_detail_data 对账。
PTrade 版本
initialize 里注册 run_daily,handle_data 可以空着。卖和买拆开两个定时。股票池常用中证 1000 399101.SZ。周更常见周二 10:30 卖、10:35 买;另挂止损和下午破板检查。

客户端回测截图。长区间小市值常被复权、涨停买不进和市值漂移放大,界面上的百分比先当幻觉。不是实盘,不能当收益预期,不构成投资建议。
python
def initialize(context):
set_universe(['399101.SZ'])
g.stock_num = 7
g.pass_april = True
g.empty_month_mode = 'empty' # 或 'bond' 切 511880
run_daily(context, prepare_stock_list, time='9:05')
run_daily(context, weekly_adjustment_sell, time='10:30')
run_daily(context, weekly_adjustment_buy, time='10:35')
run_daily(context, sell_stocks, time='10:00')
def handle_data(context, data):
pass持仓字段是 amount / enable_amount。9:30 前连续竞价未开,快照空不要发。交易里 run_daily + run_interval 合计不要超过 5 个。
两边都容易踩的坑
- 同一天
handlebar可能进多次,用日期戳卡住。 - 从 QMT 拷过来先全局换
.SH→.SS。 - 分钟回测的
time和实盘对不齐,先打日志。 - 附件里的筛选数字只是一份可跑示例,先仿真对账再改。
完整源码见知识星球附件,这里只放逻辑和片段。
完整讨论和附件在 知识星球 Kimi量化研究所。
