ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Qbot 小市值选股策略如何配置月度调仓、股票池筛选与回测参数?

2026/9/14 16:16:26 拓冰建站 浏览量
Qbot 小市值选股策略如何配置月度调仓、股票池筛选与回测参数? Qbot 小市值选股策略如何配置月度调仓、股票池筛选与回测参数【免费下载链接】Qbot[updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/QbotQbot 的经典策略文档 小市值.md 提供了一份可直接运行的股票小市值策略每个月触发一次计算当前沪深市场上市值最小的前 30 只股票以等权方式买入不在前 30 的持仓直接平仓。本文围绕这份策略源码说明三处关键配置——月度调仓频率、股票池筛选条件、回测参数——分别在哪里改、如何判断配置生效以及文档给出的回测结果长什么样。策略逻辑本身只有四步文档原文确定调仓频率以每月第一天调仓为例确定股票池股票数量这里假设有 30 支调仓日当天获取前一个月的历史数据并按照市值由小到大排序买入前 30 支股票。策略代码中三处配置的位置策略完整源码见 小市值.md基于 gm.api 编写。所有可调配置集中在两个地方init(context)函数里定义调仓计划与股票池参数文件底部的run(...)里定义回测环境参数。月度调仓schedule 频率与触发时间def init(context): # 每月第一个交易日的09:40 定时执行algo任务仿真和实盘时不支持该频率 schedule(schedule_funcalgo, date_rule1m, time_rule09:40:00)date_rule1m表示按月触发文档说明实际触发时间是每月第一个交易日的 09:40即每月第一天调仓在交易日历上的落地方式time_rule09:40:00指定当天执行时刻源码注释明确1m这个频率在仿真和实盘时不支持因此该策略按文档写法只用于回测。init里还有两个与调仓直接相关的参数# 使用多少的资金来进行开仓。 context.ratio 0.8 # 定义股票池数量 context.num 30context.num 30就是股票池数量context.ratio 0.8是开仓占用的资金比例它参与后面每只股票的权重计算。股票池筛选条件的配置与解读algo(context)在每次调仓日执行依次完成取股票全集 → 初筛 → 剔除停牌/ST → 按市值排序取前 30。第一步获取沪深所有上市股票context.all_stock get_instruments(exchangesSHSE, SZSE, sec_types[1], skip_suspendedFalse, skip_stFalse, fieldssymbol, listed_date, delisted_date, dfTrue)这一步在init中完成通过get_instruments获取所有上市股票代码exchangesSHSE, SZSE限定沪深两市sec_types[1]限定股票类型skip_suspendedFalse、skip_stFalse表示此时不剔除停牌与 ST 股停牌/ST 的剔除放到调仓日当天做。第二步调仓日初筛——上市时长、退市与 B 股date1 (context.now - timedelta(days100)).strftime(%Y-%m-%d %H:%M:%S) date2 context.now.strftime(%Y-%m-%d %H:%M:%S) # 上市不足100日的新股和退市股和B股 code context.all_stock[(context.all_stock[listed_date] date1) (context.all_stock[delisted_date] date2) (context.all_stock[symbol].str[5] ! 9) (context.all_stock[symbol].str[5] ! 2)]date1是调仓日前 100 天date2是调仓日当天。筛选含义按源码注释剔除上市不足 100 日的新股listed_date date1、已退市或将于调仓日退市的股票delisted_date date2以及代码第 6 位symbol.str[5]为9或2的 B 股。第三步剔除停牌股只保留主板级别证券# 剔除停牌和st股 df_code get_history_instruments(symbolscode[symbol].to_list(), start_datedate2, end_datedate2, dfTrue) df_code df_code[(df_code[is_suspended] 0) (df_code[sec_level] 1)]用get_history_instruments查询初筛结果在调仓日当天的状态保留is_suspended 0未停牌且sec_level 1的股票。第四步按总市值升序取前 30等权买入# 获取所有股票市值 fundamental get_fundamentals_n(trading_derivative_indicator, df_code[symbol].to_list(), context.now, fieldsTOTMKTCAP, order_byTOTMKTCAP, count1, dfTrue) # 对市值进行排序升序并且获取前30个 trade_symbols fundamental.reset_index( dropTrue).loc[:context.num - 1, symbol].to_list() print(本次股票池有股票数目: , len(trade_symbols))get_fundamentals_n从trading_derivative_indicator表取TOTMKTCAP总市值字段按order_byTOTMKTCAP排序后取前context.num只构成调仓日的股票池。随后的调仓动作分两段# 计算每个个股应该在持仓中的权重 percent 1.0 / len(trade_symbols) * context.ratio # 获取当前所有仓位 positions context.account().positions() # 平不在标的池的仓位 for position in positions: symbol position[symbol] if symbol not in trade_symbols: order_target_percent(symbolsymbol, percent0, order_typeOrderType_Market, position_sidePositionSide_Long) print(市价单平不在标的池的, symbol) # 将标的中已有持仓的和还没有持仓的都调整到计算出来的比例。 for symbol in trade_symbols: order_target_percent(symbolsymbol, percentpercent, order_typeOrderType_Market, position_sidePositionSide_Long) print(symbol, 以市价单调整至权重, percent)单只股票目标权重percent 1.0 / len(trade_symbols) * context.ratio即按池内股票数均分再乘以 0.8 的开仓比例不在新股票池里的持仓用市价单平到 0池内股票无论之前有没有持仓统一市价单调整到percent。如果要改变股票池大小只需要改context.num想降低整体仓位敞口则调整context.ratio。回测参数的配置策略底部的run(...)是回测入口源码注释逐项解释了各参数if __name__ __main__: strategy_id策略ID,由系统生成 filename文件名,请与本文件名保持一致 mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST token绑定计算机的ID,可在系统设置-密钥管理中生成 backtest_start_time回测开始时间 backtest_end_time回测结束时间 backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST backtest_initial_cash回测初始资金 backtest_commission_ratio回测佣金比例 backtest_slippage_ratio回测滑点比例 run(strategy_id13a64e72-e900-11eb-b05f-309c2322ba62, filenamemain.py, modeMODE_BACKTEST, token2b62e7651c9897d0cdd4a6cd818a7ba8488af710, backtest_start_time2005-01-01 08:00:00, backtest_end_time2020-10-01 16:00:00, backtest_adjustADJUST_PREV, backtest_initial_cash1000000, backtest_commission_ratio0.0001, backtest_slippage_ratio0.0001)需要读者自行替换的有两处strategy_id由系统生成token是绑定计算机的 ID源码注释说明可在系统设置-密钥管理中生成文档中的这两个值是示例值。filename要求与实际文件命名保持一致示例中为main.py。按文档策略逻辑一节给出的回测设定各参数的取值是参数取值文档说明backtest_start_time/backtest_end_time2005-01-01 08:00:00 ~ 2020-10-01 16:00:00回测期股票池所有 A 股股票即沪深两市经调仓日筛选backtest_initial_cash1000000初始资金 100 万backtest_adjustADJUST_PREV前复权另可选不复权 ADJUST_NONE、后复权 ADJUST_POSTbacktest_commission_ratio0.0001佣金比例 0.01%backtest_slippage_ratio0.0001滑点比例 0.01%modeMODE_BACKTEST回测模式实时模式为 MODE_LIVE运行后如何验证调仓日当天策略会通过print输出三类信息可以据此确认股票池筛选与调仓逻辑按预期执行本次股票池有股票数目: N——池内股票数量按默认配置应为 30市价单平不在标的池的 {symbol}——不在新池中的持仓被平掉{symbol} 以市价单调整至权重 {percent}——池内每只股票被调整到的目标权重。回测完成后的结果以收益曲线和指标呈现。文档给出的回测结果文档示例非每次运行必须一致的固定数值回测期累计收益率 447.16%年化收益率 28.38%沪深 300 指数收益率为 366.77%策略整体跑赢指数。稳健性观察股票池数量与回测区间的影响文档通过改变股票池数量n和回测区间做了一轮稳健性分析文档示例结果n回测期回测期长度年化收益率最大回撤302005.01.01-2020.10.0115年零9个月28.38%59.51%302005.01.01-2015.01.0110年零9个月0.99%0.30%302015.01.01-2020.10.015年零9个月0.85%0.31%202005.01.01-2020.10.0115年零9个月20.19%60.53%102005.01.01-2020.10.0115年零9个月23.43%60.75%文档的结论是长期看小市值策略能带来一定收益但伴随较大回撤短区间内策略收益跑输大盘、收益低回撤小整体效益较差。原理一节还提到2017-2018 年间大市值股票表现明显优于小市值股票规模因子在 A 股的有效性在该时期存疑——配置回测区间做分段验证时可以把这段区间单独拆开对比。限制说明schedule的1m频率不支持仿真和实盘源码注释原文本文配置仅适用于MODE_BACKTEST策略对数据的依赖来自 gm.api 接口get_instruments、get_history_instruments、get_fundamentals_n在本地 Qbot 环境直接运行时这些数据接口的可用性需以实际运行环境为准文档原文明确此策略只用于学习、交流、演示不构成任何投资建议。【免费下载链接】Qbot[updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考