当前位置:首页>python>从零开始玩量化:如何用python+QMT完成量化交易?

从零开始玩量化:如何用python+QMT完成量化交易?

  • 2026-09-02 18:23:06
从零开始玩量化:如何用python+QMT完成量化交易?

从零开始用 Python + QMT 实现量化交易,可以按照以下步骤逐步操作,涵盖量化交易所需的环境准备、量化策略编写、策略回测到实盘运行的全流程。

一、环境准备:安装 QMT 并熟悉基础界面

1、QMT安装

这里以模拟盘为例,QMT下载地址,测试账号上方联系作者获取。操作系统要求:操作系统win10及以上 64(不限制虚拟机和云服务器),下载安装包后开始安装:

2、下载python库

安装好后,用测试账号登录QMT,使用前第一步就是先下载python库:我的→下载python库→python库下载→重启客户端【注意不要修改路径】

3、下载数据

安装完成Python库后,还需下载数据方可使用。QMT提供了多种数据下载接口。其客户端内置了直观的数据下载功能,特别是在批量下载模式下,支持设置定时任务,能便捷地实现每日最新行情数据的自动下载。

在创建我们的模型之前,我们需要再用客户端提供的“数据管理”功能,选择并补充模型所需的相应市场、品种以及对应周期的历史数据。

二、策略编写:从简单逻辑开始

以双均线策略为例,通过计算快慢双均线,在金叉时买入,死叉时做卖出。

代码示例:

#encoding:gbkimport pandas as pdimport numpy as npimport datetime"""示例说明:双均线策略,通过计算快慢双均线,在金叉时买入,死叉时做卖出"""class a():	passA = a() #创建空的类的实例 用来保存委托状态 #ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号def init(C):	A.stock= C.stockcode + '.' + C.market #品种为模型交易界面选择品种	A.acct= account #账号为模型交易界面选择账号	A.acct_type= accountType #账号类型为模型交易界面选择账号	A.amount = 10000 #单笔买入金额 触发买入信号后买入指定金额	A.line1=17   #快线周期	A.line2=27   #慢线周期	A.waiting_list = [] #未查到委托列表 存在未查到委托情况暂停后续报单 防止超单	A.buy_code = 23 if A.acct_type == 'STOCK' else 33 #买卖代码 区分股票 与 两融账号	A.sell_code = 24 if A.acct_type == 'STOCK' else 34	#设置股票池 订阅品种行情	C.set_universe([A.stock])	print(f'双均线实盘示例{A.stock}{A.acct}{A.acct_type} 单笔买入金额{A.amount}')def handlebar(C):	#跳过历史k线	if not C.is_last_bar():		return	now = datetime.datetime.now()	now_time = now.strftime('%H%M%S')	#跳过非交易时间	if now_time < '093000' or now_time > "150000":		return	account = get_trade_detail_data(A.acct, A.acct_type, 'account')	if len(account)==0:		print(f'账号{A.acct} 未登录 请检查')		return	account = account[0]	available_cash = int(account.m_dAvailable)	#如果有未查到委托 查询委托	if A.waiting_list:		found_list = []		orders = get_trade_detail_data(A.acct, A.acct_type, 'order')		for order in orders:			if order.m_strRemark in A.waiting_list:				found_list.append(order.m_strRemark)		A.waiting_list = [i for i in A.waiting_list if i not in found_list]	if A.waiting_list:		print(f"当前有未查到委托 {A.waiting_list} 暂停后续报单")		return	holdings = get_trade_detail_data(A.acct, A.acct_type, 'position')	holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}	#获取行情数据	data = C.get_history_data(max(A.line1, A.line2)+1, '1d', 'close',dividend_type='front_ratio')	close_list = data[A.stock]	if len(close_list) < max(A.line1, A.line2)+1:		print('行情长度不足(新上市或最近有停牌) 跳过运行')		return	pre_line1 = np.mean(close_list[-A.line1-1: -1])	pre_line2 = np.mean(close_list[-A.line2-1: -1])	current_line1 = np.mean(close_list[-A.line1:])	current_line2 = np.mean(close_list[-A.line2:])	#如果快线穿过慢线,则买入委托 当前无持仓 买入	vol = int(A.amount / close_list[-1] / 100) * 100 #买入数量 向下取整到100的整数倍	if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2:		#下单开仓 ,参数说明可搜索PY交易函数 passorder		msg = f"双均线实盘 {A.stock} 上穿均线 买入 {vol}股"		passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '双均线实盘', 1 , msg, C)		print(msg)		A.waiting_list.append(msg)	#如果快线下穿慢线,则卖出委托	if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:		msg = f"双均线实盘 {A.stock} 下穿均线 卖出 {holdings[A.stock]}股"		passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '双均线实盘', 1 , msg, C)		print(msg)		A.waiting_list.append(msg)

三、回测与优化:验证策略有效性

1、设置回测参数

在 QMT 客户端的 “回测设置” 中,选择回测时间范围(如过去 1 年)、初始资金、手续费率等。

2、运行回测并分析结果

回测完成后,查看关键指标:总收益率、年化收益率、最大回撤(策略最大亏损比例)、胜率(盈利交易占比)、夏普比率(单位风险的收益,越高越好)。

3、优化策略

根据回测结果调整参数(如均线周期、仓位比例),避免过度拟合(可分时间段回测,如用前 80% 数据训练,后 20% 数据验证)。

四、实盘运行:从模拟到实盘

先用 QMT 的 “模拟账号” 运行策略,验证实时行情下的逻辑是否正常(避免代码 bug 导致异常交易),验证无误后再进行实盘部署。

开通量化软件QMT/Ptrade,加入量化沟通群,了解更多量化内容扫描下方二维码咨询:

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

最新文章

随机文章