3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 A 股量化交易中,**集合竞价(9:15 - 9:25)**是主力资金试盘、表态的重要窗口。尤其是 9:25 产生的开盘集合竞价 Tick 数据,决定了股票当天的开盘价,其五档量价关系和累计成交量是捕捉强势股、龙头股“超预期开盘”的核心指标。
聚宽(JoinQuant)提供了专门的 API 函数 get_call_auction,支持获取指定时间区间内交易日 09:25 的集合竞价数据。本文将详细介绍该函数的使用方法,并给出一个实用的集合竞价选股策略框架。
get_call_auction 函数用于获取指定时间区间内交易日 09:25 的集合竞价数据。支持股票(2010年至今)、场内基金(2019年至今)等标的。
from jqdata import *
get_call_auction(security, start_date=None, end_date=None, fields=None)
security: 标的代码或标的代码组成的列表(如 '000001.XSHE' 或 ['000001.XSHE', '000002.XSHE'])。start_date: 开始日期,格式为 'YYYY-MM-DD',不可为 None。end_date: 结束日期,格式为 'YYYY-MM-DD',不可为 None。fields: 选择要获取的行情字段。若为 None,默认获取全部字段。支持的字段包括:
time: 时间(datetime)current: 当前价(即开盘价)volume: 累计成交量(股)money: 累计成交额b1_v ~ b5_v: 五档买量b1_p ~ b5_p: 五档买价a1_v ~ a5_v: 五档卖量a1_p ~ a5_p: 五档卖价返回一个 pandas.DataFrame,索引为默认的整数索引,包含 code 列及所选的 fields 字段。
以下代码展示了如何在研究环境或策略中,获取指定股票在特定日期的集合竞价五档量价数据:
from jqdata import *
# 定义查询标的和时间范围
security_list = ['000001.XSHE', '000002.XSHE']
start_dt = '2023-10-10'
end_dt = '2023-10-12'
# 获取包含五档买卖量价的完整集合竞价数据
fields_list = [
'time', 'current', 'volume', 'money',
'b1_v', 'b1_p', 'a1_v', 'a1_p'
]
df_auction = get_call_auction(security_list, start_date=start_dt, end_date=end_dt, fields=fields_list)
print(df_auction.head())
在实战中,我们经常寻找**“爆量高开”**的股票,即:
以下是基于 JoinQuant 策略引擎编写的简化版集合竞价选股策略:
import jqdata
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每天 09:26 运行选股,此时 09:25 的集合竞价数据已完全生成
run_daily(filter_stocks_by_auction, time='09:26')
def filter_stocks_by_auction(context):
today = context.current_dt.date()
# 获取沪深300成分股作为初始股票池
stocks = get_index_stocks('000300.XSHG', date=today)
# 1. 获取昨日收盘价与昨日成交量
last_df = history(1, '1d', 'close', security_list=stocks, df=True)
last_volume = history(1, '1d', 'volume', security_list=stocks, df=True)
# 2. 获取今日 9:25 集合竞价数据
auction_df = get_call_auction(stocks, start_date=today, end_date=today)
if auction_df.empty:
return
buy_list = []
for _, row in auction_df.iterrows():
code = row['code']
open_price = row['current']
auction_volume = row['volume']
if code not in last_df.columns:
continue
yesterday_close = last_df[code].iloc[-1]
yesterday_vol = last_volume[code].iloc[-1]
if yesterday_close <= 0 or yesterday_vol <= 0:
continue
# 计算高开幅度
open_pct = (open_price - yesterday_close) / yesterday_close
# 计算集合竞价成交量占比
volume_ratio = auction_volume / yesterday_vol
# 选股条件:高开 1.5% 到 4% 之间,且集合竞价成交量占比大于 1%
if 0.015 <= open_pct <= 0.04 and volume_ratio >= 0.01:
log.info(f"股票 {code} 满足条件:高开 {open_pct*100:.2f}%, 竞价量比 {volume_ratio*100:.2f}%")
buy_list.append(code)
# 后续可根据 buy_list 执行开盘买入逻辑
# ...
get_call_auction 的 end_date 参数不超过 context.current_dt 的当前日期,避免引入未来数据。get_call_auction 将无法获取到有效的当日成交量,需在策略中做好空值过滤。