基于miniqmt的本地小市值股票筛选与交易系统开发实践

张开发
2026/4/8 3:22:06 15 分钟阅读

分享文章

基于miniqmt的本地小市值股票筛选与交易系统开发实践
1. 为什么选择miniqmt开发小市值股票交易系统我第一次接触miniqmt是在两年前的一个量化交易项目里。当时团队需要快速搭建一个能够实时处理财务数据的本地交易系统经过多轮技术选型最终选择了miniqmt作为基础框架。这个决定现在看来非常明智特别是对于小市值股票交易这种需要高频数据处理和快速决策的场景。miniqmt最大的优势在于它提供了完整的财务数据接口和交易执行功能。相比其他量化平台它的本地化部署特性让数据隐私和系统响应速度都有了质的提升。我记得刚开始使用时最让我惊喜的是它能够直接获取到交易所的原始财务数据包括很多第三方平台不提供的细分字段。这对于小市值股票筛选尤为重要——因为这些股票往往信息不对称程度高需要更细致的数据支持决策。说到小市值股票它们在A股市场一直是个特殊的存在。这类股票通常流通市值在50亿以下由于机构关注度低、流动性相对不足经常会出现定价偏差。但正是这种市场盲区给量化交易带来了超额收益的机会。不过要抓住这些机会传统的人工盯盘方式显然不够必须依靠自动化系统来实现快速发现和精准交易。2. 搭建开发环境与数据获取2.1 配置miniqmt开发环境在开始之前我们需要准备好开发环境。miniqmt支持Python 3.7及以上版本我个人推荐使用Anaconda来管理环境conda create -n miniqmt python3.8 conda activate miniqmt pip install miniqmt pandas numpy安装完成后需要进行API授权配置。miniqmt的配置文件通常位于~/.miniqmt/config.ini需要填入券商提供的账号信息。这里有个小技巧建议同时配置模拟交易账户和实盘账户开发阶段使用模拟账户可以避免不必要的损失。2.2 获取财务数据获取数据是系统开发的第一步。miniqmt提供了非常便捷的财务数据接口我们可以这样获取沪深A股全量数据import miniqmt as mq import pandas as pd # 设置显示选项 pd.set_option(display.max_rows, None) pd.set_option(display.max_columns, None) # 获取沪深A股股票列表 sector_stocks mq.get_stock_list_in_sector(沪深A股) print(f获取板块合约: {sector_stocks[:5]}...总个数为{len(sector_stocks)})这里有个需要注意的地方不同券商的miniqmt接口可能返回的字段略有差异。我在实际开发中就遇到过某券商不返回FloatVolume字段的情况所以最好先打印查看完整的数据结构。3. 市值计算与筛选逻辑实现3.1 准确计算流通市值计算市值看似简单但实际操作中有不少坑。首先是流通股本的处理有些股票的限售股比例很高如果直接用总股本计算会导致市值虚高。miniqmt提供了FloatVolume字段表示真正可流通的股本数量。def calculate_market_values(stock_list): market_values [] for stock_code in stock_list: detail mq.get_instrument_detail(stock_code) # 确保关键字段存在 if not all(k in detail for k in [FloatVolume, SettlementPrice]): continue float_volume detail[FloatVolume] # 流通股本(股) price detail[SettlementPrice] # 最新价 # 转换为亿为单位保留2位小数 market_value round((float_volume * price) / 1e8, 2) market_values.append({ code: stock_code, name: detail.get(InstrumentName, N/A), float_volume: int(float_volume / 1e4), # 转换为万股 price: price, market_value: market_value }) return pd.DataFrame(market_values)这个函数有几个关键点对字段存在性进行检查避免程序崩溃统一单位处理市值用亿元股本用万股保留原始代码和名称方便后续核对3.2 小市值股票筛选策略有了市值数据后我们需要制定筛选规则。小市值的定义可以很灵活我通常采用以下策略def filter_small_cap(df, top_n50, max_cap30): 筛选小市值股票 :param df: 包含市值数据的DataFrame :param top_n: 保留排名前N的股票 :param max_cap: 最大市值限制(亿元) :return: 筛选后的DataFrame # 剔除ST股票和科创板(根据风险偏好调整) filtered df[~df[name].str.contains(ST)] filtered filtered[~df[code].str.startswith(688)] # 按市值升序排序 filtered filtered.sort_values(market_value) # 应用市值限制 filtered filtered[filtered[market_value] max_cap] return filtered.head(top_n)实际应用中这个策略还可以进一步优化加入流动性筛选如日均成交额1000万排除近期有重大事项的股票结合财务指标如PE、PB进行二次过滤4. 交易系统实现与优化4.1 基础交易框架搭建有了股票池后我们需要实现交易逻辑。miniqmt的交易接口非常简洁class SmallCapTrader: def __init__(self, account_id): self.account mq.get_account(account_id) self.positions self.account.get_positions() def execute_trades(self, target_stocks): current_holdings {p[code]: p for p in self.positions} for stock in target_stocks: code stock[code] # 计算目标仓位(这里使用等权重配置) target_value self.account.total_assets / len(target_stocks) if code in current_holdings: # 已有持仓计算需要调整的量 holding current_holdings[code] delta target_value - holding[market_value] if abs(delta) 10000: # 调整阈值 self._adjust_position(code, delta) else: # 新建仓位 self._create_position(code, target_value) def _adjust_position(self, code, delta): if delta 0: self.account.buy(code, amountdelta) else: self.account.sell(code, amountabs(delta)) def _create_position(self, code, amount): self.account.buy(code, amountamount)这个基础框架实现了等权重配置策略。在实际项目中我通常会加入更多风控逻辑比如单只股票最大仓位限制日内最大回撤止损交易频率控制4.2 性能优化技巧小市值股票交易对系统性能要求较高特别是在开盘集合竞价阶段。经过多次优化我总结出几个有效的方法数据预加载在交易日早上8:30前加载所有需要的财务数据避免交易时段IO阻塞def preload_data(): # 提前加载所有股票的基本信息 all_stocks mq.get_stock_list_in_sector(沪深A股) mq.preload_instrument_details(all_stocks) # 加载财务数据 mq.preload_financial_data(all_stocks, fields[PE, PB, ROE])使用缓存对不变的基础数据使用内存缓存from functools import lru_cache lru_cache(maxsize1024) def get_cached_detail(stock_code): return mq.get_instrument_detail(stock_code)批量操作miniqmt支持批量查询可以大幅减少网络请求# 批量获取多只股票的最新价 batch_quotes mq.get_batch_quotes([600000, 000001, 300001])5. 风险管理与实盘注意事项小市值股票虽然机会多但风险也大。在实盘运行前有几个关键点需要注意首先是流动性风险。很多小市值股票成交量小大额订单可能导致价格大幅波动。我的经验是单笔订单不超过该股票日均成交量的5%使用TWAP算法拆单交易设置价格笼子避免异常价格成交其次是财务数据质量。小市值公司有时会存在财务瑕疵建议排除审计意见非标准的公司排除商誉占比过高的公司关注应收账款异常增长的情况最后是系统监控。我们需要建立完善的监控体系实时监控策略偏离度设置单日最大亏损阈值保留完整的交易日志用于复盘def risk_control(trader): # 实时计算组合风险指标 portfolio_risk calculate_portfolio_risk(trader.positions) if portfolio_risk[var] trader.max_risk: # 触发风控平仓止损 trader.liquidate_positions() # 监控单只股票风险 for pos in trader.positions: if pos[drawdown] 0.1: # 单只股票回撤超过10% trader.close_position(pos[code])这套系统从开发到实盘我前后调整了三个月时间。最大的体会是小市值策略想要稳定盈利70%靠风险控制20%靠交易执行只有10%才是选股逻辑。这也是为什么我在系统开发中花了大量精力在风控模块上。

更多文章