在量化投资的完整生命周期中,我们通常会经历数据获取、指标计算、策略构建、历史回测和可视化等多个阶段。然而,当策略在历史数据上表现优异,并在实盘中生成了明确的交易信号时,如何快速、准确地执行交易往往成为个人开发者面临的痛点。
手动下单不仅存在延迟,还容易受到情绪干扰。为了解决从“策略信号”到“实际交易”的最后一公里问题,开源社区提供了一个实用的技术探索工具——easytrader。
目前,该项目在 GitHub 上获得了较多关注(约 9.7k+ Stars),它允许开发者通过 Python 代码对交易客户端进行控制,以实现自动化下单及账户查询。
项目地址:https://github.com/shidenggui/easytrader
协议:MIT License
一、 ⚠️ 重要风险提示与合规说明
在介绍任何自动化交易工具之前,必须首先强调风控与合规。程序化交易直接涉及资金安全,请务必知悉以下风险:
资金损失风险:代码中的逻辑缺陷、网络延迟、客户端卡顿或券商系统异常,均可能导致重复下单、漏下单或异常方向交易,从而造成不可逆的真金白银亏损。
合规性与技术风险:easytrader 早期主要通过模拟客户端的 UI 操作(如点击、输入)来实现交易。这种方式属于灰色地带,且极其依赖客户端版本的稳定性,一旦软件更新界面,自动化脚本可能瞬间失效。
合规建议:相比于模拟操作,更推荐使用券商官方提供的合规量化接口(如 miniQMT)。在任何实盘运行前,建议在模拟盘中进行至少 1-3 个月的充分测试,并从极小资金开始验证,同时必须在代码中加入严格的硬止损和异常报警机制。
二、 easytrader 的核心功能与通道对比
easytrader 的设计初衷是提供统一的 API 接口,用以驱动不同的交易通道。其主要功能包括:
基础交易:支持 A 股的限价/市价买入与卖出。
账户管理:支持查询账户可用余额、当前持仓、今日委托、今日成交。
订单控制:支持根据委托编号自动撤单。
信号跟踪:支持跟踪 JoinQuant(聚宽)、RiceQuant(米筐)的模拟信号或雪球组合的调仓动作。
交易通道对比
| 交易方式 | 实现原理 | 合规性与稳定性 | 推荐度 |
| miniQMT | 券商官方 API 接口直接通信 | ✅ 官方合规,速度快,运行稳定 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 同花顺客户端 | 通过 pywinauto 模拟鼠标键盘操作 | ⚠️ 依赖本地 Windows 环境,易因客户端更新失效 | ⭐⭐ |
| 雪球组合 | 模拟网页/App 协议跟踪组合调仓 | ✅ 适合模拟盘跟踪,无法直接用于真实证券账户 | ⭐⭐⭐ |
三、 环境安装与快速上手
1. 安装库
在终端中执行以下命令安装:
2. 基础用法:连接同花顺客户端(模拟操作)
若使用同花顺客户端方式,需要确保是在 Windows 系统下,且同花顺客户端处于登录并运行状态。
import easytrader# 初始化并连接本地已登录的同花顺客户端交易程序user = easytrader.use('ths')user.connect(r'C:\同花顺\xiadan.exe') # 替换为您本地的交易程序路径# 1. 获取账户基本信息balance = user.balanceprint("账户资金状况:", balance)# 2. 查询当前持仓positions = user.positionprint("当前持仓:", positions)# 3. 提交限价委托# 买入 平安银行 1000 股,价格 10.5 元user.buy('000001', price=10.5, amount=1000)# 卖出 平安银行 500 股,价格 11.0 元user.sell('000001', price=11.0, amount=500)# 4. 撤单操作# 先获取今日委托entrusts = user.entrustprint("今日委托列表:", entrusts)# 根据委托编号进行撤单# user.cancel_entrust('你的委托编号')
3. 推荐用法:接入券商官方 miniQMT
miniQMT 是目前量化个人投资者较为推崇的合规通道。通过 easytrader 接入 miniQMT,代码结构保持高度一致,但执行速度和稳定性将大幅提升。
import easytrader# 指定使用 miniqmt 驱动user = easytrader.use('miniqmt')# 连接本地极简版客户端(需要券商开通相关权限并运行客户端)user.connect( xt_path=r'C:\国金证券QMT\bin.x64', # 替换为实际的 QMT 路径 account='你的资金账号')# 后续的交易与查询 API 与上方保持一致positions = user.positionprint(positions)
四、 高级特性:同步第三方模拟盘信号
对于习惯在第三方平台(如聚宽、雪球)运行模拟策略的开发者,easytrader 提供了方便的跟单接口。
1. 跟踪 JoinQuant 模拟信号
import easytraderuser = easytrader.use('ths')user.connect(r'C:\同花顺\xiadan.exe')# 每隔 60 秒检测一次指定的聚宽模拟策略,一旦产生调仓信号则在本地自动同步user.follow( 'joinquant', strategy_id='您的策略ID', track_interval=60)
2. 跟踪雪球组合调仓
import easytraderuser = easytrader.use('xq')# 跟踪特定的雪球组合user.follow( 'xueqiu', portfolio_code='ZH123456', # 替换为目标雪球组合代码 track_interval=60)
五、 实战串联:从行情计算到自动下单的完整闭环
为了展示如何将这一环节融入到日常量化研究中,我们可以将数据源获取、技术指标计算与自动化交易结合,构建一个极简的闭环示例。
注:以下策略仅作为技术链路演示,不构成任何投资建议。
import akshare as akimport pandas_ta as taimport easytraderimport timedef run_strategy_flow(): # 1. 获取日线历史数据 (以平安银行 000001 为例) df = ak.stock_zh_a_hist( symbol="000001", period="daily", start_date="20260101", adjust="qfq" ) df.columns = ['date', 'open', 'close', 'high', 'low', 'vol', 'amount', 'amp', 'pct', 'chg', 'turn'] # 2. 利用 pandas_ta 计算 RSI 与 MACD 指标 df.ta.rsi(length=14, append=True) df.ta.macd(append=True) # 获取最新一根 K 线的数据 last_row = df.iloc[-1] current_close = last_row['close'] rsi_val = last_row['RSI_14'] macd_hist = last_row['MACDh_12_26_9'] print(f"当前收盘价: {current_close}, RSI(14): {rsi_val:.2f}, MACD_Hist: {macd_hist:.4f}") # 3. 制定简单的逻辑信号 signal = 'HOLD' if rsi_val < 30 and macd_hist > 0: signal = 'BUY' elif rsi_val > 70: signal = 'SELL' # 4. 信号执行 (这里以 miniQMT 示例) if signal == 'BUY': print("触发买入信号,正在下单...") user = easytrader.use('miniqmt') user.connect(xt_path=r'C:\QMT\bin.x64', account='YOUR_ACCOUNT') # 限价买入 100 股 user.buy('000001', price=current_close, amount=100) print("✅ 买入指令已发送") elif signal == 'SELL': print("触发卖出信号,正在下单...") user = easytrader.use('miniqmt') user.connect(xt_path=r'C:\QMT\bin.x64', account='YOUR_ACCOUNT') # 限价卖出 100 股 user.sell('000001', price=current_close, amount=100) print("✅ 卖出指令已发送") else: print("维持现状,不进行交易操作。")if __name__ == "__main__": run_strategy_flow()
六、 项目配套生态与局限性
配套生态
除了交易执行,作者还开源了两个相辅相成的项目:
easyquotation:用于实时获取 A 股行情(支持新浪、腾讯等源)。
easyquant:一个简单的事件驱动量化交易框架,将行情获取与 easytrader 的交易执行整合在了一起。
局限性说明
系统环境限制:若采用同花顺客户端模拟方式,必须在 Windows 物理机或云服务器上运行,无法在 Linux 纯无头(Headless)环境下直接运行。
界面变动敏感:模拟操作极易因同花顺等客户端的版本升级、弹窗打扰(如升级提示、活动弹窗)而失效,需要开发者定期维护并处理弹窗。
缺乏内置风控:easytrader 仅是一个底层的“执行器”,不带有资金比例控制、单笔上限、异常熔断等风控功能。这些逻辑必须由开发者在自己的上层策略代码中严密实现。
七、 结语
easytrader 为个人量化爱好者提供了一条低门槛连接实盘的通道。但在实际操作中,“自动交易”并不等同于“自动盈利”。糟糕的策略配合高频的自动交易,只会加速本金的磨损。
建议有志于实盘自动化的朋友,先从模拟盘或极小资金的合规接口(如 miniQMT)开始探索,不断优化系统容错率与异常处理机制,敬畏市场,稳健前行。
免责声明:本文仅作为开源技术项目的客观分享,不构成任何投资建议或要约。程序化交易具有高度风险,读者需对自身账户的资金安全与交易合规性承担全部责任。