集合竞价观察
郑商所 无夜盘 AP410:
早盘tick数据 8:55开始,最终在8:59成交量变化,说明集合竞价结束。
郑商所 有夜盘 FG409:
夜盘tick数据 20:55开始,最终在20:59成交量变化,说明集合竞价结束。
早盘tick数据 8:55开始,最终在9:00成交量变化,说明集合竞价结束。
夜盘到早盘之间没有无效的tick数据。
上期所 有夜盘 rb2410:
夜盘tick数据20:59开始,就这一笔,也是当日开盘价。
早盘tick数据8:59开始,就这一笔。
总结:郑商所集合竞价早盘8:55开始,夜盘20:55开始。当日开盘价有夜盘品种20:59决定,无夜盘品种8:59决定。早盘第一个K线开盘价有夜盘品种9:00决定,无夜盘品种8:59决定。关键点是成交量变化。
无效数据
郑商所 无夜盘 AP410:
23点后有无效数据,很多品种23点后还是交易时间,所以只根据交易时间剔除无效数据是不行的。
上期所 有夜盘 au2410:
夜盘凌晨2:30结束,早上7:30后重新加载了1次夜盘数据,晚上19:30后又加载了1次数据,这些系统时间和tick时间差距很大的tick,都属于无效数据。
上期所 有夜盘 rb2410:
在夜盘结束到早盘开盘前没有多余的tick推送。但18点后也有无效tick推送。
有的品种15点后还会推送数据,时间有时在15:16,有时在15:26,有时在15:57,虽然价格没变化,但成交量有变化。
跟通达信K线核对后,发现这个15点后推送的数据的成交量是算在最后1个K线里的。
最后一根1分钟K线
10:15推送的tick是有效数据,其价格和成交量都有变化,合并为10:14开始的1分钟K线。
15:00推送的tick是有效数据,其价格和成交量都有变化,合并为14:59开始的1分钟K线。
有的品种如rb2410:15点后依然会推送有效数据,不过价格和成交量都不再变化,合并到最后的K线。
有的品种如rb2410:23点结束,所以23点推送的tick属于22:59开始的K线。
有的品种如sc2408:2:30结束,那么23点推送的K线属于23点开始的K线。
所以不能一概认为23点的tick就一定是22:59开始的K线。
除非把新的1分钟的01秒作为新的K线,但是K线数据会与主流行情软件不同。
有的品种如 AP410:最后1笔的tick时间是14:59:59秒。没有新的tick数据来触发K线结束。
所以要在收盘后有个K线整理的计划。
大总结
tick时间和系统时间相差超过3分钟为无效tick,需要过滤掉。
竞价K线的整理:8:55到9点之间推送的tick修改时间为9点,这样第1个K线就是9点开始。夜盘20:55到21点的tick改成21点。
夜盘K线的整理:等到最晚的夜盘结束也就是2:30后,进行一次K线合并。
如果最后一个K线是23点,就合并到22:59。
如果最后一个K线是1点,就合并到12:59
如果最后一个K线是2:30,就合并到2:29
日盘K线的整理:
10:15的tick推送过来时改成10:14,这样就自动合并到前1分钟了。
11:30的tick推送过来时改成11:29
15点以及15点后推送的有效tick也会生成K线,比如15:16推送的tick,生成的K线没什么意义。
把15:00~15:30之间推送的tick时间修改为14:59
有的品种如 AP410最后1笔的tick时间是14:59:59,没有新的tick数据来触发K线结束。
有的品种如 FG409 夜盘结束tick时间是 22:59:59,没有新的tick数据来触发K线结束。
15:30后进行一次K线整理,把没完成的K线都设置为已完成。同样夜盘结束2:30后也这样处理。
成交量=当前tick累计成交量-上个tick累计成交量
注意:一定要在日盘结束后重置上个tick的累计成交量,因为夜盘或次日早盘成交量是重新开始计算的。
Tick分析过程用到的代码
import pandas as pd
# pd.set_option('display.max_rows', None)
file = './md_data/tick_rb2410.csv'
# file = './md_data/tick_FG409.csv'
df = pd.read_csv(file, names=['TradingDay', 'UpdateTime', 'InstrumentID', 'LastPrice', 'Volume', 'OpenInterest', 'timestamp', 'currentTime'])
df['time_diff'] = abs(df['timestamp'] - df['currentTime'])
df['tTime'] = pd.to_datetime(df['timestamp'], unit='s', origin='1970-01-01 08:00:00')
df['cTime'] = pd.to_datetime(df['currentTime'], unit='s', origin='1970-01-01 08:00:00')
# df = df[df['time_diff'] < 60 * 3].head(20) #tick时间和系统时间相差超过3分钟 无效tick
# df = df[df['TradingDay'] >= 20240712]
df = df[(df['UpdateTime'] >= '11:29:59') & (df['UpdateTime'] <= '20:59:59')]
# df = df[(df['cTime'].dt.time > pd.to_datetime('15:00').time()) & (df['tTime'].dt.time < pd.to_datetime('21:00').time())].head(20)
df.head(30)