3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台上,要计算某只股票在当天封死涨停板的持续时间(分钟数),核心思路是获取该股票当天的分钟级行情数据,并统计收盘价(或最低价)等于当天涨停价的分钟数量。
以下是具体的实现思路和 Python 代码示例:
get_current_data() 获取目标股票当天的涨停价 (high_limit)。get_price() 或 attribute_history() 获取该股票当天的分钟级行情数据(通常取 close 或 low)。你可以将以下逻辑放在 handle_data 或定时运行的函数中(例如收盘后运行,以统计全天的数据)。
import jqdata
import pandas as pd
def initialize(context):
# 设定要统计的股票,例如平安银行
g.security = '000001.XSHE'
# 每天收盘后 15:10 运行统计函数
run_daily(calculate_limit_up_duration, time='15:10')
def calculate_limit_up_duration(context):
security = g.security
# 1. 获取当天的涨停价
current_data = get_current_data()
if security not in current_data:
log.info(f"无法获取 {security} 的当前数据")
return
high_limit = current_data[security].high_limit
# 2. 获取当天的分钟级数据 (一天最多 240 根分钟 K 线)
# 这里获取当天的 close 价格。如果要求严格封死(即该分钟内最低价也是涨停价),可以获取 'low'
df = get_price(security,
end_date=context.current_dt,
frequency='1m',
fields=['close', 'low'],
count=240,
skip_paused=True,
panel=False)
if df.empty:
log.info(f"{security} 今日无交易数据")
return
# 过滤出属于今天的数据(防止 count=240 取到昨天的数据,如果今天停牌或交易时间不足)
today_str = context.current_dt.strftime('%Y-%m-%d')
df = df[today_str]
# 3. 统计封住涨停的分钟数
# 考虑到浮点数精度问题,使用一个极小的值 (如 1e-4) 进行比较
# 严格封死:该分钟的最低价也等于涨停价
limit_up_minutes = df[abs(df['low'] - high_limit) < 1e-4]
duration = len(limit_up_minutes)
log.info(f"股票 {security} 今日涨停价为: {high_limit}")
log.info(f"股票 {security} 今日封死涨停的持续时间为: {duration} 分钟")
# 如果你想知道具体是哪些时间段封住的,可以打印 index
# if duration > 0:
# log.info(f"封板时间点: {limit_up_minutes.index.tolist()}")
==,因为浮点数精度问题可能导致判断失败。建议使用 abs(price - high_limit) < 1e-4。close 价等于涨停价,那说明这一分钟收盘在涨停板上,但盘中可能被打开过。low 价等于涨停价,那说明这一整分钟内价格死死钉在涨停板上,没有任何低于涨停价的成交,这是严格意义上的封死涨停。上面的代码示例使用了 low 来判断。get_price 传入 count=240 会获取最近 240 根分钟线。如果是在盘中运行(比如 14:00),它会取到昨天下午的数据。因此代码中加了一步 df = df[today_str] 来确保只统计今天的数据。通过这种方式,你就可以精确地计算出任何一只股票在一天内封死涨停板的分钟数了。