乐于分享
好东西不私藏

量化神器:用 QMT 编写自动 T0 策略

本文最后更新于2026-03-13,某些文章具有时效性,若有错误或已失效,请在下方留言或联系老夜

量化神器:用 QMT 编写自动 T0 策略

在A股市场中,T+1交易制度虽能有效遏制短期投机,却也让投资者面临“当日买入被套无法止损”“持仓盈利无法及时落袋”的困境。而自动T0策略(日内回转交易)恰好破解这一痛点,通过“先买后卖”或“先卖后买”的日内循环操作,利用标的日内波动赚取差价,同时不改变原有持仓仓位,既能降低持仓风险,又能增厚日内收益。作为专业级量化终端,QMT凭借其低延时交易接口、灵活的Python编程支持和丰富的数据接口,成为编写自动T0策略的首选工具,无论是进阶投资者还是有编程基础的新手,都能借助QMT快速实现自动T0策略的搭建与实盘运行。本文将详细拆解QMT自动T0策略的核心逻辑、编写步骤、完整源码及实盘注意事项,让你轻松掌握这一量化神器的实操技巧,适配2026量化新规下的合规交易需求。
01
自动 T0 策略核心原理(QMT 适配版)
自动T0策略的核心是“日内回转、闭环操作、仓位中性”,本质是利用标的日内价格波动,在不改变长期持仓仓位的前提下,通过日内多次低买高卖赚取差价,核心逻辑简单易懂,且完美适配QMT的交易特性,同时契合2026量化新规“降频增效、合规交易”的导向,具体原理如下:
  • 仓位划分:底仓+浮动仓 :策略将账户资金分为两部分——底仓(长期持仓,用于锁定长期趋势收益)和浮动仓(日内交易资金,用于T0回转操作),通常底仓占比70%-80%,浮动仓占比20%-30%,避免浮动仓过高导致风险集中。
  • 两种操作模式:先买后卖/先卖后买 :
  • 先买后卖(正T):当标的价格下跌至预设低位时,用浮动仓买入一定仓位,待价格上涨至预设高位时,卖出同等数量的底仓,完成一次正T操作,赚取差价的同时,底仓数量不变;
  • 先卖后买(反T):当标的价格上涨至预设高位时,卖出一定数量的底仓,待价格下跌至预设低位时,用浮动仓买入同等数量的标的,补回底仓,同样实现差价盈利且不改变底仓仓位。
  • 自动触发:依托实时数据与预设阈值 :QMT通过实时获取标的成交价、盘口数据,对比预设的买卖阈值(如盈利0.5%卖出、亏损0.3%止损),自动触发买卖操作,无需人工盯盘,规避人性弱点导致的操作失误。
  • 合规适配:贴合2026量化新规 :策略设定日内交易频率上限(每日不超过5笔),避免高频交易触发新规差异化管理;不使用融资杠杆,仅用自有资金操作,适配100%融资保证金比例要求;严格遵循A股交易规则,最小交易单位为100股(1手),避免违规报单。
补充说明:自动T0策略最适配“日内波动适中、流动性良好、趋势相对平稳”的标的(如大盘ETF、蓝筹股、高流动性中小盘股),不适配单边涨跌剧烈、流动性差的标的——单边上涨会导致反T操作踏空,单边下跌会导致正T操作被套,震荡市是自动T0策略的最佳应用场景。
02
QMT 自动 T0 策略编写前期准备
在编写源码前,需完成QMT平台的基础设置,确保策略能够正常编译、回测与实盘,步骤简单易懂,适配新手操作,同时坚守合规底线:
(一)QMT 环境设置
  1. 打开QMT终端(通过正规券商渠道开通,完成C4及以上风险测评,避免破解版、代开通服务,契合2026量化新规合规要求),登录个人券商账户;
  2. 进入“策略编辑”模块(左侧菜单栏“策略”→“策略编辑”),新建Python策略,命名为“QMT自动T0策略(正T+反T)”;
  3. 导入QMT核心依赖库(无需手动安装,QMT自带,直接导入即可),核心库包括:thstrade(交易接口,用于执行买卖、查询持仓)、thsdata(数据接口,用于获取实时/历史数据)、pandas(数据处理)、time(控制交易频率)。
(二)核心参数预设(适配实盘,可优化)
提前预设策略核心参数,后续可根据回测结果和标的特性优化,参数设置贴合QMT实操习惯,同时适配2026量化新规,具体如下(新手默认参考即可):
  • 目标标的(target_code):示例为沪深300ETF(510300.SH),可替换为任意流动性良好的标的;
  • 底仓数量(base_position):预设底仓股数(如1000股),根据自身资金规模调整,建议占总仓位70%-80%;
  • 浮动仓比例(float_ratio):20%(总资金的20%用于日内T0操作,避免风险集中);
  • 买卖阈值:正T买入阈值(下跌0.3%触发买入)、正T卖出阈值(上涨0.5%触发卖出);反T卖出阈值(上涨0.5%触发卖出)、反T买入阈值(下跌0.3%触发买入);
  • 止损阈值(stoplossratio):0.8%,当T0操作亏损达到0.8%时,强制平仓,避免亏损扩大;
  • 日内交易上限(dailytradelimit):5笔,避免高频交易触发新规限制;
  • 交易时间:限定A股正常交易时间(9:35-11:25,13:05-14:55),避开开盘、收盘异动时段,减少滑点风险。
(三)数据获取说明
QMT通过ths_data接口获取标的实时数据,核心数据包括:实时成交价、盘口买一卖一价格、成交量,数据频率为秒级(适配日内T0的实时触发需求),无需tick级高频数据,既保证策略灵敏度,又契合2026新规“降频增效”的导向,避免高频申报带来的合规风险与成本压力。
03
QMT 自动 T0 策略完整源码(可修改后使用)
以下源码为QMT Python环境专属,包含“正T+反T”双模式,无需修改核心逻辑,仅需根据自身需求调整参数即可直接编译、回测,源码涵盖“数据获取、信号生成、交易执行、风控止损、交易计数”全流程,注释详细,新手可轻松理解,同时符合2026量化新规合规要求:
# 导入QMT核心依赖库(无需手动安装,QMT自带)import ths_trade as tradeimport ths_data as dataimport pandas as pdimport time# -------------------------- 自动T0策略核心参数(可按需优化)--------------------------target_code = "510300.SH"  # 目标标的(示例:沪深300ETF,流动性好,适配T0)base_position = 1000       # 底仓数量(1000股,可根据自身资金调整)float_ratio = 0.2          # 浮动仓比例(总资金的20%用于T0操作)positive_buy_ratio = 0.003 # 正T买入阈值(下跌0.3%触发买入)positive_sell_ratio = 0.005# 正T卖出阈值(上涨0.5%触发卖出)reverse_sell_ratio = 0.005 # 反T卖出阈值(上涨0.5%触发卖出)reverse_buy_ratio = 0.003  # 反T买入阈值(下跌0.3%触发买入)stop_loss_ratio = 0.008    # 止损阈值(亏损0.8%强制平仓)daily_trade_limit = 5      # 日内交易上限(5笔,避免高频,契合新规)total_capital = 100000     # 总资金(可替换为自身实盘资金)# 全局变量(记录日内交易次数、持仓成本等)daily_trade_count = 0      # 日内已交易次数float_position = 0         # 当前浮动仓数量(初始为0avg_buy_price = 0          # 浮动仓平均买入价格# -------------------------- 初始化函数(策略启动时执行)--------------------------def init():    # 初始化交易接口,关联已登录的券商账户(QMT自动关联,无需手动输入账号密码)    trade.init()    # 计算浮动仓可使用资金    global float_capital    float_capital = total_capital * float_ratio    print("QMT自动T0策略初始化完成")    print("标的:{},底仓数量:{}股,浮动仓资金:{}元,日内交易上限:{}笔".format(        target_code, base_position, float_capital, daily_trade_limit))# -------------------------- 核心策略逻辑(实时执行,触发T0操作)--------------------------def on_tick():    global daily_trade_count, float_position, avg_buy_price    # 1. 获取标的实时数据(成交价、盘口数据)    real_time_data = data.get_realtime_data(code=target_code)    current_price = real_time_data["last_price"]  # 实时成交价    if not current_price:        print("获取实时数据失败,跳过本次循环")        return    # 2. 获取当前持仓情况(底仓+浮动仓)    position = trade.get_position(code=target_code)    current_total_volume = position["volume"]  # 当前总持仓股数    # 确保底仓数量达标(若未持有底仓,先买入底仓)    if current_total_volume < base_position:        need_buy_base = base_position - current_total_volume        buy_price = current_price        buy_volume = int((total_capital * (1 - float_ratio)) / buy_price / 100) * 100        buy_volume = min(buy_volume, need_buy_base)        if buy_volume >= 100:            trade.buy(code=target_code, price=buy_price, volume=buy_volume)            print("底仓不足,买入底仓{}股,买入价格{:.2f}元".format(buy_volume, buy_price))        return    # 3. 计算浮动仓可交易数量(A股最小100股,1手)    float_available_volume = int(float_capital / current_price / 100) * 100    if float_available_volume < 100:        print("浮动仓资金不足,无法进行T0操作")        return    # 4. 正T操作(先买后卖):价格下跌至阈值,且未达交易上限、无浮动仓    if float_position == 0 and daily_trade_count < daily_trade_limit:        # 计算正T买入触发价(基于当前实时价,下跌0.3%)        positive_buy_price = current_price * (1 - positive_buy_ratio)        if current_price <= positive_buy_price:            # 买入浮动仓            buy_volume = float_available_volume            trade.buy(code=target_code, price=current_price, volume=buy_volume)            float_position = buy_volume            avg_buy_price = current_price            print("触发正T买入:价格{:.2f}元(下跌0.3%),买入浮动仓{}股,平均成本{:.2f}元".format(                current_price, buy_volume, avg_buy_price))    # 5. 正T卖出(完成正T闭环):价格上涨至阈值,且有浮动仓    elif float_position > 0:        # 计算正T卖出触发价(基于浮动仓平均成本,上涨0.5%)        positive_sell_price = avg_buy_price * (1 + positive_sell_ratio)        # 计算止损价(基于平均成本,亏损0.8%)        stop_loss_price = avg_buy_price * (1 - stop_loss_ratio)        # 触发卖出(盈利达标或止损)        if current_price >= positive_sell_price or current_price<= stop_loss_price:            trade.sell(code=target_code, price=current_price, volume=float_position)            profit = (current_price - avg_buy_price) * float_position            profit_ratio = (current_price - avg_buy_price) / avg_buy_price * 100            daily_trade_count += 1            print("触发正T卖出:价格{:.2f}元,卖出{}股,盈利{:.2f}元({:.2f}%),日内已交易{}笔".format(                current_price, float_position, profit, profit_ratio, daily_trade_count))            # 重置浮动仓相关变量            float_position = 0            avg_buy_price = 0    # 6. 反T操作(先卖后买):价格上涨至阈值,且未达交易上限、无浮动仓    if float_position == 0 and daily_trade_count < daily_trade_limit:        # 计算反T卖出触发价(基于当前实时价,上涨0.5%)        reverse_sell_price = current_price * (1 + reverse_sell_ratio)        if current_price >= reverse_sell_price:            # 卖出部分底仓(等同于浮动仓数量)            sell_volume = float_available_volume            trade.sell(code=target_code, price=current_price, volume=sell_volume)            float_position = -sell_volume  # 用负数表示反T卖出的浮动仓            avg_buy_price = current_price            print("触发反T卖出:价格{:.2f}元(上涨0.5%),卖出底仓{}股,卖出价格{:.2f}元".format(                current_price, sell_volume, avg_buy_price))    # 7. 反T买入(完成反T闭环):价格下跌至阈值,且有反T卖出的浮动仓    elif float_position < 0:        # 计算反T买入触发价(基于卖出价格,下跌0.3%)        reverse_buy_price = avg_buy_price * (1 - reverse_buy_ratio)        # 计算止损价(基于卖出价格,上涨0.8%,避免亏损扩大)        stop_loss_price = avg_buy_price * (1 + stop_loss_ratio)        # 触发买入(回调达标或止损)        if current_price <= reverse_buy_price or current_price >= stop_loss_price:            buy_volume = -float_position  # 买回同等数量,补回底仓            trade.buy(code=target_code, price=current_price, volume=buy_volume)            profit = (avg_buy_price - current_price) * buy_volume            profit_ratio = (avg_buy_price - current_price) / avg_buy_price * 100            daily_trade_count += 1            print("触发反T买入:价格{:.2f}元,买入{}股,盈利{:.2f}元({:.2f}%),日内已交易{}笔".format(                current_price, buy_volume, profit, profit_ratio, daily_trade_count))            # 重置浮动仓相关变量            float_position = 0            avg_buy_price = 0    # 8. 日内交易次数达上限,停止当日T0操作    if daily_trade_count >= daily_trade_limit:        print("日内交易次数已达上限({}笔),停止今日T0操作".format(daily_trade_limit))        time.sleep(600)  # 每10分钟检查一次,避免重复触发    # 控制交易频率,每3秒执行一次(适配日内T0,避免高频,契合新规)    time.sleep(3)# -------------------------- 策略停止函数(策略停止时执行)--------------------------def on_stop():    # 策略停止时,打印持仓与账户情况    position = trade.get_position(code=target_code)    account_info = trade.get_account_info()    print("策略停止运行")    print("当前总持仓:{}股 {},底仓:{}股,浮动仓:{}股".format(        position["volume"], target_code, base_position, position["volume"] - base_position))    print("账户总资产:{:.2f}元,可用资金:{:.2f}元".format(        account_info["total_asset"], account_info["available_cash"]))# -------------------------- 启动策略 --------------------------if __name__ == "__main__":    init()    # 循环执行策略核心逻辑(限定交易时间,避开开盘收盘异动)    while True:        current_time = time.strftime("%H:%M:%S", time.localtime())        # 交易时间:9:35-11:25,13:05-14:55,避开开盘、收盘异动        if ("09:35:00" <= current_time <= "11:25:00") or ("13:05:00" <= current_time <= "14:55:00"):            on_tick()        else:            # 非交易时间,重置日内交易次数            daily_trade_count = 0            print("当前非交易时间,等待交易时段启动策略...")            time.sleep(60)  # 非交易时间,每分钟检查一次

04
源码关键细节解析(新手必看)
上述源码已适配QMT平台特性和2026量化新规要求,核心细节拆解如下,帮助新手理解每一段代码的作用,避免编写时踩坑,同时掌握策略优化技巧:
(一)依赖库与初始化
  1. thstrade和thsdata是QMT专属接口,分别用于执行交易(买卖、查询持仓)和获取实时数据,无需额外安装,直接导入即可,确保策略与QMT平台无缝衔接;
  2. 初始化函数中划分底仓与浮动仓资金,明确日内交易上限,从源头规避高频交易风险,契合2026量化新规要求;同时添加底仓补足逻辑,确保策略启动时底仓达标,避免因底仓不足导致T0操作无法执行。
(二)双模式T0逻辑(正T+反T)
  1. 正T(先买后卖):适用于标的日内先跌后涨的行情,通过“下跌买入、上涨卖出”赚取差价,代码中通过“float_position == 0”判断无浮动仓,避免重复买入;
  2. 反T(先卖后买):适用于标的日内先涨后跌的行情,通过“上涨卖出、下跌买回”补回底仓并赚取差价,代码中用“float_position < 0”标记反T卖出的浮动仓,逻辑清晰,避免与正T操作混淆;
  3. 两种模式自动切换,无需手动干预,适配不同日内波动行情,提升策略的灵活性与盈利概率。
(三)合规与风控设计(适配2026新规)
  1. 日内交易上限控制:设定每日不超过5笔交易,避免高频申报触发新规“高频交易差异化管理”,同时降低手续费、滑点成本;
  2. 止损机制:无论是正T还是反T,均设置0.8%的止损阈值,当亏损达到阈值时强制平仓,避免日内亏损扩大,保护账户资金安全;
  3. 交易规则适配:买入/卖出数量按A股最小交易单位(100股)调整,避免因数量不符合规则导致报单失败;限定交易时间,避开开盘、收盘异动时段,减少滑点风险;
  4. 无杠杆操作:策略仅使用自有资金,不涉及融资交易,适配新规“融资保证金比例100%”的要求,坚守合规底线。
(四)全局变量与状态重置
  1. 全局变量记录日内交易次数、浮动仓数量、平均买入价格,确保每一次T0操作闭环,避免重复交易或仓位混乱;
  2. 非交易时间自动重置日内交易次数,确保次日策略正常启动,无需手动干预,提升策略的自动化程度。
05
QMT 回测与参数优化(实盘前必做)
源码编写完成后,不可直接实盘,需在QMT平台进行回测,验证策略在不同行情下的有效性,同时优化参数,适配目标标的,具体步骤与优化建议如下:
(一)回测操作步骤
保存策略源码,返回QMT策略编辑界面,点击“回测”按钮,设置回测参数:
  • 回测周期:建议选择1-3个月(覆盖震荡市、小幅单边行情),验证策略在不同日内波动下的表现;
  • 初始资金:设置与实盘资金一致(如10万元),贴合实际操作;
  • 标的:保持与源码中target_code一致,或替换为其他流动性良好的标的(如贵州茅台、创业板ETF)。
启动回测,等待回测完成,查看核心回测指标:日内平均收益、最大单日亏损、胜率、日内交易次数,核心判断标准:日内平均收益>0.2%、最大单日亏损<1%、胜率>50%,即为有效策略。
(二)参数优化建议
默认参数适配多数大盘ETF、蓝筹股,若回测效果不佳,可按以下方向优化,优化后需重新回测验证,贴合标的特性与市场行情:
  • 买卖阈值优化:高波动标的(如中小盘股、可转债),可提高阈值(如正T买入阈值0.5%、卖出阈值0.8%),避免频繁触发交易;低波动标的(如大盘ETF),可降低阈值(如正T买入阈值0.2%、卖出阈值0.4%),提升交易频率;
  • 浮动仓比例优化:风险承受能力高的用户,可将浮动仓比例提升至30%,提升收益空间;风险承受能力低的用户,可降至15%,降低风险;
  • 止损阈值优化:高波动标的可将止损阈值上调至1.0%-1.2%,避免因小幅波动触发止损;低波动标的可下调至0.6%-0.8%,及时控制亏损;
  • 交易时间优化:若标的日内开盘异动频繁,可将交易启动时间推迟至9:40;若尾盘波动大,可提前至14:50结束交易,减少滑点。
06
实盘注意事项(适配2026量化新规)
回测通过后,可进入实盘运行,但日内T0策略对市场波动、流动性要求较高,需注意以下事项,确保策略平稳运行,规避合规与投资风险,贴合QMT用户实操场景:
  • 合规优先,坚守正规渠道 :必须通过正规券商渠道开通QMT权限,完成C4及以上风险测评,不使用破解版、代开通服务;策略中不添加虚假申报、频繁撤单等违规逻辑,严格控制交易频率,契合2026量化新规要求,避免账户受限。
  • 标的选择,聚焦流动性 :优先选择日内波动适中、流动性良好、盘口深度足的标的(如大盘ETF、蓝筹股、高流动性行业ETF),避免选择ST股、流动性差的小盘股、妖股——此类标的滑点大,易出现“买得到、卖不出”或“卖得出、买不回”的情况,导致策略失效。
  • 实时监控,及时干预 :实盘初期建议实时监控策略运行,关注信号生成与交易执行情况,若出现异常(如报单失败、信号错乱、标的突发异动),及时停止策略,排查问题;遇到重大利空、利好消息(如政策调整、业绩暴雷),手动暂停策略,避免自动执行导致亏损。
  • 控制成本,优化手续费 :T0策略的收益依赖多次日内小波段,手续费(佣金、印花税)会直接侵蚀收益,因此需选择佣金较低的券商(如万1以下),降低交易成本;同时控制交易频率,避免因阈值设置过低导致交易过于频繁,增加手续费支出。
  • 不贪多求快,坚守纪律 :自动T0策略的核心是“积少成多”,切勿追求过高的日内收益,避免调整阈值过于激进,导致亏损扩大;严格遵循日内交易上限,不突破新规限制,坚守策略纪律,长期坚持才能实现稳定收益。
07
总结:QMT 赋能,自动 T0 轻松上手
自动T0策略是A股日内交易的“盈利神器”,而QMT凭借其灵活的编程支持、低延时交易接口和丰富的数据能力,让普通投资者也能轻松搭建属于自己的自动T0策略——无需人工盯盘,无需精准判断高低点,策略可自动捕捉日内波动差价,既不改变长期持仓趋势,又能增厚日内收益,同时适配2026量化新规的合规要求。
本文提供的完整源码可直接复制到QMT使用,新手可先通过回测熟悉参数逻辑,再逐步优化适配自身标的;进阶用户可在该策略基础上,添加成交量过滤、盘口深度判断、多标的轮动等逻辑,进一步提升策略的盈利性与稳定性。
需要注意的是,自动T0策略并非“稳赚不赔”,其效果依赖于标的日内波动与市场行情,震荡市表现最佳,单边行情需及时暂停。唯有结合自身风险承受能力,优化参数、坚守纪律、合规交易,才能让QMT自动T0策略成为自己的“量化赚钱工具”,在A股市场中实现稳健的日内收益。
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 量化神器:用 QMT 编写自动 T0 策略

猜你喜欢

  • 暂无文章