3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台上,目前确实没有直接命名为 get_limit_up_stocks 这样一键返回涨停股票列表的独立接口。
但是,您提到的**“把全市场股票作为一个list传到security参数里面去”**,在 JoinQuant 的底层架构中,恰恰是最推荐且最高效的做法。因为 get_price 接口在底层做了高度优化,一次性传入全市场 4000 多只股票代码获取单日数据,底层是通过 Pandas 的向量化操作和批量数据库查询实现的,耗时通常在零点几秒级别,远比用 for 循环单只股票去查要快得多。
以下是高效获取指定日期全市场涨停股票的具体实现方法:
核心思路:获取全市场股票 -> 批量获取 close (收盘价)、high_limit (涨停价) 和 paused (停牌状态) -> 利用 Pandas 向量化筛选 close == high_limit 且未停牌的股票。
from jqdata import *
import pandas as pd
def get_limit_up_stocks(check_date):
"""
获取指定日期的所有涨停股票列表
:param check_date: 字符串日期,例如 '2020-06-03'
:return: 涨停股票代码的 list
"""
# 1. 获取指定日期还在上市的所有A股代码
all_stocks = list(get_all_securities(types=['stock'], date=check_date).index)
# 2. 批量获取这些股票在指定日期的收盘价、涨停价和停牌状态
# 强烈建议设置 panel=False,直接返回 DataFrame,处理速度极快
df = get_price(all_stocks,
end_date=check_date,
count=1,
fields=['close', 'high_limit', 'paused'],
panel=False)
# 3. 剔除停牌的股票 (paused == 1 表示停牌)
df = df[df['paused'] == 0]
# 4. 筛选收盘价等于涨停价的股票
# 考虑到浮点数精度问题,严谨起见可以判断差值极小,但在聚宽数据中直接用 == 通常也是可行的
# 这里使用 abs(close - high_limit) < 0.01 来避免浮点数精度坑
limit_up_df = df[abs(df['close'] - df['high_limit']) < 1e-4]
# 5. 提取股票代码并返回
limit_up_stocks = list(limit_up_df['code'])
return limit_up_stocks
# --- 测试代码 ---
# 在研究环境或回测中调用
date_to_check = '2020-06-03'
limit_up_list = get_limit_up_stocks(date_to_check)
print(f"{date_to_check} 涨停股票数量: {len(limit_up_list)} 只")
print(f"前10只涨停股: {limit_up_list[:10]}")
list 传给 get_price,只发起一次数据请求。如果用循环,会发起 4000 多次请求,那才是真正的低效。df['close'] == df['high_limit'] 这种操作在 Pandas 底层是 C 语言级别的数组运算,处理几千行数据连 1 毫秒都用不到。panel=False 参数:在 get_price 中指定 panel=False,API 会直接返回一个扁平化的 DataFrame,省去了构建复杂 Panel 结构的时间,内存占用更小,速度更快。handle_data 中)想获取当前时刻的涨停股,可以使用 get_current_data() 接口,遍历 context.universe,判断 current_data[stock].last_price == current_data[stock].high_limit。get_all_securities 之后,结合 get_extras('is_st', ...) 接口进一步过滤。