Python+MiniQMT 实现 MACD+RSI 组合日内做 T 策略(完整可运行代码)
·
前言
股票日内做 T 是短线常用的降低持仓成本手段,市面上主流做 T 思路分为均线法、量价法、技术指标组合法,其中MACD+RSI + 成交量多指标共振策略胜率相对稳定。本文基于 MiniQMT(xtquant)量化接口,使用 1 分钟 K 线搭建全自动日内 T+0 交易脚本,完整封装指标计算、信号生成、实盘下单全流程。
风险提示:本文代码仅作量化学习演示,股票日内交易存在波动风险,实盘运行前务必回测模拟,不构成任何投资建议。
一、策略核心逻辑
1. 数据周期
采用 1 分钟 K 线捕捉日内短线高低点,适配震荡个股日内波段操作。
2. 指标参数
- MACD:快线 12、慢线 26、信号线 9
- RSI:周期 14,超卖阈值 30,超买阈值 70
- 成交量:20 周期均量,放量 1.5 倍、缩量 0.8 倍区分量能状态
3. 买入做 T(低吸)三重共振条件
- RSI 指标进入超卖区间(RSI<30)
- MACD 绿柱持续缩短 或 DIF 线上穿 DEA 线(金叉)
- 当前成交量缩量,回调动能衰竭
4. 卖出做 T(高抛)三重共振条件
- RSI 指标进入超买区间(RSI>70)
- MACD 红柱持续缩短 或 DIF 线下穿 DEA 线(死叉)
- 当前成交量放量,上涨动能衰减
二、完整代码实现
1. 模块导入与全局策略参数
from xtquant import xtdata
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
import pandas as pd
import numpy as np
import talib as ta
# ======================策略参数(可根据个股调整)======================
CODE = "600000.SH" # 交易标的股票代码
PERIOD = "1m" # 日内做T采用1分钟K线
FASTperiod = 12 # MACD快线周期
SLOWperiod = 26 # MACD慢线周期
SIGNALperiod = 9 # MACD信号线周期
RSI_N = 14 # RSI计算周期
VOLUME_MULTIPLE = 1.5 # 放量倍数:大于1.5倍均量判定放量
VOL_LOOKBACK = 20 # 成交量均线计算窗口
RSI_OVERSOLD = 30 # RSI超卖阈值(买入)
RSI_OVERBOUGHT = 70 # RSI超买阈值(卖出)
2. 指标计算函数:获取 K 线并计算 MACD、RSI、量能指标
# ======================1. 获取并计算指标:MACD、RSI、成交量======================
def get_indicators(code, period):
"""获取K线并计算MACD、RSI、成交量指标"""
# 下载最新300根1分钟K线数据
xtdata.download_sector_data([code], period, start_time="", end_time="", count=300)
# 读取本地行情数据
df = xtdata.get_local_data(field_list=[], stock_code=code, period=period, count=300)
# 空值前向填充
df = df.fillna(method="ffill")
close = df["close"].values
volume = df["volume"].values
# 计算MACD指标 DIF、DEA、MACD柱
dif, dea, macd_bar = ta.MACD(
close,
fastperiod=FASTperiod,
slowperiod=SLOWperiod,
signalperiod=SIGNALperiod
)
# 计算RSI相对强弱指标
rsi = ta.RSI(close, timeperiod=RSI_N)
# 成交量均线、放量/缩量标记
vol_ma = ta.SMA(volume, VOL_LOOKBACK)
is_volume_up = volume > vol_ma * VOLUME_MULTIPLE # 放量标记
is_volume_down = volume < vol_ma * 0.8 # 缩量标记
# 将指标合并至原始行情DataFrame
df["dif"] = dif
df["dea"] = dea
df["macd_bar"] = macd_bar
df["rsi"] = rsi
df["vol_ma"] = vol_ma
df["is_volume_up"] = is_volume_up
df["is_volume_down"] = is_volume_down
return df
3. 交易信号生成函数:区分买入 T / 卖出 T / 无信号
# ======================2. 日内做T核心买卖信号======================
def generate_signal(df):
"""生成做T买入/卖出信号
return: signal(0无信号,1买入T,-1卖出T), 当前最新K线数据
"""
signal = 0 # 初始化无信号
latest = df.iloc[-1] # 最新一根1分钟K线
prev = df.iloc[-2] # 前一根1分钟K线
# ----------------------买入做T(低吸)条件----------------------
buy_condition = (
# 条件1:RSI超卖小于30
(latest["rsi"] < RSI_OVERSOLD)
and
# 条件2:MACD绿柱缩短 或 MACD金叉
(
(latest["macd_bar"] < 0 and latest["macd_bar"] > prev["macd_bar"])
or
(latest["dif"] > latest["dea"] and prev["dif"] <= prev["dea"])
)
and
# 条件3:缩量回调,抛压衰竭
latest["is_volume_down"]
)
# ----------------------卖出做T(高抛)条件----------------------
sell_condition = (
# 条件1:RSI超买大于70
(latest["rsi"] > RSI_OVERBOUGHT)
and
# 条件2:MACD红柱缩短 或 MACD死叉
(
(latest["macd_bar"] > 0 and latest["macd_bar"] < prev["macd_bar"])
or
(latest["dif"] < latest["dea"] and prev["dif"] >= prev["dea"])
)
and
# 条件3:放量上涨,多头动能衰减
latest["is_volume_up"]
)
# 判定信号
if buy_condition:
signal = 1
elif sell_condition:
signal = -1
return signal, latest
4. 策略主运行函数:信号校验、账户查询、自动下单
# ======================3. 执行交易(日内做T)======================
def run_t_strategy(xt_trader, acc):
"""运行日内做T策略主函数"""
print(f"===== 开始执行 {CODE} 日内做T策略 =====")
# 1. 获取完整指标行情数据
df = get_indicators(CODE, PERIOD)
# 2. 生成交易信号
signal, latest = generate_signal(df)
price = latest["close"]
# 打印当前盘面指标状态,方便日志观察
print(f"最新价: {price:.2f}")
print(f"RSI: {latest['rsi']:.2f}")
print(f"MACD DIF: {latest['dif']:.6f}, DEA: {latest['dea']:.6f}")
print(f"MACD柱: {latest['macd_bar']:.6f}")
print(f"放量: {latest['is_volume_up']}, 缩量: {latest['is_volume_down']}")
# 查询账户持仓、可用资金
pos = xt_trader.query_stock_position(acc, CODE)
available_cash = xt_trader.query_account(acc).cash
pos_volume = pos.volume if pos else 0
# 买入做T:有现金 + 买入信号,单次下单100股
if signal == 1:
print("✅ 触发【做T买入信号】")
if available_cash > price * 100:
xt_trader.order_stock(
acc, CODE, xt_trader.STOCK_BUY, 100, 0, price, "日内做T-低吸"
)
else:
print("现金不足,无法买入")
# 卖出做T:有持仓 + 卖出信号,单次卖出100股
elif signal == -1:
print("❌ 触发【做T卖出信号】")
if pos_volume >= 100:
xt_trader.order_stock(
acc, CODE, xt_trader.STOCK_SELL, 100, 0, price, "日内做T-高抛"
)
else:
print("无持仓,无法卖出")
# 无交易信号
else:
print("📊 无交易信号,继续观察")
三、使用说明
- 环境依赖
- 安装 MiniQMT 量化终端,配置 xtquant 接口;
- 依赖库:
pandas、numpy、TA-Lib,TA-Lib 需手动安装底层库。
- 参数修改
- 修改
CODE切换交易个股; - 震荡行情可缩小 RSI 阈值、降低放量倍数,趋势行情可放大参数过滤杂信号。
- 修改
- 交易规则限制
- 代码单次交易固定 100 手(A 股最小交易单位);
- 买入校验可用资金、卖出校验持仓数量,避免废单;
- 运行方式 配合 MiniQMT 定时轮询(如每 60 秒执行一次
run_t_strategy),实现盘中全自动盯盘做 T。
四、策略优缺点分析
优势
- 多指标共振过滤单一指标假信号,减少频繁无效交易;
- 量能辅助判断拐点,避免追高抄底;
- 模块化拆分代码,指标、信号、交易逻辑分离,便于二次修改优化。
缺陷
- 极端单边行情(连续大涨 / 大跌)会持续触发超买超卖,容易踏空或深套;
- 依赖 1 分钟高频数据,服务器延迟、行情卡顿会影响信号准确性;
- A 股 T+0 仅适用于底仓做 T,无底仓无法卖出,代码仅支持底仓高抛、现金低吸模式。
五、优化拓展方向
- 增加止损止盈模块:单笔做 T 盈利 / 亏损达到阈值自动平仓;
- 加入大盘指数过滤,指数走弱时关闭做 T 信号;
- 增加动态仓位,根据波动率调整单次交易股数;
- 增加历史回测函数,批量测试历史 K 线测算策略胜率、盈亏比。
重要风险声明
量化策略存在历史回测失真、行情滑点、接口延迟、交易规则变动等多重风险,本文代码仅用于编程与量化逻辑学习,严禁未模拟直接实盘投入大额资金。市场有风险,投资需谨慎。
更多推荐

所有评论(0)