本文对应代码原贴 https://quantkt.com/forumDetail?id=201194这段时间沪深交易所再次征求意见,拟将主板ST股票的价格涨跌幅限制比例由5%调整为10%。这个去年已经征求过一次了,看来这次大概率是要提上日程了。对于大部分量化交易者来说,策略都会先过滤ST和退市股,倒是没有影响,对于部分有需求的策略则会需要改一下涨跌停的判断逻辑。关于涨跌停这一大A特色,无论是在实盘还是在回测系统中,对其的代码判断都非常重要,最经典的就是量化打板。
比如在回测中如果判断失误,会出现很高的风险,举个例子,当个股实际涨停,策略如果认为没涨停,会自认为“打板”可进,容易出现回测买地球的情况。
实盘的情况,如果对个股的涨跌停判断错误,则会出现涨停误认为没涨停将持仓卖出,或者跌停板上接盘的情况。
对于短线交易来说,一般来说新手尽量不要碰涨跌停股,都是高风险的信号,一般都对应着"诱多"或者"大利空"等。
具体原因可参考
科普:新手避雷,涨停板敢死队
科普:跌停板战法,新手避雷,年化-20
对于A股的涨跌停,很多人认为就是简单的10%和-10%,实际上规则远比此复杂。
以上表格方便参考,比如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日不设置涨跌幅限制。
| | | | |
|---|
| 科创板 | 始终 | | | |
| 创业板 | 2020-08-24 前 | | | |
| 2020-08-24 后 | | | |
| 北交所 | 始终 | | | |
| 主板 | 2023-04-10 前 | | | |
| 2023-04-10 ~ 至今 | | | |
| (征求意见中) | | ±10% | |
以上是我让AI整理的历史变化表格,可做参考,对于更早期的规则会更复杂,考虑到市场这些年的风格变化,一般我们也不会考虑太久前的数据。
各类代码教程与视频演示放于宽客堂量化平台https://quantkt.com
现阶段渠道开户福利(万0.8,etf万0.5)解锁平台会员,获取量化系统教程与各类量化框架
量化学习交流群和相关教程与开户联系平台管理员quantkt获取