VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 419
声望: 171

期货集合竞价时间期货集合竞价规则
大多数投资者每天的交易都是从集合竞价开始的,并且很多投资者还会参与到其中来,那么期货集合竞价时间和集合竞价规则到是什么呢?

一、什么是期货的集合竞价

集合竞价指在每个期货交易日开市前的规定时间里,由期货交易者按照自己所能接受的价格进行买卖申报。

description

二、期货集合竞价的时间和规则

每一交易日开市前5分钟内,前4分钟为投资者对期货合约买、卖价格指令申报时间,后1分钟为集合竞价撮合时间,集合竞价产生的价格即为开盘价,随即在行情栏中显示。
这里需要注意: .
①集合竞价只能使用限价指令申报,不能使用市价指令。
②日盘品种(指无夜盘的品种)的集合竞价时间是8:55-8:59.夜盘品种的集合竞价时间是20:55-20:59.有夜盘的品种日盘不再进行集合竞价。
③集合竞价期间的申报价格盘面是不显示的,只能根据自己的预判进行申报,申报价格范围为上一交易日结算价的涨跌停板价。

description

                                                股指期货时间轴

description

                                                 国债期货时间轴

三、集合竞价产生的原理

国内期货交易所均采用计算机撮合成交方式,指交易所的计算机交易系统对交易双方的交易指令进行配对的过程,按价格优先、时间优先的原则进行配对,以此价格成交能够
得到最大成交量。
首先,交易系统分别对所有有效的买入申报按申报价由高到低的顺序排列,申报价相同的按照进入系统的时间先后排列;所有有效的卖出申报按申报价由低到高的顺序排列,申报价相同的按照进入系统的时间先后排列。
接下来,交易系统依此逐步将排在前面的买入申报和卖出申报配对成交,直到不能成交为止。

四、集合竞价举例详解

假定,某合约申报排序如下表所示(最小变动价为1元)。

description

集合竞价申报顺序表
配对情况为:
①排序为1的买进价高于排序为1的卖出价,成交30手;
②排序为1的买进价还有20手没成交,由于比排序为2的卖出价高,继续成交20手;
③排序为2的卖出价还有40手没成交,由于比排序为2的买进价低,继续成交40手;
④排序为2的买进价还有50手没成交,由于比排序为3的卖出价高,成交50手;
⑤排序为3的卖出价还有70手没成交,由于比排序为3的买进价高,显然无法成交。
这样,最终的开盘价就是2588元,在此价位上成交140手(30+20+40+50=140.如按双边计算则是280手)。
申报指令的撮合成交原理为:
①高于集合竞价产生的价格的买入申报全部成交;
②低于集合竞价产生的价格的卖出申报全部成交;
③等于集合竞价产生的价格的买入或卖出申报,根据买入申报量和卖出申报量的多少,按少的一方的申报量成交。
拿玉米C1901来举例:

description

玉米合约申报价格列表
假设集合竞价最后产生的开盘价是1460.
则对于买单,根据“高于集合竞价产生的价格的买入申报全部成交”原则,1461和1462的买入单都成交;
对于卖单,根据“低于集合竞价产生的价格的卖出申报全部成交”原则,1459和1458的卖出单都成交;
而等于1460的买入或卖出单,原则是:根据买入申报量和卖出申报量的多少,按少的一方的申报量成交。该例子中,1460买入 是20手,卖出是30手,故撮合成交20手,卖出单
有10手没有撮合成交。
集合竞价撮合成交期间的未成交申报单在开市后自动参与连续竞价交易,当天若未成交,结算时则会自动撤单。

五、另附:A股的竞价规则

A股的竞价分为集合竞价和连续竞价两个部分,集合竞价是决定开盘和深市收盘两个价格的重要部分,正因为如此,根据《上市公司股东、董监高减持股份的若干规定》,持股5%以上的大股东进行减持的,三个月内通过集合竞价交易减持的不得超过公司总股本的1%、半年2%,一年不得超过4%,这是一个量的规定。

5.1 准确的交易时间

沪市:上午9:15-9:25集合竞价,上午9:30-11:30和下午13:00-14:57连续交易时间,14:57-15:00为收盘集合竞价时间;

深市:上午9:15-9:25集合竞价,上午9:30-11:30和下午13:00-14:57连续交易时间,14:57-15:00为收盘集合竞价时间。

5.2 在A股市场,开盘价是由集合竞价确定,具体的竞价时间是开盘前的:

1.隔夜委托22:00-9:15
交易日前一晚上22:00-9:15之间的委托叫隔夜委托,即第一个交易日晚上规定时间之后就可以进行第二交易日的委托,委托会暂存在证券公司系统内,在第二天早上9:15分时报送到交易所主机,是由券商统一在集合竞价时间上报到交易所,这个上报的顺序理论上是不分时间,只管价格,但如果股票是涨跌停的,尤其是连续涨跌停的股票,比如新股和被执行风险警示的股票,价格是确定的,总还是有个时间的优先次序,这个时候股票委托按照“时间优先、数量优先、价格优先、大单先成交”的原则,所以如果第二天无论如何都要出来或者进去的,建议隔夜委托,特别是对于确定涨停的股票,在券商交易结算后,一般是22:00以后就下单委托。

2.竞价委托9:15-9:20
这个竞价时间是可以委托也是可以撤单的,其中隔夜委托的单子在这个时间也是可以撤掉的,但时间也就是这五分钟,所以要特别留意。

3.集合竞价9:20-9:25
这个竞价时间只能委托,但不能撤单了,截止到9:25分00秒,确定一个成交量最大的一个价格,就是开盘价,开盘价影响一天的价格,会记录在K线上面,所以非常重要。

4.封闭竞价9:25-9:30/11:30-13:00
这个时间表面上是可以委托和撤单的,但实际上你的所有委托都是暂时保存在券商系统里面,交易所在9:30统一接收,所以这个时间是封闭竞价时间,最终的开市价格由委托的单子撮合成交得出,所以开盘价格有两个:一个是集合竞价确定的开盘价,一个是撮合成交得出的开市价。而下午13:00的开市价格也是这么来的。

5.收盘竞价14:57-15:00
沪市和深市的开盘和收盘前都有一个竞价时间,以同一价格成交量最大化为确定原则。

Member
avatar
加入于:
帖子: 419
声望: 171

一、利用米筐找到有集合竞价的交易时间段

1.1 代码

import datetime
from rqdatac.utils import to_date
import rqdatac as rq

if __name__ == "__main__":
     def test():
        symbols = ['rb2110','sr2109','ag2106','ap2110','IF2105']
        date0 = datetime.date(2021,4,29)
        for symbol in symbols:
            ths = rq.get_trading_hours(order_book_id=symbol.upper(),date=date0,frequency='tick',expected_fmt='datetime')
            print(f"{symbol} 的交易时间段:")
            for th in ths:
                print(f"    ths={th}")

    # 初始化米筐接口 
    rq.init('xxxxxx','xxxxxx',("rqdatad-pro.ricequant.com",16011)) # 用自己的米筐账户和密码

    test()

1.2 执行结果

各个合约的交易时间段:

rb2110 的交易时间段:
    ths=[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 28, 23, 0)]
    ths=[datetime.datetime(2021, 4, 29, 9, 0), datetime.datetime(2021, 4, 29, 10, 15)]
    ths=[datetime.datetime(2021, 4, 29, 10, 30), datetime.datetime(2021, 4, 29, 11, 30)]
    ths=[datetime.datetime(2021, 4, 29, 13, 30), datetime.datetime(2021, 4, 29, 15, 0)]
sr2109 的交易时间段:
    ths=[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 28, 23, 0)]
    ths=[datetime.datetime(2021, 4, 29, 9, 0), datetime.datetime(2021, 4, 29, 10, 15)]
    ths=[datetime.datetime(2021, 4, 29, 10, 30), datetime.datetime(2021, 4, 29, 11, 30)]
    ths=[datetime.datetime(2021, 4, 29, 13, 30), datetime.datetime(2021, 4, 29, 15, 0)]
ag2106 的交易时间段:
    ths=[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 29, 2, 30)]
    ths=[datetime.datetime(2021, 4, 29, 9, 0), datetime.datetime(2021, 4, 29, 10, 15)]
    ths=[datetime.datetime(2021, 4, 29, 10, 30), datetime.datetime(2021, 4, 29, 11, 30)]
    ths=[datetime.datetime(2021, 4, 29, 13, 30), datetime.datetime(2021, 4, 29, 15, 0)]
ap2110 的交易时间段:
    ths=[datetime.datetime(2021, 4, 29, 9, 0), datetime.datetime(2021, 4, 29, 10, 15)]
    ths=[datetime.datetime(2021, 4, 29, 10, 30), datetime.datetime(2021, 4, 29, 11, 30)]
    ths=[datetime.datetime(2021, 4, 29, 13, 30), datetime.datetime(2021, 4, 29, 15, 0)]
IF2105 的交易时间段:
    ths=[datetime.datetime(2021, 4, 29, 9, 30), datetime.datetime(2021, 4, 29, 11, 30)]
    ths=[datetime.datetime(2021, 4, 29, 13, 0), datetime.datetime(2021, 4, 29, 15, 0)]

1.3 找到各个合约的前面带有集合竞价的交易时间段

看看上面各个合约的所有交易时间段,其中第一个交易时间段开始前就有交易时间段。
rb2110 的带有集合竞价的交易时间段:[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 28, 23, 0)]
sr2109 的带有集合竞价的交易时间段:[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 28, 23, 0)]
ag2106 的带有集合竞价的交易时间段:[datetime.datetime(2021, 4, 28, 21, 0), datetime.datetime(2021, 4, 29, 2, 30)]
ap2110 的带有集合竞价的交易时间段:[datetime.datetime(2021, 4, 29, 9, 0), datetime.datetime(2021, 4, 29, 10, 15)]
IF2105 的带有集合竞价的交易时间段:[datetime.datetime(2021, 4, 29, 9, 30), datetime.datetime(2021, 4, 29, 11, 30)]

二、找到有集合竞价交易时间段的意义

2.1 多出来的1根1分钟K线

我们知道每个合约每个交易日开盘前都带有集合竞价时段,日盘在上午,夜盘在晚上,不能统一规定。
集合竞价时段发生在开盘前,结束后CTP行情接口会收到一个tick数据,而这个数据的时间戳不是9:00也不是21:00,所以会导致vnpy的客户端的
BarGenerator产生一根1分钟K线。而这根1分钟K线本应该属于9:00后者21:00的那根1分钟K线的!

2.2 特别的A股股票集合竞价

注意到A股股票1日有两个集合竞价时段,上午的9:15-9:25和下午的14:57-15:00。可是下午的14:57-15:00的集合竞价不会对BarGenerator产生K线产生任何影响。
其中上午的9:15-9:25又分为竞价委托9:15-9:20和集合竞价9:20-9:25两部分。这一部分结束后会在 9:25产生一个tick数据并推送到客户端,会对目前的BarGenerator产生K线产生影响,因为BarGenerator无法把这个tick数据合并到9:30到那个1分钟K线中!

2.3 修改vnpy的BarGenerator,使得可以正确处理集合竞价

有了上一贴的讨论和第一部分的测试,我们可以对vnpy的BarGenerator进行修改,使之能够正确处理集合竞价!

Member
avatar
加入于:
帖子: 64
声望: 2

好帖,顶一下。

Administrator
avatar
加入于:
帖子: 4500
声望: 320

感谢分享,给你加个精华!

Member
avatar
加入于:
帖子: 26
声望: 1

请问大佬使用vnpy可以实现期货集合竞价的前4分钟下单吗?
是不是可以在on_start中加一个阻塞,当确定市场已进入集合竞价(时间判定或者事件触发)时,在此处立即下单。

Member
avatar
加入于:
帖子: 419
声望: 171

c787297017 wrote:

请问大佬使用vnpy可以实现期货集合竞价的前4分钟下单吗?
是不是可以在on_start中加一个阻塞,当确定市场已进入集合竞价(时间判定或者事件触发)时,在此处立即下单。

回复:

  1. vnpy可以实现期货集合竞价期间手动下单
  2. 但是目前vnpy中的用户策略模板还没有提供对合约交易状态的感知功能,因此策略无法知道当前时间是否是集合竞价时段。
  3. 在可以收到合约交易状态前提下,在CtaTemplate中增加:合竞价报单、集合竞价撮合和集合竞价结束【连续竞价状态】等状态推送接口,以便推动策略进行委托交易。
  4. 如果策略足够复杂,你还可以考虑集合竞价期间的撤单操作。
  5. 当然4和5两条都需要对目前vnpy的gateway(如CTP网关)、应用引擎(如CtaEngine)和策略模板(如CtaTemplate)进行扩展才能够实现的。
Member
avatar
加入于:
帖子: 26
声望: 1

hxxjava wrote:

c787297017 wrote:

请问大佬使用vnpy可以实现期货集合竞价的前4分钟下单吗?
是不是可以在on_start中加一个阻塞,当确定市场已进入集合竞价(时间判定或者事件触发)时,在此处立即下单。

回复:

  1. vnpy可以实现期货集合竞价期间手动下单
  2. 但是目前vnpy中的用户策略模板还没有提供对合约交易状态的感知功能,因此策略无法知道当前时间是否是集合竞价时段。
  3. 在可以收到合约交易状态前提下,在CtaTemplate中增加:合竞价报单、集合竞价撮合和集合竞价结束【连续竞价状态】等状态推送接口,以便推动策略进行委托交易。
  4. 如果策略足够复杂,你还可以考虑集合竞价期间的撤单操作。
  5. 当然4和5两条都需要对目前vnpy的gateway(如CTP网关)、应用引擎(如CtaEngine)和策略模板(如CtaTemplate)进行扩展才能够实现的。

多谢hxx大佬点拨,我准备模仿您实现过的on_auction_tick去尝试下”在CtaTemplate中增加:合竞价报单、集合竞价撮合和集合竞价结束【连续竞价状态】等状态推送接口,以便推动策略进行委托交易“,感觉这样才是正规的解决办法,再次感谢

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】