当前位置:首页>python>Python代码判断个股是否涨跌停和涨跌停规则变化历史

Python代码判断个股是否涨跌停和涨跌停规则变化历史

  • 2026-09-10 18:00:08
Python代码判断个股是否涨跌停和涨跌停规则变化历史
本文对应代码原贴 https://quantkt.com/forumDetail?id=201194
这段时间沪深交易所再次征求意见,拟将主板ST股票的价格涨跌幅限制比例由5%调整为10%。
这个去年已经征求过一次了,看来这次大概率是要提上日程了。
对于大部分量化交易者来说,策略都会先过滤ST和退市股,倒是没有影响,对于部分有需求的策略则会需要改一下涨跌停的判断逻辑。

关于涨跌停这一大A特色,无论是在实盘还是在回测系统中,对其的代码判断都非常重要,最经典的就是量化打板。

比如在回测中如果判断失误,会出现很高的风险,举个例子,当个股实际涨停,策略如果认为没涨停,会自认为“打板”可进,容易出现回测买地球的情况。

实盘的情况,如果对个股的涨跌停判断错误,则会出现涨停误认为没涨停将持仓卖出,或者跌停板上接盘的情况。

对于短线交易来说,一般来说新手尽量不要碰涨跌停股,都是高风险的信号,一般都对应着"诱多"或者"大利空"等。

具体原因可参考

科普:新手避雷,涨停板敢死队

科普:跌停板战法,新手避雷,年化-20

对于A股的涨跌停,很多人认为就是简单的10%和-10%,实际上规则远比此复杂。

板块 / 类型
代码特征
日常涨跌幅
新股前 N 日
ST/*ST 涨跌幅
备注
沪 / 深主板
60xxxx.SH / 00xxxx.SZ
±10%
前 5 日无限制
5%(现行)
上交所拟改为 10%(征求意见中)
创业板
30xxxx.SZ
±20%
前 5 日无限制
±20%
ST/ST 依然 20%
科创板
688xxx.SH
±20%
前 5 日无限制
±20%
ST/*ST 依然 20%
北交所
8xxxx.BJ / 4xxxx.BJ
±30%
首日无限制
±30%
ST/*ST 依然 30%

以上表格方便参考,比如10%,则对应了*1.1和*0.9,对于沪市深市都是四舍五入后保留两位小数。

值得注意的是,北交所个股是*1.3和*0.7,但是不是保留两位小数,而是涨停取低,跌停取高,即涨停向下取保留2位小数,跌停向上取保留2位小数,即始终要保证不超过30%的振幅。

对于ST和*ST的判断,需要获取个股的名称,字符串匹配是否有ST字段,对于退市股,则需要匹配是否有退字。

获取个股的涨跌停价格

对于QMT,可以直接使用ContextInfo.get_instrumentdetail函数获取个股的涨跌停价格。

info=ContextInfo.get_instrumentdetail(stockID)UpStopPrice=info['UpStopPrice']DownStopPrice=info['DownStopPrice']

其中UpStopPrice和DownStopPrice字段对应了个股的涨停价和跌停价。

如果想自己写涨跌停判断的话。

这边给一下各板块判断和涨跌幅计算的核心代码

# ========== 板块判断 ==========def is_star_market(code):return bool(re.match(r'68\d{4}\.SH', code))def is_gem(code):return bool(re.match(r'3\d{5}\.SZ', code))def is_main_board(code):return bool(re.match(r'(60|00)\d{4}\.(SH|SZ)', code))def is_bj(code):return bool(re.match(r'\d{6}\.BJ', code))# ========== 价格取整 ==========def round_price_normal(x):if x == float('inf') or x == float('-inf'):return xreturnfloat(Decimal(x + 1e-7).quantize(Decimal('1.00'), ROUND_HALF_UP))def round_price_bj(limit_up, limit_down):    limit_up_rounded = math.floor(limit_up * 100) / 100    limit_down_rounded = math.ceil(limit_down * 100) / 100return limit_up_rounded, limit_down_rounded# ========== 计算涨跌停 ==========def calculate_limit_prices(pre_close, code, name=''):    is_st = 'ST'in name if name else Falseif is_star_market(code):        lu = pre_close * 1.2        ld = pre_close * 0.8return round_price_normal(lu), round_price_normal(ld)elif is_gem(code):        lu = pre_close * 1.2        ld = pre_close * 0.8return round_price_normal(lu), round_price_normal(ld)elif is_bj(code):        lu = pre_close * 1.3        ld = pre_close * 0.7return round_price_bj(lu, ld)elif is_main_board(code):if is_st:            lu = pre_close * 1.05            ld = pre_close * 0.95else:            lu = pre_close * 1.1            ld = pre_close * 0.9return round_price_normal(lu), round_price_normal(ld)else:return round_price_normal(pre_close * 1.1), round_price_normal(pre_close * 0.9)

注意的是,ST的规则只对主板有效,即60开头和00开头的,对于其它板块则没有这个规则,后续新规出现后,主板ST的涨跌幅度也需要相应改动。

如果在回测系统中,想做的好的话,那就是个比较复杂的东西了。

因为创业板在2020-8-24前后的涨跌幅是不一样的,创业注册制之前是10%,ST是5%。

历史情况:

对于新股,2023年4月10日之前的规则是,新股首日44%上限,-36%下限,现在则是新股上市前5日不设置涨跌幅限制。

板块
时间段
普通股票
ST/*ST 股票
新股前 5 日
科创板始终
±20%
±20%
不设限
创业板2020-08-24 前
±10%
±5%
首日 44%,第 2 日起 ±10%
2020-08-24 后
±20%
±20%
不设限
北交所始终
±30%
±30%
不设限
主板2023-04-10 前
±10%
±5%
首日 44%,第 2 日起 ±10%
2023-04-10 ~ 至今
±10%
±5%
不设限
(征求意见中)
±10%
±10%
不设限

以上是我让AI整理的历史变化表格,可做参考,对于更早期的规则会更复杂,考虑到市场这些年的风格变化,一般我们也不会考虑太久前的数据。

各类代码教程与视频演示放于宽客堂量化平台https://quantkt.com

现阶段渠道开户福利(万0.8,etf万0.5)解锁平台会员,获取量化系统教程与各类量化框架

量化学习交流群和相关教程与开户联系平台管理员quantkt获取

最新文章

随机文章