量化交易听起来像是华尔街精英的专利?其实不然。迅投QMT极简版的出现,让普通投资者也能轻松踏入这个领域。作为国内券商广泛支持的量化交易平台,QMT极简版提供了完整的Python API接口,而无需你掌握C++或Java这类更复杂的编程语言。
对于Python初学者来说,QMT极简版API有三大优势:
想象一下,当你早上喝着咖啡,你的Python脚本已经在自动执行预设的交易策略——这种体验,现在通过不到50行代码就能实现。
在开始编写交易代码前,我们需要准备好以下工具:
安装完成后,确认你的用户目录下有userdata_mini文件夹,这是API需要访问的关键路径。
QMT极简版依赖几个核心库,通过pip一键安装:
bash复制pip install pandas xtquant
特别提醒:xtquant是迅投提供的专用库,安装时请确保来源可靠。
QMT API采用经典的事件驱动模型,主要由两部分组成:
python复制# 初始化交易接口
path = r'F:\gszqqmt\userdata_mini' # 替换为你的实际路径
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
# 创建账户对象
acc = StockAccount('你的资金账号') # 替换真实账号
# 注册回调处理器
callback = MyXtQuantTraderCallback()
xt_trader.register_callback(callback)
# 启动交易线程
xt_trader.start()
注意:session_id建议使用时间戳,确保每次运行都是独立会话
回调类需要继承XtQuantTraderCallback并实现关键方法:
python复制class MyXtQuantTraderCallback(XtQuantTraderCallback):
def on_stock_trade(self, trade):
print(f"成交回报: {trade.stock_code} 数量:{trade.volume}")
def on_order_error(self, order_error):
print(f"委托失败: {order_error.error_msg}")
主要回调事件包括:
让我们从一个最简单的限价买单开始:
python复制stock_code = '600519.SH' # 茅台股票代码
order_type = xtconstant.STOCK_BUY
price_type = xtconstant.FIX_PRICE
order_volume = 100 # 买入100股
price = 1800.00 # 限价1800元
# 发送订单
seq = xt_trader.order_stock(
acc, stock_code, order_type, order_volume,
price_type, price, '首次策略', '测试订单'
)
print(f"订单已提交,编号: {seq}")
发送委托后,可以通过订单号查询详细状态:
python复制# 查询特定订单
orders = xt_trader.query_stock_orders(acc, seq)
print(pd.DataFrame(orders))
# 查询当日所有委托
all_orders = xt_trader.query_stock_orders(acc)
结合回调机制,我们可以构建一个闭环交易系统:
python复制# 在回调类中添加持仓监控
def on_stock_position(self, position):
if position.stock_code == '600519.SH' and position.volume >= 100:
# 满足条件时触发卖出
sell_seq = xt_trader.order_stock(
acc, position.stock_code, xtconstant.STOCK_SELL,
position.volume, xtconstant.LATEST_PRICE, 0,
'止盈策略', '自动卖出'
)
完善的错误处理是自动化交易的关键:
python复制try:
connect_result = xt_trader.connect()
if connect_result != 0:
raise ConnectionError(f"连接失败,错误码: {connect_result}")
# 尝试心跳检测
if not xt_trader.query_account_status(acc):
raise Exception("账户状态异常")
except Exception as e:
print(f"系统异常: {str(e)}")
# 发送邮件或短信通知
notify_admin(str(e))
xt_trader.stop()
python复制# 批量查询优化示例
def batch_query_positions(xt_trader, acc, codes):
"""批量查询多个标的持仓"""
return {
code: xt_trader.query_stock_position(acc, code)
for code in codes
}
在回调类中加入基础风控逻辑:
python复制class RiskManagedCallback(MyXtQuantTraderCallback):
def __init__(self, max_loss=0.05):
self.max_loss = max_loss
self.position_values = {}
def on_stock_position(self, position):
# 实时计算持仓盈亏
current_price = get_market_data(position.stock_code)
position_value = current_price * position.volume
self.position_values[position.stock_code] = position_value
# 触发止损
if (position.cost_price - current_price)/position.cost_price > self.max_loss:
self.trigger_stop_loss(position.stock_code)
在将你的策略投入实盘前,请务必注意:
一个简单的日志记录实现:
python复制class TradeLogger:
def __init__(self, log_file='trades.csv'):
self.log_file = log_file
if not os.path.exists(log_file):
with open(log_file, 'w') as f:
f.write("时间,代码,方向,数量,价格,状态\n")
def log_trade(self, trade):
with open(self.log_file, 'a') as f:
f.write(
f"{datetime.now()},{trade.stock_code},"
f"{'买' if trade.order_type == xtconstant.STOCK_BUY else '卖'},"
f"{trade.volume},{trade.price},{trade.order_status}\n"
)
实际开发中,我发现最实用的调试方法是结合print日志和文件日志。当回调事件触发时,立即在控制台输出关键信息,同时将完整数据写入日志文件。这样既方便实时监控,又保留了完整的审计线索。