🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台如何编写高效的打板(追涨停)条件?

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

问题描述

打板条件怎么写?

打板条件怎么写比较好呢?目前我是写的涨幅9个点以上,但有一些冲到9个点后没有涨停就回落了。

解决方案

在量化交易中,打板(追涨停)策略的核心在于确定性。单纯以“涨幅大于9%”作为条件,很容易买到那些主力拉高出货、冲高回落(未封板或炸板)的股票。此外,A股市场有主板(10%)、ST股(5%)、创业板/科创板(20%)之分,固定9%的涨幅并不通用。

为了提高打板的成功率,建议从以下几个维度优化您的打板条件,并结合 JoinQuant 的 API 进行实现:

1. 使用真实的涨停价进行比较

不要自己计算涨幅,而是直接获取交易所规定的当日涨停价。在 JoinQuant 中,可以使用 get_current_data() 获取当天的 high_limit(涨停价)和 last_price(最新价)。

优化条件:当最新价距离涨停价只有 1~2 分钱,或者达到涨停价的 99% 时才触发买入,这样能最大程度确认资金封板的意愿。

2. 增加时间过滤

通常来说,早盘(9:30 - 10:30)迅速封死涨停的股票,次日溢价率较高;而午后特别是尾盘的拉升,诱多和炸板的概率较大。可以限制只在特定时间段内打板。

3. 结合成交量或均线过滤

冲高回落往往是因为上方抛压重或跟风盘不足。可以加入条件:当日成交量显著放大,且股价在均线(如 MA5、MA10)之上,处于多头排列。


JoinQuant 分钟级打板策略代码示例

以下是一个在分钟级别运行的打板逻辑示例,它解决了固定9%涨幅的缺陷,并加入了时间过滤:

import jqdata

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    
    # 设置股票池(示例:选取部分股票)
    g.stocks = ['000001.XSHE', '000002.XSHE', '000063.XSHE']
    g.daily_buy_count = 3
    
    # 每天开盘前清空今日已买列表
    run_daily(before_market_open, time='09:00')

def before_market_open(context):
    g.today_bought_stocks = set()

# 分钟级运行
def handle_data(context, data):
    # 1. 时间过滤:只做早盘 9:30 到 10:30 的板,避开尾盘诱多
    if context.current_dt.hour >= 11:
        return
        
    if len(g.today_bought_stocks) >= g.daily_buy_count:
        return
        
    # 获取当前时刻的盘面数据(包含涨停价和最新价)
    current_data = get_current_data()
    
    for security in g.stocks:
        if security in g.today_bought_stocks:
            continue
            
        # 获取最新价和涨停价
        last_price = current_data[security].last_price
        high_limit = current_data[security].high_limit
        paused = current_data[security].paused
        
        if paused:
            continue
            
        # 2. 核心打板条件:
        # 方案A:距离涨停价不到 2 分钱(极度逼近涨停)
        # condition = (high_limit - last_price <= 0.02)
        
        # 方案B:价格达到涨停价的 99% 以上(适用于不同板块)
        condition = (last_price >= high_limit * 0.99)
        
        # 还可以加入昨日收盘价的判断,确保今天确实是大阳线(排除一字板等情况)
        # last_close = attribute_history(security, 1, '1d', ['close'])['close'][0]
        
        if condition:
            cash = context.portfolio.available_cash
            buy_cash = cash / (g.daily_buy_count - len(g.today_bought_stocks))
            
            order_value(security, buy_cash)
            g.today_bought_stocks.add(security)
            log.info(f"打板买入 {security},最新价:{last_price},涨停价:{high_limit}")
            
            if len(g.today_bought_stocks) >= g.daily_buy_count:
                break

进阶:Tick 级盘口打板

如果你有 JoinQuant 的 Tick 级回测权限,打板逻辑可以更加极致。你可以监控买一(b1_v)的挂单量。当价格触及涨停价,且买一挂单量瞬间放大到某个阈值(例如几万手)时,跟随排队买入。这需要使用 get_current_tick()handle_tick 函数。

总结

  1. 放弃硬编码的 涨幅 > 9%,改用 last_price >= high_limit * 0.99high_limit - last_price <= 0.02
  2. 结合 get_current_data() 动态获取每只股票当天的真实涨停价。
  3. 配合早盘时间段过滤,能有效减少冲高回落吃大面的概率。