我的 QMT 实战笔记(开篇):从 0 到可用的量化策略,实战中的 3 个关键误区
回顾半年前编写的 QMT 均线策略,其回测年化收益 300% 的结果,如今看来充满了未来函数的典型误区。
作为从 "对着 API 文档调试" 到 "实盘运行近一年" 的实践者,发现许多朋友与我初期经历相似:具备 Python 基础,能理解基础策略逻辑,但在实际落地时,常陷入 "理论可行,实操失效" 的困境。
因此计划开设系列分享,系统拆解实战中遇到的问题、验证有效的逻辑及可复用的代码片段。量化研究中,群体经验的交流远胜于独自摸索。
以下梳理初期实践中影响较大的 3 个核心问题,供参考避坑:
01 警惕 "完美回测陷阱",先掌握 QMT 策略基础架构
初期使用 QMT 时,过度关注指标复杂度,反而忽视了策略运行的基础逻辑。实际上 QMT 策略的核心架构可简化为两部分:
- init函数:负责初始化配置,仅需定义股票池与初始资金等必要参数,避免冗余代码
- on_bar函数:按 K 线周期触发,是实现交易逻辑的核心模块
分享一套精简的基础框架(较官方示例精简 50% 冗余代码):
def init(context): # 核心初始化参数 context.stock_list = ["600036.sh", "000858.sz"] # 标的池:招行+五粮液 context.init_cash = 500000 # 初始资金50万元def on_bar(context, bar_dict): # 日线级信号判断(避免盘中波动干扰) for stock in context.stock_list: # 过滤停牌标的 if not bar_dict[stock].is_trading: continue # 交易逻辑嵌入区(后续详解) close_price = bar_dict[stock].close
初期阶段,能稳定运行基础框架,已可超过 60% 的入门者。
02 指标计算无需过度依赖外部库,QMT 原生函数足以支撑进阶需求
曾花费大量时间研究 TA-Lib 的参数配置,后发现 QMT 内置的get_price函数已能满足多数指标计算需求,以均线为例:
# 获取20日收盘价数据,计算5/10日均线df = get_price(stock, end_date=context.now, frequency='1d', fields=['close'], count=20)ma5 = df['close'].tail(5).mean() # 近5日收盘价均值ma10 = df['close'].tail(10).mean() # 近10日收盘价均值
关键注意点:end_date=context.now是确保数据实时性的核心参数,若使用固定日期会导致未来函数问题(本人初期曾因此导致回测与实盘结果严重偏离)。
03 下单逻辑需完善前置校验,3 项基础检查不可少
初期实盘时,因未完善下单前的校验逻辑,多次出现 "信号触发但无法成交" 的情况。目前实盘必做的三项检查:
# 买入前的基础校验if context.positions.get(stock, 0) > 0: # 避免重复持仓 continueif close_price * 100 > context.cash: # 验证资金充足性(100股为最小单位) continueif bar_dict[stock].volume == 0: # 过滤零成交标的 continue# 执行下单(小仓位试错)order_shares(stock, 100)
这些基础校验虽简单,却有效避免了多数实盘执行层面的问题。
若您在 QMT 实践中遇到特定问题,欢迎在评论区留言 —— 后续内容可能会针对高频问题进行专题解析。量化实践中,集体避坑远比独自试错更高效。