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

如何将通达信公式转换为聚宽可运行的策略代码?(附 Python 源码)

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

问题描述

如何把通达信公式转换为聚宽可运行的策略代码?
将通达信技术指标公式迁移到聚宽时,如何用聚宽API重写指标计算、选股条件和交易执行逻辑?

解决方案

通达信公式转换为聚宽策略代码全指南

将通达信公式(通常为类 C 语言的简易脚本)转换为聚宽(JoinQuant)策略代码,本质上是将基于 K 线序列的隐式循环计算转换为基于 Python (Pandas/Numpy) 的显式数据处理与事件驱动交易逻辑

以下是完整的迁移与重写步骤:


一、 核心逻辑对照表

概念 通达信公式 聚宽 (JoinQuant) API / Python 备注
数据获取 隐式获取(如 CLOSE, HIGH attribute_historyget_bars 需指定标的、长度和频值
均线计算 MA(C, N) data['close'].mean()SecurityUnitData.mavg 聚宽提供内置技术指标库 jqlib.technical_analysis
区间极值 HHV(H, N), LLV(L, N) data['high'].max(), data['low'].min() 基于 Pandas DataFrame 滑动窗口
选股条件 FILTER(COND, N) Python 条件判断 + 股票池过滤 结合 get_index_stocks 等获取初始池
交易执行 BUY, SELL (仅评测) order, order_target, order_value 聚宽提供真实的模拟撮合引擎

二、 核心步骤:如何重写指标与逻辑

1. 数据准备与指标重写

通达信公式默认对当前图表标的进行计算。在聚宽中,你需要显式调用 API 获取历史数据。例如,通达信中的 MA(CLOSE, 5),在聚宽中重写为:

# 获取过去5天的收盘价
close_data = attribute_history(security, 5, '1d', ['close'])
# 计算5日均价
MA5 = close_data['close'].mean()

对于复杂的通达信指标(如 GDX 济安线),可以直接导入聚宽内置的 jqlib.technical_analysis 库进行调用。

2. 选股条件重写

通达信选股通常输出一个布尔值(如 CROSS(MA5, MA10))。在聚宽中,我们通常在 before_trading_starthandle_data 中,利用 Pandas 对整个股票池进行批量计算和筛选。

3. 交易执行重写

通达信公式无法直接控制实盘资金。聚宽提供了完整的账户对象 context.portfolio。你需要根据指标计算出的信号,调用 order_value(按价值下单)或 order_target(调仓到目标股数)来执行交易。


三、 实战案例:通达信均线金叉策略迁移

通达信原始公式:

MA5:=MA(CLOSE,5);
MA10:=MA(CLOSE,10);
金叉:=CROSS(MA5,MA10);
死叉:=CROSS(MA10,MA5);

聚宽 Python 策略重写:

import jqdata

def initialize(context):
    # 设定操作的股票:平安银行
    g.security = '000001.XSHE'
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 每天开盘时运行
    run_daily(market_open, time='every_bar')

def market_open(context):
    security = g.security
    
    # 1. 获取计算均线所需的历史收盘价(11天数据以计算10日均线及昨日交叉)
    close_data = attribute_history(security, 11, '1d', ['close'])['close']
    
    # 2. 计算当前与上一期的 MA5 和 MA10
    ma5_current = close_data[-5:].mean()
    ma5_previous = close_data[-6:-1].mean()
    
    ma10_current = close_data[-10:].mean()
    ma10_previous = close_data[-11:-1].mean()
    
    # 3. 编写 CROSS 交叉逻辑
    gold_cross = (ma5_previous <= ma10_previous) and (ma5_current > ma10_current)
    death_cross = (ma5_previous >= ma10_previous) and (ma5_current < ma10_current)
    
    # 获取当前可用资金与持仓
    cash = context.portfolio.available_cash
    keep_amount = context.portfolio.positions[security].closeable_amount
    
    # 4. 交易执行逻辑
    if gold_cross and cash > 0:
        # 金叉:全仓买入
        order_value(security, cash)
        log.info("金叉出现,买入 %s" % security)
    elif death_cross and keep_amount > 0:
        # 死叉:清仓卖出
        order_target(security, 0)
        log.info("死叉出现,卖出 %s" % security)

四、 迁移注意事项

  1. 未来函数避坑:通达信中常用 BACKSET 等含有未来数据的函数。在聚宽中编写策略时,请确保 set_option('avoid_future_data', True) 已开启,防止回测失真。
  2. 复权处理:通达信默认可能是不复权或前复权。聚宽强烈建议在 initialize 中调用 set_option('use_real_price', True) 开启真实价格(动态复权)模式,以确保回测与模拟盘的价格一致性。