当前位置:首页>python>玩转量化QMT:QMT中如何使用python编写一个双均线量化策略?

玩转量化QMT:QMT中如何使用python编写一个双均线量化策略?

  • 2026-10-11 08:00:07
玩转量化QMT:QMT中如何使用python编写一个双均线量化策略?

今天我们一起来看看量化软件QMT中如何用Python编写双均线量化策略?双均线量化策略是依托长短均线判定行情,出现金叉顺势进场买入,形成死叉及时离场卖出,操作逻辑简单直白,上手轻松,非常适合我们量化入门学习。

一、创建策略文件与环境准备

打开QMT后,点击模型研究界面→新建模型→Python模型。在代码的第一行,写入#coding:gbk,以统一脚本的编码格式。

二、认识策略核心函数

一个QMT的Python策略必须包含两个核心函数:   

init(ContextInfo) 初始化函数,在整个策略生命周期中只执行一次,用于设置交易品种、参数、账号等初始状态

handlebar(ContextInfo) 行情事件处理函数。在回测时,会对历史K线逐根调用,在实盘时,会随着新的行情数据(tick)而触发。策略的主要交易逻辑就写在这个函数里。

三、编写初始化函数 (  init  )

在 init 函数中,我们需要定义策略运行所需的基础配置。这里定义了交易标的和均线周期,为后续计算做好准备。

def init(C):    # 设置交易品种,通常与模型交易界面选择的品种一致    C.stock = C.stockcode + '.' + C.market    # 设置双均线参数:快线周期和慢线周期    C.line1 = 10   # 短期均线周期    C.line2 = 20   # 长期均线周期    # 设置用于回测的账号ID(实盘时会自动替换)    C.accountid = "testS"

四、编写核心交易逻辑 (  handlebar  )

1、获取历史行情数据

在函数开头,我们需要获取足够长度的收盘价数据来计算均线。 使用   get_market_data_ex   函数可以灵活获取指定字段和数量的历史数据。

def handlebar(C):    # 获取历史收盘价数据,数量至少为最长均线周期所需    local_data = C.get_market_data_ex(['close'], [C.stock], period=C.period, count=max(C.line1, C.line2))    close_list = list(local_data[C.stock].iloc[:, 0])

2、计算双均线值

利用获取的收盘价列表,计算快慢均线的当前值。这里使用   np.mean   对列表切片进行平均计算。

# 计算短期均线和长期均线的平均值line1_mean = np.mean(close_list[-C.line1:])line2_mean = np.mean(close_list[-C.line2:])

3、查询账户状态

在进行交易决策前,必须先查询账户当前的资金和持仓情况。get_trade_detail_data   函数是查询账户资金、持仓、委托成交的核心工具。

# 查询账户可用资金account_info = get_trade_detail_data(C.accountid, 'stock', 'account')available_cash = int(account_info[0].m_dAvailable)# 查询当前持仓positions = get_trade_detail_data(C.accountid, 'stock', 'position')holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID: i.m_nVolume for i in positions}holding_vol = holdings.get(C.stock, 0)

4、制定交易信号并下单

这是策略的决策环节。passorder   是QMT中最核心的下单函数,参数依次为(操作码、委托类型、账号、股票代码、报价方式、价格(-1表示市价)、数量、策略名等)。

# 金叉买入条件:当前无持仓,且快线上穿慢线if holding_vol == 0 and line1_mean > line2_mean:    # 计算买入数量(A股需为100股的整数倍)    vol = int(available_cash / close_list[-1] / 100) * 100    if vol >= 100: # 确保最小买入量        passorder(23, 1101, C.accountid, C.stock, 5, -1, vol, C)        print(f"金叉信号,买入{vol}股")# 死叉卖出条件:当前有持仓,且快线下穿慢线elif holding_vol > 0 and line1_mean < line2_mean:    passorder(24, 1101, C.accountid, C.stock, 5, -1, holding_vol, C)    print(f"死叉信号,卖出{holding_vol}股")

五、策略实盘运行须知

如果打算将策略投入实盘,有几个关键点需要注意:

1、运行模式切换

在模型交易界面加载策略后,策略运行模式有两种,模拟模式只会产生交易信号,不会真实下单。实盘模式策略才会真实下单。

2、交易模式选择

passorder函数有一个关键的quicktrade参数:

设为0(默认):为“逐K线生效”模式。信号会在K线结束时确认,并在下一根K线开始时发出,以模拟回测的逐K线效果。

设为2:为“立即下单”模式。信号产生后立刻发出委托,适用于需要及时响应的策略。

特别注意:使用立即下单模式时,用于记录委托状态的变量(如是否已报单)必须保存在自定义的全局变量或类实例中,不能保存在ContextInfo对象里。

3、风险控制

实盘下单需遵守交易所规则,例如股票交易有“价格笼子”限制,委托数量不可超过可用数量,否则会导致废单。

五、策略实盘运行须知

编写一个QMT双均线策略,可以概括为“配置初始化、数据勤获取、均线常计算、账户状态明、信号果断行”五个步骤。从简单的回测代码入手,理解每个函数和参数的作用,再逐步增加实盘所需的风控和状态管理逻辑,是掌握QMT策略开发的有效路径。 完整的回测与实盘示例代码,可以后台联系我获取:

注意:建议投资者务必确认自身风险承受能力及投资目标,国金证券不推荐投资目标不相符的投资者阅读本信息。智能交易可能因系统、通讯等原因无法正常使用或无法按照您的设置价格发出委托指令及完成成交,最终成交价格及数量以交易所、登记结算机构等记录为准。请密切关注交易回报情况及条件单设置情况。以上信息仅供参考,不构成对委托指令成交的承诺,不构成投资建议,不构成收益或避免损失的承诺。请您务必仔细阅读相关风险提示及协议,了解各类智能交易功能的区别及不同风险,审慎决策是否使用相关功能。投资有风险,入市需谨慎!

最新文章

随机文章