问题描述
我想实现涨停封死的时间,也就是说股价在涨停价上持续了多少分钟。大佬们求求了
解决方案
在 JoinQuant (聚宽) 平台上,要计算某只股票在当天封死涨停板的持续时间(分钟数),核心思路是获取该股票当天的分钟级行情数据,并统计收盘价(或最低价)等于当天涨停价的分钟数量。
以下是具体的实现思路和 Python 代码示例:
实现思路
- 获取涨停价:使用
get_current_data()获取目标股票当天的涨停价 (high_limit)。 - 获取分钟数据:使用
get_price()或attribute_history()获取该股票当天的分钟级行情数据(通常取close或low)。 - 统计时间:遍历这些分钟数据,统计价格等于(或极其接近)涨停价的分钟数。
Python 代码示例
你可以将以下逻辑放在 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()}")
关键点解析
- 浮点数比较:在 Python 中比较价格时,千万不要直接用
==,因为浮点数精度问题可能导致判断失败。建议使用abs(price - high_limit) < 1e-4。 - 严格封死 vs 触及涨停:
- 如果你只看
close价等于涨停价,那说明这一分钟收盘在涨停板上,但盘中可能被打开过。 - 如果你看
low价等于涨停价,那说明这一整分钟内价格死死钉在涨停板上,没有任何低于涨停价的成交,这是严格意义上的封死涨停。上面的代码示例使用了low来判断。
- 如果你只看
- 数据截取:
get_price传入count=240会获取最近 240 根分钟线。如果是在盘中运行(比如 14:00),它会取到昨天下午的数据。因此代码中加了一步df = df[today_str]来确保只统计今天的数据。
通过这种方式,你就可以精确地计算出任何一只股票在一天内封死涨停板的分钟数了。