一个在聚宽社区被验证过的策略,我把它搬到了Python+xtquant,代码今天开源!
大家好,我是easyquant实战。
眼下正值两会前夕,历史数据显示,两会前后A股市场大多表现积极——上证指数在两会前后20个交易日的平均涨幅分别为2.6%和3.6%。更重要的是,风格上,小盘优于大盘,成长优于价值(数据来源:同花顺,2000年以来统计)。
而今天分享的策略,正是聚焦小市值轮动,叠加高股息保护,或许能在这个小盘成长占优的时间窗口捕捉更多机会。当然,历史规律不等于未来收益,我们仍需敬畏市场,用系统约束人性。
📊 先看历史表现(回测数据,2017年至今)
来源:聚宽社区 wywy1995 回测https://www.joinquant.com/view/community/detail/5bf34a132919716ea77eb2e7daa4ba21
⚠️ 重要提示:回测表现不代表未来收益,小市值策略本身波动巨大(原策略在2024年1月曾大幅回撤),实盘前请务必做好风控准备,用闲置资金、分散投资、严格止损。
🧠 核心选股逻辑(四步筛选)
这个策略的筛选逻辑非常清晰,像漏斗一样层层过滤:
1️⃣ 高股息率全市场选最近一年股息率最高的25%股票。为什么用最近一年?作者回测发现,任何改良(如三年均值、增长)都不如简单用最近一年股息率有效。股息率因子IC长期为正,说明它确实有效。
2️⃣ 剔除不活跃股在股息率池子里,剔除换手率/波动率最低的20%。这些股票交易冷清,买了也难有超额收益。
3️⃣ 低杠杆计算市场杠杆(MLEV)= 非流动负债 /(非流动负债 + 总市值),选最小的50%。低杠杆公司债务压力小,未来更可能维持高分红,逻辑上说得通。
4️⃣ 小市值轮动最后用流通市值排序,选最小的10只,每周调仓。每天监控:昨天涨停的股票,今天如果下午2:55还没封板,就提前卖出,锁定利润。
💻 Python+xtquant 代码实现(核心片段)
代码基于 Python 3.7+ 和 xtquant(迅投MiniQMT的Python接口)。我用 同花顺i问财 实时获取因子数据,用 talib 计算ATR,用 xtquant 下单交易。
🔍 选股模块(_choose_stock)
def _choose_stock(self, tick_data): # 用pywencai从i问财拉取数据 df = pywencai.get( query="沪深A股,非ST,股息率,年换手率,年波动率,非流动负债,总市值,流通市值", loop=True, pro=True, cookie=self.iwencai_cookie, no_detail=True ) # 股息率前25% df = df[df['股息率'] >= df['股息率'].quantile(0.75)] # 换手率/波动率 最大的80%(剔除最小的20%) df = df[df['年换手率']/df['年波动率'] >= (df['年换手率']/df['年波动率']).quantile(0.2)] # 计算杠杆,取最小的50% df['杠杆'] = df['非流动负债']/(df['非流动负债']+df['总市值']) df = df[df['杠杆'] <= 0.5] df = df[df['杠杆'] <= df['杠杆'].quantile(0.5)] # 取流通市值最小的20只,再取前10 df = df.nsmallest(20, '流通市值') final_stocks = df['股票代码'].tolist()[:10] return final_stocks
📈 买卖条件(带ATR风控)
买入 B1(首次建仓)✅ 无持仓✅ 现价不高于昨收×(1+滑点)✅ 站上10日均线✅ 预估全天成交量 > 10日均量(用当前量/时间比例估算)
买入 B2(加仓)✅ 已有部分持仓✅ 盘中跌破止损位后又收回(类似网格加仓)
卖出 S1(部分止盈)✅ 首次仓位还在✅ 最高价触发了“开仓价/昨收 + ATR×倍数”后回落✅ 卖掉一半(50%)
卖出 S2(清仓)✅ 股票不在选股池了✅ 或昨日涨停,今日未封板且临近收盘✅ 或持仓不足100股
📊 ATR指标计算
def _get_stock_atr_value(self, stockcode, period=14): # 获取日线数据 kline_data = xtdata.get_market_data(..., period='1d') # 转成DataFrame close = ... high = ... low = ... atr = talib.ATR(high, low, close, timeperiod=period) return atr.iloc[-1]
止盈位 = max(开仓价, 昨收) + ATR * turnover_multi(默认倍数1.0)
⚠️ 实盘必须注意的5个风险点
1️⃣ i问财cookie会过期代码里用了 pywencai,需要手动登录同花顺后抓取cookie,填入 Config.IWENCAI_COOKIE。(如果想摆脱cookie依赖,可以考虑用QMT本地财务数据替代,代码留了接口,但需要自己适配)
2️⃣ 运行环境要求本策略是纯Python脚本,直接在外部Python环境中运行,不需要打开QMT客户端界面。但需要满足两个条件:
3️⃣ 资金管理策略默认单笔5万,总资金100万,最多持仓10只,同一行业最多2只。请根据自己的资金量和风险承受能力调整。
4️⃣ 涨停处理细节
用 akshare 获取昨日涨停列表(需联网)
盘中若触及涨停,当天不卖出
昨日涨停股如果今天下午2:55还没封板,强制清仓
5️⃣ 小市值策略的天然风险小市值因子在A股长期有效,但短期回撤可能非常剧烈(例如2017年、2021年、2024年初)。务必做好心理准备,用长期不用的闲钱投资,并严格控制总仓位。
🎁 如何获取完整代码?
代码近500行,包含:
完整配置类(账户、路径、参数)
策略主逻辑(选股、买卖、风控)
交易回调处理
邮件提醒、心跳检测
数据服务模块(可选)
👉 关注本公众号,后台回复“高股息小市值”,直接获取下载链接!
💬 最后说两句
这个策略不是圣杯,但它逻辑清晰、因子有效、代码可跑,非常适合用来学习多因子策略的实盘写法。
当前正值两会窗口期,历史规律显示小盘成长往往占优,而本策略的小市值轮动特性或许正契合这一阶段的市场风格。但请牢记:历史规律不等于未来表现,风险控制永远是第一位。建议先用模拟盘跑一段时间,观察选股和交易是否符合预期,再逐步投入实盘。
量化交易的本质是概率游戏,没有人能预测未来,我们能做的只是用系统约束人性,用风控应对不确定性。
下期预告:
评论区聊聊:你最想优化这个策略的哪部分?或者你在实盘中遇到过什么坑?
关注我,一起探索量化的世界! 🚀