3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
将通达信公式(通常为类 C 语言的简易脚本)转换为聚宽(JoinQuant)策略代码,本质上是将基于 K 线序列的隐式循环计算转换为基于 Python (Pandas/Numpy) 的显式数据处理与事件驱动交易逻辑。
以下是完整的迁移与重写步骤:
| 概念 | 通达信公式 | 聚宽 (JoinQuant) API / Python | 备注 |
|---|---|---|---|
| 数据获取 | 隐式获取(如 CLOSE, HIGH) |
attribute_history 或 get_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 |
聚宽提供真实的模拟撮合引擎 |
通达信公式默认对当前图表标的进行计算。在聚宽中,你需要显式调用 API 获取历史数据。例如,通达信中的 MA(CLOSE, 5),在聚宽中重写为:
# 获取过去5天的收盘价
close_data = attribute_history(security, 5, '1d', ['close'])
# 计算5日均价
MA5 = close_data['close'].mean()
对于复杂的通达信指标(如 GDX 济安线),可以直接导入聚宽内置的 jqlib.technical_analysis 库进行调用。
通达信选股通常输出一个布尔值(如 CROSS(MA5, MA10))。在聚宽中,我们通常在 before_trading_start 或 handle_data 中,利用 Pandas 对整个股票池进行批量计算和筛选。
通达信公式无法直接控制实盘资金。聚宽提供了完整的账户对象 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)
BACKSET 等含有未来数据的函数。在聚宽中编写策略时,请确保 set_option('avoid_future_data', True) 已开启,防止回测失真。initialize 中调用 set_option('use_real_price', True) 开启真实价格(动态复权)模式,以确保回测与模拟盘的价格一致性。