🚀 AI 一键生成 joinquant 策略代码

如何基于 JoinQuant 平台编写布林带突破交易策略?

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

问题描述

请帮我编写一个布林带策略,当价格触及下轨时买入,触及上轨时卖出。

解决方案

这是一个基于聚宽(JoinQuant)API编写的经典布林带(Bollinger Bands)均值回归策略。

策略逻辑

  1. 指标计算
    • 中轨:过去 N 天(通常为20天)的收盘价移动平均线。
    • 上轨:中轨 + K倍(通常为2倍)标准差。
    • 下轨:中轨 - K倍(通常为2倍)标准差。
  2. 交易信号
    • 买入:当当前价格跌破或触及下轨时,认为价格超跌,全仓买入。
    • 卖出:当当前价格突破或触及上轨时,认为价格超买,清仓卖出。

策略代码

# -*- coding: utf-8 -*-
import jqdata
import numpy as np

def initialize(context):
    """
    初始化函数,设定基准、股票池、参数等
    """
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # --- 策略参数设置 ---
    # 要操作的标的(这里以平安银行为例)
    g.security = '000001.XSHE'
    # 布林带计算周期 (通常为20日)
    g.n = 20
    # 布林带宽度参数 (通常为2倍标准差)
    g.k = 2
    
    # 设定每天开盘时运行
    run_daily(market_open, time='open')

def market_open(context):
    """
    每日开盘运行的策略逻辑
    """
    security = g.security
    
    # 1. 获取历史数据
    # 获取过去 g.n 天的收盘价数据(不包含今天,用于计算指标)
    # 注意:attribute_history 获取的是前复权数据
    hist_data = attribute_history(security, g.n, '1d', ['close'])
    
    # 如果数据不足(例如新股上市),则跳过
    if len(hist_data) < g.n:
        return
        
    close_prices = hist_data['close']
    
    # 2. 计算布林带指标
    # 计算中轨(均线)
    mid_line = close_prices.mean()
    # 计算标准差
    std = close_prices.std()
    # 计算上轨
    upper_line = mid_line + g.k * std
    # 计算下轨
    lower_line = mid_line - g.k * std
    
    # 3. 获取当前数据
    # 获取当天的开盘价作为当前价格进行判断(也可以改用收盘价或分钟级价格)
    current_data = get_current_data()[security]
    current_price = current_data.day_open
    
    # 获取当前账户资金和持仓
    cash = context.portfolio.available_cash
    position = context.portfolio.positions[security].total_amount
    
    # 4. 交易逻辑
    # 情况A: 价格跌破下轨,且当前无持仓 -> 买入
    if current_price <= lower_line and position == 0:
        # 全仓买入
        order_value(security, cash)
        log.info(f"价格({current_price})触及下轨({lower_line:.2f}),执行买入")
        
    # 情况B: 价格突破上轨,且有持仓 -> 卖出
    elif current_price >= upper_line and position > 0:
        # 清仓卖出
        order_target(security, 0)
        log.info(f"价格({current_price})触及上轨({upper_line:.2f}),执行卖出")
        
    # 5. 绘制图表(仅在回测结果页显示)
    # 记录价格和布林带轨道,方便回测后查看可视化效果
    record(Price=current_price, Upper=upper_line, Lower=lower_line, Mid=mid_line)

代码说明

  1. initialize: 初始化设置。这里设置了标的为平安银行(000001.XSHE),你可以根据需要修改 g.security 为其他股票代码或指数ETF代码。
  2. attribute_history: 获取过去20天的收盘价,这是计算布林带的基础。
  3. 指标计算: 利用 pandasmean()std() 方法快速计算均值和标准差。
  4. order_value / order_target: 聚宽的下单函数。order_value 用于按金额买入,order_target 用于调整持仓到指定数量(设为0即为清仓)。
  5. record: 这个函数会在回测结果的图表中画出布林带的三条线和股价,非常有助于验证策略是否按预期执行。

注意事项

  • 回测频率:此代码使用的是 run_daily,即按日回测。如果你需要更精细的盘中触及即买入(例如分钟级),需要将逻辑移至 handle_data 并选择分钟级回测。
  • 风险提示:布林带策略属于震荡市策略。在单边剧烈上涨或下跌的趋势行情中,该策略可能会过早卖出(踏空)或在下跌途中过早买入(接飞刀)。实际使用时通常需要结合趋势指标(如MACD)进行过滤。