问题描述
我看行情接口都需要传入股票代码,获取相关股票的行情数据。
那如何获取每日的涨停股票代码呢?
例如:传入日期:20200603,获取该交易日所有涨停的股票代码。
谢谢~~
ps:把全市场股票作为一个list传到security参数里面去的方式感觉不是很高效,所以想问下是否有别的简单点的接口。
解决方案
在 JoinQuant (聚宽) 平台上,目前确实没有直接命名为 get_limit_up_stocks 这样一键返回涨停股票列表的独立接口。
但是,您提到的**“把全市场股票作为一个list传到security参数里面去”**,在 JoinQuant 的底层架构中,恰恰是最推荐且最高效的做法。因为 get_price 接口在底层做了高度优化,一次性传入全市场 4000 多只股票代码获取单日数据,底层是通过 Pandas 的向量化操作和批量数据库查询实现的,耗时通常在零点几秒级别,远比用 for 循环单只股票去查要快得多。
以下是高效获取指定日期全市场涨停股票的具体实现方法:
高效获取涨停股票的 Python 源码
核心思路:获取全市场股票 -> 批量获取 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]}")
为什么这种方式是高效的?
- 减少网络 I/O 次数:将全市场股票打包成一个
list传给get_price,只发起一次数据请求。如果用循环,会发起 4000 多次请求,那才是真正的低效。 - Pandas 向量化计算:
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。 - ST股票:如果您想剔除 ST 股票,可以在
get_all_securities之后,结合get_extras('is_st', ...)接口进一步过滤。