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

聚宽自定义策略信号:如何根据均线关系绘制买卖和持仓标记?

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

问题描述

聚宽自定义策略信号:如何根据均线关系绘制买卖和持仓标记?
如何把聚宽策略中的均线趋势、买入、卖出、持仓和空仓条件转换为主图信号并进行回测验证?

解决方案

在聚宽(JoinQuant)量化交易平台上,直观地在回测图表中观察策略的买卖点和持仓状态,对于验证策略逻辑、排查Bug至关重要。我们可以利用聚宽内置的 record 函数,将均线趋势、买入、卖出、持仓和空仓等条件转换为主图信号并进行绘制。

以下是完整的策略实现方案与 Python 源码:

1. 核心逻辑设计

  • 均线计算:获取过去5天的收盘价,计算5日均值(MA5)。
  • 买入信号:当上一时间点价格高出5天平均价5%,且当前有可用现金时,触发买入,并在图表上标记买入价格。
  • 卖出信号:当上一时间点价格低于5天平均价95%,且当前持有该股票时,触发卖出,并在图表上标记卖出价格。
  • 持仓/空仓状态:通过 context.portfolio.positions 判断当前是否持有该股票,并在图表上输出持仓状态值(如持仓为1,空仓为0)。

2. 完整策略源码

# 导入聚宽函数库
import jqdata

# 初始化函数,设定要操作的股票、基准等等
def initialize(context):
    # 定义一个全局变量, 保存要操作的股票(以平安银行为例)
    g.security = '000001.XSHE'
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉比info级别低的log
    log.set_level('order', 'info')

# 每个单位时间(按天回测则每天调用一次)
def handle_data(context, data):
    security = g.security
    # 获取股票的收盘价历史数据
    close_data = attribute_history(security, 5, '1d', ['close'])
    # 取得过去五天的平均价格
    MA5 = close_data['close'].mean()
    # 取得上一时间点价格
    current_price = close_data['close'][-1]
    # 取得当前的现金
    cash = context.portfolio.available_cash
    
    # 初始化信号标记
    buy_signal = None
    sell_signal = None
    
    # 判断持仓状态
    is_holding = context.portfolio.positions[security].closeable_amount > 0
    position_status = 1 if is_holding else 0

    # 1. 买入逻辑
    if (current_price > 1.05 * MA5) and (cash > 0):
        # 用所有 cash 买入股票
        order_value(security, cash)
        log.info("Buying %s" % (security))
        buy_signal = current_price  # 记录买入价格信号
        
    # 2. 卖出逻辑
    elif (current_price < 0.95 * MA5) and is_holding:
        # 卖出所有股票,使这只股票的最终持有量为0
        order_target(security, 0)
        log.info("Selling %s" % (security))
        sell_signal = current_price  # 记录卖出价格信号

    # 3. 使用 record 函数将信号绘制到主图/副图
    # 注意:record 传入的参数会在回测结果页面的“自定义曲线”中展示
    record(
        stock_price=current_price, 
        ma5_line=MA5,
        buy_tag=buy_signal,
        sell_tag=sell_signal,
        holding=position_status
    )

3. 如何在回测中查看标记

  1. 将上述代码复制到聚宽的策略编辑器中。
  2. 选择回测时间段(建议选择1年以上以观察完整的牛熊周期)和初始资金,运行回测。
  3. 回测完成后,在回测结果页面中找到**“自定义曲线”**图表。
  4. 在该图表中,你可以看到:
    • stock_price(当前股价)与 ma5_line(5日均线)的实时走势对比。
    • buy_tagsell_tag 会在触发交易的当天显示具体的价格散点,直观呈现买卖点。
    • holding 曲线则以 0 和 1 的折线形式,清晰展示策略在历史时间轴上的持仓与空仓区间。