当前位置:首页>python>年化38%!我用Python+xtquant复现了一个高股息小市值轮动策略(附源码)

年化38%!我用Python+xtquant复现了一个高股息小市值轮动策略(附源码)

  • 2026-09-10 03:30:51
年化38%!我用Python+xtquant复现了一个高股息小市值轮动策略(附源码)

一个在聚宽社区被验证过的策略,我把它搬到了Python+xtquant,代码今天开源!

大家好,我是easyquant实战。

眼下正值两会前夕,历史数据显示,两会前后A股市场大多表现积极——上证指数在两会前后20个交易日的平均涨幅分别为2.6%和3.6%。更重要的是,风格上,小盘优于大盘,成长优于价值(数据来源:同花顺,2000年以来统计)。

而今天分享的策略,正是聚焦小市值轮动,叠加高股息保护,或许能在这个小盘成长占优的时间窗口捕捉更多机会。当然,历史规律不等于未来收益,我们仍需敬畏市场,用系统约束人性。


📊 先看历史表现(回测数据,2017年至今)

来源:聚宽社区 wywy1995 回测https://www.joinquant.com/view/community/detail/5bf34a132919716ea77eb2e7daa4ba21

  • 年化收益率:38%

  • 收益归因:25%来自小盘轮动,3%来自涨停操作,10%来自高股息+低杠杆

  • 最大回撤:主要源于小市值风格的系统性风险,但叠加高股息后防守性有所增强

⚠️ 重要提示:回测表现不代表未来收益,小市值策略本身波动巨大(原策略在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客户端界面。但需要满足两个条件:

  • 安装 xtquant 库(迅投MiniQMT的Python接口,可从券商获取或从QMT安装目录复制)

  • 账户已开通 MiniQMT交易权限(部分券商称为“迅投极速交易终端”或“xtquant直连模式”),才能在Python中直接下单。

3️⃣ 资金管理策略默认单笔5万,总资金100万,最多持仓10只,同一行业最多2只。请根据自己的资金量和风险承受能力调整。

4️⃣ 涨停处理细节

  • 用 akshare 获取昨日涨停列表(需联网)

  • 盘中若触及涨停,当天不卖出

  • 昨日涨停股如果今天下午2:55还没封板,强制清仓

5️⃣ 小市值策略的天然风险小市值因子在A股长期有效,但短期回撤可能非常剧烈(例如2017年、2021年、2024年初)。务必做好心理准备,用长期不用的闲钱投资,并严格控制总仓位。


🎁 如何获取完整代码?

代码近500行,包含:

  • 完整配置类(账户、路径、参数)

  • 策略主逻辑(选股、买卖、风控)

  • 交易回调处理

  • 邮件提醒、心跳检测

  • 数据服务模块(可选)

👉 关注本公众号,后台回复“高股息小市值”,直接获取下载链接!

💬 最后说两句

这个策略不是圣杯,但它逻辑清晰、因子有效、代码可跑,非常适合用来学习多因子策略的实盘写法。

当前正值两会窗口期,历史规律显示小盘成长往往占优,而本策略的小市值轮动特性或许正契合这一阶段的市场风格。但请牢记:历史规律不等于未来表现,风险控制永远是第一位。建议先用模拟盘跑一段时间,观察选股和交易是否符合预期,再逐步投入实盘。

量化交易的本质是概率游戏,没有人能预测未来,我们能做的只是用系统约束人性,用风控应对不确定性。

下期预告:

  • 实盘周记:我用这个量化策略跑了一个月,实盘表现如何?

评论区聊聊:你最想优化这个策略的哪部分?或者你在实盘中遇到过什么坑?


关注我,一起探索量化的世界! 🚀

最新文章

随机文章