十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于QMT的Python量化策略系统:从回测到实盘的完整架构与避坑指南

基于QMT的Python量化策略系统:从回测到实盘的完整架构与避坑指南 简介本资源是一套基于QMTQuantitative Multi-Threaded平台的量化交易策略系统实战代码与配套文档面向具备Python基础的量化初学者及中级开发者解决策略开发、本地回测、实盘对接与风控模块搭建等核心问题。压缩包共21个文件含12个Python策略与工具脚本如趋势跟踪、低吸交易、高频信号生成等、2个JSON股票池与参数配置文件、2个Markdown/Word技术文档含‘天玑300智能低吸系统’完整设计说明、2个文本类依赖与说明文件以及CSV股票列表、log运行日志等整体仅967KB轻量易部署。已有187人学习下载资源结构清晰覆盖从数据接入a_stock_list.csv、策略定义strategy1.py、bulin_calculate.py、交易执行Trader.py、Trader2.py到实时监控real_time.log的全链路环节并附带requirements.txt与README.md便于快速复现与二次开发。 你有没有经历过这种尴尬策略在别的框架里回测出来的收益曲线非常漂亮一到模拟盘就各种幺蛾子——数据延迟、成交价格对不上、下单模块还得自己造轮子最后折腾一个月还没跑起来。我当初刚接触量化时也是这个状态后来转到QMT上面才算把整套流程顺下来。这个“基于QMT量化交易策略系统.zip”就是我把自己在用的策略工程打包后留档的项目包含了行情接入、信号计算、交易执行、风控熔断、回测和日志等一整套流程适合那些已经熟悉Python、但还没完整跑通过QMT实盘链路的人。这篇文章我会把系统设计思路、核心代码实现、部署踩坑和常见问题一次性讲清楚照着做你也能搭出一套能用的量化策略系统。1. 这套策略系统到底解决了什么问题1.1 从“手动盯盘”到“自动执行”很多散户做量化都是从“写个脚本拉数据”开始的。数据能拿到、指标能算出来但真正到下单环节就卡住了券商普通客户端不支持程序化交易第三方库对接交易接口又存在合规问题手动下单则完全谈不上“策略执行”。QMT解决的核心痛点就是让个人投资者也能用正规通道跑程序化交易。它是迅投出品的极速策略交易系统很多券商做了定制版比如国金等你开通权限后在官网或个人中心就能找到下载入口。我这个zip里的系统默认就是跑在QMT提供的Python环境里通过官方接口拿行情、发委托不需要自己去碰那些灰色API。刚开始用QMT的人容易走入一个误区觉得把策略代码塞进客户端就行了。实际上QMT同时支持“单机策略”和“独立Python环境”两种玩法前者在客户端内置编辑器里写好处是上手快缺点是不方便做工程化后者则是启动你自己的Python进程通过QMT提供的Python库去连接行情和交易服务。我打包的这套系统采用的是后者因为这样能复用常见的第三方库策略逻辑的维护也舒服得多。1.2 系统目录结构说明解压这个zip之后你会看到这样的目录结构qmt_strategy_system/ ├── config/ │ ├── symbol_list.json # 交易标的配置 │ ├── strategy_params.json # 策略参数 │ └── risk_limit.json # 风控阈值 ├── core/ │ ├── data_feed.py # 行情接收与K线合成 │ ├── signal_engine.py # 策略信号计算 │ ├── executor.py # 订单执行与状态管理 │ └── risk_manager.py # 风控检查和熔断 ├── strategies/ │ └── dual_ma.py # 示例策略双均线 ├── backtest/ │ ├── run_backtest.py # 回测入口 │ └── metrics.py # 指标计算 ├── run_live.py # 实盘运行入口 ├── run_sim.py # 模拟盘运行入口 └── logs/ # 运行日志这套结构是我经过几次重构后定下来的。核心思路是“策略与基础设施分离”需要经常调整的指标参数、股票名单放在config里与QMT耦合紧密的行情、交易代码放在core里策略本身继承同一个基类只需要实现“接收K线数据 - 返回目标持仓”这样的简单接口。这样即便你把双均线策略换成别的动量策略也不需要改动行情或者下单模块。1.3 一个策略从开发到上线的完整链路我建议任何想用这套系统的人都先理解一下完整链路。简单说就是四步第一步QMT客户端负责登录行情和交易通道第二步run_live.py启动你的策略进程通过QMT的Python库订阅行情第三步行情进入data_feed之后经过合成K线、更新信号、生成目标仓位再由executor拆分成具体委托第四步委托回报和成交回报写回日志同时risk_manager全程盯着账户和持仓状态一旦触发阈值就停止新开仓或直接平仓。这套链路最大的价值在于把“信号到交易”的时延降得非常低。以前手动操作从看到信号到点下买入少说几十秒多则几分钟现在信号出来到委托送进交易所路径上只有代码执行和网络传输。但低时延也意味着代码错误会被快速放大所以系统里的日志和风控设计非常关键。我把每个环节的关键变量都记录到了logs目录下排查问题时能直接还原当时的持仓、委托和行情快照。2. QMT策略系统的核心架构拆解2.1 行情模块从Tick到Bar的预处理行情是整个策略系统的燃料这块如果处理不好后面的信号引擎再厉害也没用。QMT的Python接口提供了订阅tick和K线数据的能力但有个现实问题如果你同时订阅几百只股票行情回调频率极高直接在回调里做策略判断会让系统很容易阻塞。我的做法是在data_feed.py里做一个“行情缓冲层”接口回调只负责把最新tick塞进队列真正的K线合成和信号计算由独立线程按固定节拍处理。K线合成这块需要特别小心。QMT自带的K线接口能直接拉到分钟级数据但tick合成分钟线更灵活尤其在回测时能让成交结果更接近真实盘。我项目里实现了一个简单的K线合成功根据tick的成交价和成交量按时间切分并累计出open、high、low、close、volume。这里有个细节分钟K线的“开盘价”应该用这一分钟的第一笔成交价而不是上一分钟的收盘价很多新手在这里会算错导致指标产生偏移。处理完的K线会被保存到一个滚动缓存里每个标的最多保留最近500根方便策略计算均线、MACD这类需要历史窗口的指标。这个设计能有效控制内存占用。之前我用过一个粗暴方案每日收盘后把所有分钟线全量保存到DataFrame结果策略跑了两天内存就飙到2GB以上后来改成滚动缓存1500个标的也没压力。2.2 信号模块策略逻辑与参数配置解耦信号模块看起来不复杂但你把它做成“优雅”的却不简单。最差的做法是把策略所有逻辑都写在喂数据的主循环里今天要改一个参数就得改代码运维时容易把生产环境搞坏。所以我在core/signal_engine.py里定义了一个策略基类核心方法就两个on_bar(bar) 更新内部状态get_target_position(symbol) 返回当前期望的仓位比例。示例策略strategies/dual_ma.py就是在这个基类上实现的。它的逻辑很简单计算最近N1日和N2日的均线当短均线上穿长均线时买入下穿时卖出。参数N1、N2从config/strategy_params.json读取进程启动时加载一次盘中修改参数文件不会立即生效但会在下一次重启时启用。这样做的好处很明显你完全不用修改策略代码就能快速试验不同参数组合。这里我补充一个非常容易被忽略的经验信号模块里不要直接操作下单接口。信号引擎只负责回答“我现在的目标仓位是什么”至于怎么买、用多少价格、分几次买那是交易模块的事。两者一旦耦合后面做回测和实盘一致性会非常痛苦。回测时你可以把目标仓位直接映射到成交价而实盘时还得考虑盘口深度和冲击成本这种差异天然需要解耦。2.3 交易模块下单、撤单与重试机制交易模块是QMT策略系统里最容易踩坑的部分因为实盘交易是“非原子”的你提交了一笔委托不代表它马上成交可能部分成交可能等待中也可能被拒单。我的executor.py维护了一个订单状态表每笔委托都有一个从“PENDING_SUBMIT”到“SUBMITTED”再到“PARTIAL_FILLED”或“FILLED”的状态流转。QMT的Python接口下单是异步的也就是说调用下单函数后你只能拿到一个委托编号真正的成交回报会通过回调或者主动查询拿到。我推荐的做法是主策略循环生成目标仓位后executor对比当前实际持仓和目标持仓差异部分才生成委托生成委托后每隔几秒主动查询一次委托状态发现长时间未成交并且价格偏离较远时就撤单重发。重试机制一定要有上限我一般设置重试两次超过就记录并告警避免在极端行情里反复追单造成失控。这个模块的真实难度不在于“下单接口怎么调”而在于“状态同步”。因为你可能同时在多个标的有委托还得处理“今天涨停买不进”“停牌无法交易”“持仓被冻结”等异常这些都要通过账户查询接口拿到准确持仓和可用资金后再决定下一步动作。我见过有人直接把账户持仓存在本地变量然后根据本地变量判断跑一个上午就和实际持仓对不上了。正确的做法始终以QMT查询到的真实持仓为准本地变量只做缓存加速。2.4 风控模块硬止损与软限制做量化的人最开始都把精力放在策略因子上觉得只要胜率高了就能赚钱但实盘时间长了你会发现风控才是决定账户能不能活下去的关键。我的risk_manager.py里有两层风控逻辑硬止损和软限制。硬止损比较简单比如单只股票亏损达到5%系统直接以市价单强制卖出账户总回撤超过15%系统停止所有新开仓信号只允许平仓。这些阈值在risk_limit.json里配置。软限制则更像一种约束比如单只股票最大仓位不超过总资金的20%。为什么这么设计因为QMT本身有一些基础风控但那只是券商层面的未必符合你的策略逻辑比如你可能只想在特定时间窗口内开仓或者需要限制连续亏损后的下单频率这些都得在策略层自己实现。风控模块还需要处理“信号与执行之间的时延”。假设信号引擎在盘中某根K线上判断需要止损但此时QMT行情推送有轻微延迟直接下单的成交价可能已经比触发价差了很多。对于这种情况我会在风控日志里记录一个“触发价格”和“实际成交价格”的差值后续复盘时能看出是滑点问题还是行情延迟问题而不是模糊地归因于“策略失败”。3. 关键代码逻辑与实现细节3.1 连接QMT接口的初始化流程很多刚接触QMT的人卡在第一关怎么连上客户端。实际上QMT的方案是你需要先在电脑上启动官方客户端并登录成功然后你的Python脚本才能通过本地服务接口连接它。我贴一下初始化流程的核心代码片段from xtquant.xttrader import XtQuantTrader from xtquant.xtdata import XtData session_id 123456 path rd:\\qmt\\userdata_mini trader XtQuantTrader(path, session_id) trader.start() connect_result trader.connect() if connect_result ! 0: raise RuntimeError(f连接交易服务失败错误码{connect_result}) data XtData() # 订阅行情需要传入客户端安装路径和账号信息这段代码最需要注意的是path参数它是你本地QMT运行数据目录不同券商版本路径可能不一样。连接成功并不代表账户登录成功还需要通过trader.query_stock_asset()去查询账户信息能查到才说明整个通道已经打通。我建议在初始化完成后立刻打印一段“账户可用资金”和“持仓数量”作为自检日志这样后面运行出现异常时你至少能判断连接是正常的。初始化时我还习惯做一个“时间校准”从QMT拉一下服务器时间然后和本地时间对比差值过大就告警。因为策略信号如果依赖最后一根K线的收盘时间本地时钟偏快或偏慢都会导致开平仓时机错位。这个问题在量化运行里很隐蔽但回测时不会出现因为回测数据都带真实时间戳。3.2 策略主循环怎么写才能不卡顿QMT的Python进程虽然没有硬实时要求但如果你在行情回调里做大量计算很容易卡到行情堆积最终导致信号滞后。我的做法是把系统拆成多个线程。首先是主线程负责启动和监控各模块其次是行情线程通过调用XtData的subscribe_quote接口并在回调里只把最新数据放入队列然后是策略线程它每隔固定的节拍比如1分钟或5分钟从队列里取出当前已合成的最新K线执行信号计算最后是交易线程负责处理订单状态和账户回报。这种模式有一个显著的好处即使某个策略计算发生异常也不会阻塞行情接收。不要试图把所有事都塞进一个事件循环里Python的GIL会让你的多线程在CPU密集场景下打折扣但对QMT这种以I/O和轻量计算为主的场景多线程完全够用。如果你未来要管理几百个策略进程可以把这个结构升级成多进程加消息队列不过那就是后话了。主循环里还有一个易遗漏的问题状态持久化。如果盘中因为网络断开导致策略进程重启信号引擎最好能恢复重启前的持仓和均线历史。实现起来不复杂每次计算完信号后把关键状态序列化到本地文件启动时优先加载本地状态再根据最新K线继续计算。没有这一步的话系统重启那一刻你的信号可能失真实盘就会产生错误交易。3.3 参数配置Json和回测结果分析我把参数配置外置到了JSON文件里这样每次调参不用进入代码。一个典型的strategy_params.json长这样{ dual_ma: { n1: 5, n2: 20, signal_bar: 1m, max_pos: 0.2 } }回测脚本run_backtest.py会读取同样一套参数然后用历史数据跑一遍信号生成交易记录并计算收益率、最大回撤、夏普比率等指标。这里你会发现回测和实盘共用一套策略代码是这套系统的关键优势。很多人在Excel或别的框架里做回测到实盘时再用QMT重写一遍逻辑稍有不一致结果就会差很多。回测结果分析模块metrics.py里我最看重三个指标总收益率、最大回撤和成交次数。总收益率决定策略有没有赚头最大回撤决定你能不能拿住成交次数则直接影响手续费和滑点成本。我的回测里会同时输出“毛收益”和“净收益”也就是扣除手续费和滑点之后的收益。不要只看毛收益因为高频或小波动策略很容易被成本吃掉利润。如果净收益和毛收益差距过大我会优先优化交易频率而不是继续改因子。3.4 K线合成与指标计算的坑用tick数据合成K线时有个细节特别容易坑人某些不活跃股票可能在一分钟内没有任何成交此时这一分钟应该没有K线而不是用上一分钟的收盘价复制一根“假K线”。如果硬造一根假K线均线这类依赖连续K线的指标就会产生偏差。我的合成功用里会检查当前分钟是否真的有成交数据没有就跳过。另一个常见问题是复权处理。QMT提供的前复权数据适合回测但实盘时你看到的是原始价格如果两边换算方式不一致策略信号就会差异很大。我通常建议回测时用前复权数据实盘时用实时价格但信号判断逻辑必须基于同一套指标计算模型。你在开发策略时务必把“复权因子”相关的逻辑独立出来不然每次除权除息日系统就会产生莫名其妙的交易。指标计算这块也要留心浮点误差。比如计算均线时如果K线数很大直接累加收盘价再取平均可能会损失精度累积到一定级别后会触发临界状态的误判。更稳妥的做法是用滚动窗口求和或者使用numpy的均值函数。这些细节在单个策略里看似无所谓但在长时间运行的高频信号系统里一点微小的误差都可能被杠杆放大。4. 回测、模拟盘与实盘的差异4.1 回测曲线漂亮为什么一到实盘就崩这个问题几乎是每个量化新手都会遇到的。回测曲线漂亮很大概率是因为回测环境“太理想”没有考虑真实盘口深度信号出现时假设一定能按K线收盘价成交手续费和滑点设置过低甚至可能用了未来函数。未来函数是最隐蔽的坑。比如你在回测时用“当时还看不到的数据”来产生信号比如用当天的最高价去判断当天的入场或者在计算指标时不小心用了未来N根K线。这种错误在逐行Debug的时候很难发现因为结果看起来方向正确。我排查未来函数的一个土办法是在回测代码里随机抽取某一天打印出产生信号的K线数据然后人工确认信号产生时哪些数据早已存在。只要确定信号只依赖“已知信息”基本就能排除未来函数。如果排除掉未来函数回测依然很漂亮但实盘崩那就基本是滑点和流动性的锅。别用统一固定滑点最好根据标的的日均成交额和盘口深度做动态估计。流动性差的股票很容易买不进卖不出回测里的成交价完全失真。4.2 滑点、手续费与撮合机制真实的滑点很难精确模拟因为它取决于你交易时的对手盘厚度。一个粗颗粒度的估算方法是假设你在当前盘口的卖一价买入那你的成交成本就是卖一价与最新价的差如果委托量超过卖一档的挂单量还得吃卖二、卖三的价差。我回测时会在成交逻辑里加一个“滑点偏移参数”默认设置为0.02%并且针对流动性差的小盘股再额外加0.05%的惩罚项。这样至少能避免回测结果严重脱离现实。手续费也不能简单设成万几。不同券商的佣金标准不一样单笔最低收费5元通常存在如果你每个信号只交易很小金额这5元最低手续费会变成巨大成本。回测脚本里我会同时配置“佣金率”和“最低佣金”并且把卖出时的印花税也计入。不要小看这些细节我见过一个策略回测年化收益15%加上真实手续费后直接变成亏损。QMT在模拟盘里的撮合机制更像是“类实盘”它会根据当前盘口匹配成交也会受到涨跌停限制。所以模拟盘的成交结果比回测更可信。但模拟盘有一个问题它的盘口深度和真实盘可能存在差异尤其在极端行情中模拟盘的流动性往往被高估。因此我的建议是把模拟盘结果当作“最优情况”看待实盘时仍然要严格设好风控。4.3 模拟盘到底可不可信模拟盘能验证你的代码链路是否通顺但别指望它验证策略收益。因为模拟盘通常不涉及真实资金下单者的心态完全不同而且撮合时不会因为你下大单就把盘口打穿。你可以通过模拟盘验证这些事策略进程能否连续跑几天不崩溃、下单撤单是否正常、信号和成交记录是否一致、日志是否完整。这些才是模拟盘的价值。很多人在模拟盘上看到盈利就急着上实盘这是最危险的操作。我的习惯是模拟盘至少要跑2到4周至少覆盖一次涨跌停、一次停牌、一次异常行情确保异常处理逻辑都被触发过。如果模拟盘期间连一次系统重启和故障恢复都没有发生那我才会比较放心地切换到小资金实盘。实盘切换也不是全仓上而是用计划资金的十分之一先跑观察一段时间。这期间重点看成交滑点是否符合预期信号触发是否有延迟风控熔断是否正常。等这一切都稳定了再慢慢放大仓位。这套方法虽然保守但能让你的账户少交很多“学费”。5. 常见问题与排查实录5.1 初始化失败确认QMT版本与券商选择刚开始用这套系统时最常见的报错就是连接失败或者初始化失败。大部分原因都是版本不对。QMT有券商定制版和迅投通用版不同版本的接口方法名和路径参数有细微差别。我做系统开发时参考的是国金等券商提供的QMT版本同时也会建议用户去迅投官网查看最新的接口文档。这里有个经验不要凭记忆写代码一定要先在你自己的客户端版本里跑一遍官方示例确认返回值格式再接入策略。初始化失败还有个常见原因是客户端没登录。QMT的Python接口依赖本地客户端进程如果客户端界面没登录成功trader.connect()就会返回错误码。建议启动脚本前先手动把客户端启动并登录确认行情和交易通道都是正常状态。不要想着让Python进程替你去点登录按钮QMT本身不支持也不应该支持这种操作。如果你用的是券商定制版还需要确认账号是否已经开通程序化交易权限。有些券商默认不开启需要单独申请。没有权限时即使连接成功下单接口也会被拒绝。申请权限并不复杂联系你所在券商的客户经理即可但要注意不同券商的审核速度差异很大建议提前准备好。5.2 下载QMT客户端时怎么避坑搜索QMT时你会看到很多第三方网站提供下载链接这里面风险很大。我个人的建议是只认准两个渠道要么是迅投官网的下载页面要么是券商官方网站在“软件下载”栏目里提供的定制版本。搜国金QMT时最好也通过券商官网的个人中心或官方客服获取下载链接避免从不可信的论坛网盘下载到被篡改的客户端。为什么这么强调官方下载因为QMT涉及真实交易接口一旦客户端被植入恶意代码轻则盗取账号信息重则自动下单导致严重损失。这类金融软件绝对不能图省事。下载完成后建议校验一下文件哈希值能在官网找到哈希对比的就对比找不到也要至少确认客户端数字签名有效。QMT这类正规软件的安装包都会有公司签名。安装过程中如果杀毒软件提示也不要一律信任或一律忽略。正版QMT可能因为涉及底层网络操作被少数杀毒软件误报但你也无法排除下载到被篡改版本。稳妥做法是先在隔离环境或者虚拟机里安装确认行为正常后再放到实盘电脑上。尤其实盘电脑不要用来乱逛网页下载东西它应该是你量化系统的最小运行环境。5.3 实盘中数据断流和策略挂掉实盘跑起来后最大的敌人不是策略失效而是各种外部因素导致进程挂掉。数据断流是最常见的。QMT的行情订阅偶尔会因为网络波动出现几秒钟没有数据推送如果策略线程一直干等就会造成信号延迟。我的data_feed里加了一个心跳检测每秒钟检查一次最近一个tick的时间戳如果超过3秒没有新数据就认为数据流异常会重启订阅或者输出告警。策略进程本身也可能因为未捕获的异常退出。最简单的办法是在主循环外面套一个“看门狗”逻辑进程退出后每隔一段时间由另一个监控进程检查它是否存活不存活就自动拉起。也可以借助系统服务管理比如Linux下的systemdWindows下的计划任务都能实现简单的自动重启能力。不过要注意自动重启不能让系统反复开平仓所以恢复后第一步仍然是查询实际持仓再决定接下来的动作。盘中还有一种情况是策略逻辑本身出现异常比如某只股票停牌导致数据缺失代码里没有判断就执行了除零或数组越界。日志里要把堆栈记录下来同时风控模块要能识别到“策略计算失败”的状态不能盲目继续开仓。最好所有异常输出都写入logs目录每次实盘事故后都能根据日志复盘。5.4 日志里常见报错的排查思路我把自己项目里遇到最多的几类报错和排查思路整理成了一张表方便你定位问题报错现象常见原因排查方向connect返回值不为0客户端未登录 / 路径错误 / 端口被占用检查客户端登录状态核对userdata路径subscribe订阅无回调标的代码格式错误 / 没有行情权限确认标的是否沪深A股检查订阅代码后缀格式下单被拒可用资金不足 / 无交易权限 / 超过涨跌停查询账户资金、持仓权限和委托价格区间委托一直未成交流动性不足 / 价格偏离盘口查看盘口价格考虑撤单重发或使用对手价进程启动后内存暴涨K线缓存未限制 / 大量DataFrame未释放改为滚动缓存定期del无用变量gc.collect()多线程下数据错乱共享变量未加锁使用queue.Queue或者threading.Lock保护关键状态日志排查最重要的原则是“先自查本地状态再猜外部原因”。很多人一看账户没成交就怪行情或接口结果发现是自己的本地持仓状态和实际持仓不一致导致根本没有生成委托。所以我在日志里会把每一步决策的关键变量都打出来目标仓位、当前持仓、可用资金、最新价。你能顺着日志还原出系统当时“看到”的样子才能判断它是想错了还是做错了。6. 部署运维与后续扩展6.1 用一台低功耗机器跑策略是否靠谱很多朋友问过我是不是一定要买一台高性能服务器来跑策略。答案是看你的策略频率。如果你的策略是分钟级甚至日线级一台低功耗的小主机完全够用QMT客户端在Windows上运行对CPU和内存的要求并没有想象中那么高。我自己实测用过8GB内存的机器跑20个标的的分钟级策略内存占用不到3GBCPU平均负载在10%左右。但低功耗机器有个隐患是磁盘和网络稳定性。QMT客户端会持续写入行情数据日志也在不断增长如果用的是老旧的机械硬盘长时间运行后I/O可能成为瓶颈。我建议至少使用固态硬盘并给系统预留20GB以上可用空间。网络方面实盘机器尽量用有线网络连接不要依赖WiFi因为WiFi偶尔的延迟抖动对分钟级策略还能接受对秒级策略就不行了。实盘机器建议保持纯雏状态上面只装QMT客户端、Python环境和策略代码不要安装来源不明的软件。机器重启后最好能自动启动QMT客户端再启动策略脚本这样才能做到无人值守。Windows下可以用“启动文件夹”或者计划任务来完成Linux没有官方QMT客户端所以一般还是以Windows为主。6.2 监控告警和人机协作我个人一直觉得量化交易不是“全部交给机器”而是“机器负责执行人负责监控和决策”。系统稳定运行后你也不用每时每刻盯盘但必须有监控告警。告警方式不必很复杂可以用最简单的方案机器人推送到手机。策略进程在关键节点写入日志日志监控工具检测到“资金异常”“连续重试失败”“数据断流”等关键字时就把相关信息推送到你手机上。还有一个容易被忽略的告警维度是“无交易告警”。如果系统全天都没有产生任何委托而按策略逻辑本应有机会交易这可能不是市场不适合而是某个环节卡住了。所以我的告警规则里设置了一条收盘前30分钟如果当天委托次数为0并且账户持仓和昨天不一致就发一条提醒。这样可以尽早发现交易模块的问题。人机协作的重点在于“当天复盘”。我不建议每天都改策略但建议每天收盘后看一下系统自动生成的交易汇总包括开平仓次数、滑点统计、风控触发次数。这些数据比持仓盈亏更有价值因为它们能告诉你系统的执行质量和策略逻辑是否一致。如果连续一周交易汇总都在正常范围内你对系统的信任度才会真正建立起来。6.3 策略系统后续可以怎么进化这套基于QMT的策略系统目前是一个非常稳定的最小可用版本但它的架构给后续扩展留了很大空间。几个方向都值得尝试第一增加多策略支持。现在signal_engine里已经有了策略基类你可以继续实现更多策略比如布林带突破、动量轮动、事件驱动然后通过配置文件决定同时启动哪些策略。第二接入更多数据源。虽然QMT自带行情非常丰富但如果你想用另类数据比如新闻情感、资金流向可以在这个框架里加一个数据扩展模块把外部数据统一加工后喂给信号引擎。第三升级成“组合管理”模式。当前系统还停留在单策略信号层面后续可以把多策略、多标的作为一个投资组合统一管理让组合层面的风控和再平衡成为可能。我自己的经验是一开始不要追求大而全先把一个策略、两条核心链路跑通再慢慢加模块。这套系统从初版到现在经历过一次大的重构核心驱动因素就是“想知道某个策略为什么亏钱”。最初的版本把信号、下单、风控全写在一个文件里复盘时根本没有足够日志做归因。后来拆分模块、增加日志后很多问题才变得可见。你现在拿到的zip已经是我反复迭代后的版本希望你直接用的时候能少走我当初的那些弯路。本文还有配套的精品资源点击获取
返回列表