🚀 AI 一键生成 joinquant 策略代码

如何用 JoinQuant 获取龙虎榜数据并构建跟随策略?

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

问题描述

如何获取龙虎榜数据,并找出知名游资买入的股票?

解决方案

在聚宽(JoinQuant)平台中,获取龙虎榜数据主要使用 get_billboard_list 函数。要找出知名游资买入的股票,你需要先定义一份“知名游资营业部”的名单,然后通过筛选龙虎榜数据中 sales_depart_name(营业部名称)字段来匹配。

以下是具体的实现步骤和完整的策略代码示例。

核心逻辑说明

  1. 获取数据:使用 get_billboard_list 获取指定日期的龙虎榜数据。通常在回测中,我们使用前一交易日(context.previous_date)的数据,因为龙虎榜数据是在收盘后公布的,用于指导当天的交易。
  2. 定义游资名单:你需要维护一个知名游资营业部的列表(如“华泰证券深圳益田路荣超商务中心”、“中信证券上海溧阳路”等)。
  3. 筛选数据
    • 筛选出营业部名称在你的名单中的记录。
    • 筛选出买入金额(buy_value)大于0 或者 净买入额(net_value)大于0 的记录。
  4. 执行交易:买入筛选出的股票,卖出不再持有的股票。

策略代码示例

# -*- coding: utf-8 -*-
from jqdata import *

def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 过滤掉order系列API产生的比error级别低的log
    log.set_level('order', 'error')
    
    # 设定手续费
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 定义知名游资营业部名单 (示例名单,需根据市场热点自行更新)
    g.famous_hot_money = [
        '华泰证券股份有限公司深圳益田路荣超商务中心证券营业部',
        '中信证券股份有限公司上海溧阳路证券营业部',
        '中国银河证券股份有限公司绍兴证券营业部',
        '国泰君安证券股份有限公司上海江苏路证券营业部',
        '华鑫证券有限责任公司上海分公司',
        '东方财富证券股份有限公司拉萨团结路第二证券营业部', # 散户大本营,有时也被视为一种合力
        '中信证券股份有限公司西安朱雀大街证券营业部'
    ]
    
    # 每天开盘时运行
    run_daily(market_open, time='09:30')

def market_open(context):
    # 1. 获取前一交易日的日期
    prev_date = context.previous_date
    
    # 2. 获取前一交易日的龙虎榜数据
    # stock_list=None 表示获取所有股票
    df = get_billboard_list(stock_list=None, end_date=prev_date, count=1)
    
    target_stocks = []
    
    if not df.empty:
        # 3. 筛选逻辑
        # 筛选营业部在我们的名单中的记录
        hot_money_df = df[df['sales_depart_name'].isin(g.famous_hot_money)]
        
        # 筛选买入金额大于0的记录 (即游资有买入行为)
        # 也可以修改为 net_value > 0 (净买入)
        buy_df = hot_money_df[hot_money_df['buy_value'] > 0]
        
        # 获取去重后的股票代码列表
        target_stocks = list(set(buy_df['code'].tolist()))
        
        log.info("昨日知名游资买入股票: %s" % target_stocks)
    else:
        log.info("昨日无龙虎榜数据或获取失败")

    # 4. 交易逻辑
    # 获取当前持仓
    current_holdings = list(context.portfolio.positions.keys())
    
    # 卖出不在目标列表中的股票
    for stock in current_holdings:
        if stock not in target_stocks:
            order_target_value(stock, 0)
    
    # 买入目标股票
    if len(target_stocks) > 0:
        # 简单的资金分配:等权买入
        cash_per_stock = context.portfolio.available_cash / len(target_stocks)
        for stock in target_stocks:
            order_value(stock, cash_per_stock)

代码解析

  1. get_billboard_list 函数

    • 这是获取龙虎榜数据的核心API。
    • end_date=prev_date, count=1 表示获取截止到前一交易日的一天数据。
    • 返回的 DataFrame 包含 code (代码), sales_depart_name (营业部名称), buy_value (买入金额), sell_value (卖出金额), net_value (净额) 等字段。
  2. g.famous_hot_money

    • 这是一个全局列表,存储了你关注的营业部名称。
    • 注意:营业部名称必须与聚宽数据中的名称完全一致(通常是全称)。你可以先打印 get_billboard_list 的结果来核对名称。
  3. 筛选条件

    • df['sales_depart_name'].isin(...):利用 Pandas 的功能快速筛选出特定营业部的行。
    • buy_value > 0:确保该营业部是买入方(龙虎榜有时也会显示卖出前五)。

注意事项

  • 数据滞后性:龙虎榜数据是盘后发布的,因此只能利用前一日的数据来指导今日的交易。
  • 游资名单变化:市场上的活跃游资席位经常更换,策略中的 g.famous_hot_money 列表需要定期维护和更新才能保持有效性。
  • 风险提示:龙虎榜策略属于事件驱动型策略,波动较大。游资买入并不代表股价一定上涨,有时可能是“一日游”行情,建议结合技术指标或基本面因子进行二次筛选。

Q&A

Q: 如何查看龙虎榜数据中具体的营业部名称格式?
A: 你可以在研究环境中运行 df = get_billboard_list(end_date='2023-01-01', count=1),然后打印 df['sales_depart_name'].unique() 来查看系统中存储的标准营业部名称格式。

Q: get_billboard_list 能获取实时的龙虎榜数据吗?
A: 不能。龙虎榜数据由交易所收盘后统一公布,聚宽通常在当天收盘后(约17:00-20:00)更新数据。因此回测和实盘中,通常是在T+1日使用T日的数据。

Q: 如何筛选净买入额(买入-卖出)大于1000万的游资股票?
A: 可以在代码筛选逻辑中增加条件:buy_df = hot_money_df[(hot_money_df['net_value'] > 10000000)]。注意 net_value 的单位是元。