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

-
仓位划分:底仓+浮动仓 :策略将账户资金分为两部分——底仓(长期持仓,用于锁定长期趋势收益)和浮动仓(日内交易资金,用于T0回转操作),通常底仓占比70%-80%,浮动仓占比20%-30%,避免浮动仓过高导致风险集中。
-
两种操作模式:先买后卖/先卖后买 :
-
先买后卖(正T):当标的价格下跌至预设低位时,用浮动仓买入一定仓位,待价格上涨至预设高位时,卖出同等数量的底仓,完成一次正T操作,赚取差价的同时,底仓数量不变;
-
先卖后买(反T):当标的价格上涨至预设高位时,卖出一定数量的底仓,待价格下跌至预设低位时,用浮动仓买入同等数量的标的,补回底仓,同样实现差价盈利且不改变底仓仓位。
-
自动触发:依托实时数据与预设阈值 :QMT通过实时获取标的成交价、盘口数据,对比预设的买卖阈值(如盈利0.5%卖出、亏损0.3%止损),自动触发买卖操作,无需人工盯盘,规避人性弱点导致的操作失误。
-
合规适配:贴合2026量化新规 :策略设定日内交易频率上限(每日不超过5笔),避免高频交易触发新规差异化管理;不使用融资杠杆,仅用自有资金操作,适配100%融资保证金比例要求;严格遵循A股交易规则,最小交易单位为100股(1手),避免违规报单。

-
打开QMT终端(通过正规券商渠道开通,完成C4及以上风险测评,避免破解版、代开通服务,契合2026量化新规合规要求),登录个人券商账户; -
进入“策略编辑”模块(左侧菜单栏“策略”→“策略编辑”),新建Python策略,命名为“QMT自动T0策略(正T+反T)”; -
导入QMT核心依赖库(无需手动安装,QMT自带,直接导入即可),核心库包括:thstrade(交易接口,用于执行买卖、查询持仓)、thsdata(数据接口,用于获取实时/历史数据)、pandas(数据处理)、time(控制交易频率)。
-
目标标的(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核心依赖库(无需手动安装,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 # 当前浮动仓数量(初始为0)avg_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) # 非交易时间,每分钟检查一次

-
thstrade和thsdata是QMT专属接口,分别用于执行交易(买卖、查询持仓)和获取实时数据,无需额外安装,直接导入即可,确保策略与QMT平台无缝衔接; -
初始化函数中划分底仓与浮动仓资金,明确日内交易上限,从源头规避高频交易风险,契合2026量化新规要求;同时添加底仓补足逻辑,确保策略启动时底仓达标,避免因底仓不足导致T0操作无法执行。
-
正T(先买后卖):适用于标的日内先跌后涨的行情,通过“下跌买入、上涨卖出”赚取差价,代码中通过“float_position == 0”判断无浮动仓,避免重复买入; -
反T(先卖后买):适用于标的日内先涨后跌的行情,通过“上涨卖出、下跌买回”补回底仓并赚取差价,代码中用“float_position < 0”标记反T卖出的浮动仓,逻辑清晰,避免与正T操作混淆; -
两种模式自动切换,无需手动干预,适配不同日内波动行情,提升策略的灵活性与盈利概率。
-
日内交易上限控制:设定每日不超过5笔交易,避免高频申报触发新规“高频交易差异化管理”,同时降低手续费、滑点成本; -
止损机制:无论是正T还是反T,均设置0.8%的止损阈值,当亏损达到阈值时强制平仓,避免日内亏损扩大,保护账户资金安全; -
交易规则适配:买入/卖出数量按A股最小交易单位(100股)调整,避免因数量不符合规则导致报单失败;限定交易时间,避开开盘、收盘异动时段,减少滑点风险; -
无杠杆操作:策略仅使用自有资金,不涉及融资交易,适配新规“融资保证金比例100%”的要求,坚守合规底线。
-
全局变量记录日内交易次数、浮动仓数量、平均买入价格,确保每一次T0操作闭环,避免重复交易或仓位混乱; -
非交易时间自动重置日内交易次数,确保次日策略正常启动,无需手动干预,提升策略的自动化程度。

-
回测周期:建议选择1-3个月(覆盖震荡市、小幅单边行情),验证策略在不同日内波动下的表现;
-
初始资金:设置与实盘资金一致(如10万元),贴合实际操作;
-
标的:保持与源码中target_code一致,或替换为其他流动性良好的标的(如贵州茅台、创业板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结束交易,减少滑点。

-
合规优先,坚守正规渠道 :必须通过正规券商渠道开通QMT权限,完成C4及以上风险测评,不使用破解版、代开通服务;策略中不添加虚假申报、频繁撤单等违规逻辑,严格控制交易频率,契合2026量化新规要求,避免账户受限。
-
标的选择,聚焦流动性 :优先选择日内波动适中、流动性良好、盘口深度足的标的(如大盘ETF、蓝筹股、高流动性行业ETF),避免选择ST股、流动性差的小盘股、妖股——此类标的滑点大,易出现“买得到、卖不出”或“卖得出、买不回”的情况,导致策略失效。
-
实时监控,及时干预 :实盘初期建议实时监控策略运行,关注信号生成与交易执行情况,若出现异常(如报单失败、信号错乱、标的突发异动),及时停止策略,排查问题;遇到重大利空、利好消息(如政策调整、业绩暴雷),手动暂停策略,避免自动执行导致亏损。
-
控制成本,优化手续费 :T0策略的收益依赖多次日内小波段,手续费(佣金、印花税)会直接侵蚀收益,因此需选择佣金较低的券商(如万1以下),降低交易成本;同时控制交易频率,避免因阈值设置过低导致交易过于频繁,增加手续费支出。
-
不贪多求快,坚守纪律 :自动T0策略的核心是“积少成多”,切勿追求过高的日内收益,避免调整阈值过于激进,导致亏损扩大;严格遵循日内交易上限,不突破新规限制,坚守策略纪律,长期坚持才能实现稳定收益。

夜雨聆风