🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽策略结果如何与当前账户持仓比对,并通过自动化脚本调用同花顺闪电买卖并推送飞书?

joinquant | 发布时间: 2026/8/5
以下内容由 EasyQuant 生成。

问题描述

聚宽策略实盘跟单:如何将策略结果同步到同花顺执行交易?
如何使用聚宽策略结果与当前账户持仓进行比对,再通过自动化脚本调用同花顺闪电买卖,并将执行结果推送到飞书?

解决方案

在量化交易中,如何将聚宽(JoinQuant)的虚拟回测或模拟盘结果安全、高效地同步到个人实盘账户(如同花顺客户端)是一个常见痛点。由于聚宽目前不直接提供实盘交易通道,通常需要通过**“策略信号输出 -> 本地持仓比对 -> 自动化下单 -> 消息通知”**的链路来实现。

以下是实现该方案的完整架构与核心 Python 脚本指南:

一、 核心实现架构

  1. 策略信号导出:在聚宽策略的 after_trading_endmarket_open 阶段,使用 write_file 将目标持仓(或调仓信号)写入到聚宽的研究中,或通过 API 导出。
  2. 本地持仓比对:本地 Python 脚本读取聚宽的策略目标持仓,同时获取当前同花顺实盘账户的真实持仓,计算出交易差额(Target - Current)
  3. 同花顺闪电买卖:利用自动化工具(如 pywinautoEasyTrader 等开源库)模拟键盘鼠标操作,向同花顺客户端发送闪电买卖指令。
  4. 飞书推送:交易执行后,调用飞书 Webhook 机器人,将交易详情(标的、方向、数量、执行状态)实时推送到飞书群。

二、 核心步骤与 Python 代码实现

步骤 1:聚宽端导出目标持仓

在聚宽策略代码中,每日调仓完毕后,将最新的目标持仓比例或股数写入 CSV 文件:

import json

def after_trading_end(context):
    # 获取当前策略的所有多头持仓
    target_positions = {}
    for code, pos in context.portfolio.long_positions.items():
        target_positions[code] = pos.total_amount
    
    # 写入到研究根目录,供本地脚本下载读取
    write_file('target_positions.json', json.dumps(target_positions))
    log.info("目标持仓已导出")

步骤 2:本地持仓比对与同花顺下单脚本

在本地运行以下 Python 脚本。该脚本负责读取聚宽目标持仓,比对本地实盘持仓,并生成买卖差额:

import json
import requests

# 1. 模拟获取聚宽目标持仓(实际可通过聚宽 API 或下载研究文件获取)
def get_jq_target_positions():
    # 示例数据:{'000001.XSHE': 1000, '600519.XSHG': 100}
    # 实际应用中,可以使用 jqdatasdk 或直接读取导出的 json
    return {'000001.XSHE': 1000, '600519.XSHG': 100}

# 2. 获取同花顺当前真实持仓(需根据您使用的自动化交易库获取)
def get_ths_current_positions():
    # 示例数据:当前持有一半平安银行,无茅台
    return {'000001.XSHE': 500}

# 3. 计算交易差额
def calculate_order_diff(target, current):
    diff = {}
    all_codes = set(target.keys()).union(set(current.keys()))
    for code in all_codes:
        t_amt = target.get(code, 0)
        c_amt = current.get(code, 0)
        change = t_amt - c_amt
        if change != 0:
            diff[code] = change
    return diff

# 4. 飞书机器人推送函数
def push_to_feishu(webhook_url, content):
    headers = {"Content-Type": "application/json"}
    payload = {
        "msg_type": "text",
        "content": {
            "text": content
        }
    }
    try:
        response = requests.post(webhook_url, json=payload, headers=headers)
        return response.json()
    except Exception as e:
        print(f"飞书推送失败: {e}")

# 5. 主执行逻辑
def run_auto_trade():
    FEISHU_WEBHOOK = "https://open.feishu.cn/open-apis/bot/v2/hook/your_bot_id"
    
    target = get_jq_target_positions()
    current = get_ths_current_positions()
    trade_diff = calculate_order_diff(target, current)
    
    if not trade_diff:
        push_to_feishu(FEISHU_WEBHOOK, "[实盘同步] 今日策略持仓与实盘一致,无需调仓。")
        return
    
    report_lines = ["[实盘调仓执行报告]"]
    
    for code, volume in trade_diff.items():
        action = "买入" if volume > 0 else "卖出"
        abs_volume = abs(volume)
        
        # ---------------------------------------------------------
        # 此处调用您的同花顺自动化下单接口,例如 EasyTrader 或 pywinauto 模拟按键
        # ths_client.buy(code, price=None, amount=abs_volume) # 闪电买入
        # ---------------------------------------------------------
        
        execution_status = "成功"  # 实际应根据自动化接口返回值判断
        report_lines.append(f"标的: {code} | 操作: {action} | 数量: {abs_volume} | 状态: {execution_status}")
    
    # 推送结果到飞书
    push_to_feishu(FEISHU_WEBHOOK, "\n".join(report_lines))

if __name__ == "__main__":
    run_auto_trade()

三、 关键注意事项与风险提示

  1. T+1 限制与碎股处理:A股实行 T+1 交易制度。在比对持仓时,需注意今日买入的股票在同花顺中属于“不可卖出”状态。在计算 closeable_amount 时,应避免将今日刚买入的持仓纳入卖出差额计算。
  2. 滑点与限价保护:同花顺闪电买卖通常使用市价单或对手盘一档。为了防止科创板或创业板股票因流动性不足产生异常成交价,建议在自动化下单时设置保护价(如聚宽中的 MarketOrderStyle(limit_price) 逻辑)。
  3. 合规与安全风险:由于同花顺客户端未对第三方脚本开放官方 API,使用模拟按键(如 pywinauto)存在因客户端界面更新而失效的风险。请务必在实盘运行前在模拟环境(同花顺模拟盘)中进行充分测试。