Python量化交易进阶讲堂-股票分时明细数据的处理与转换

4,911 阅读10分钟

欢迎大家订阅《Python实战-构建基于股票的量化交易系统》小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择的收录至小册中,更便于广大读者查阅知识点。本篇专栏为小册子内容的加推篇!!!

前言

在小册子中我们主要针对于股票日线级别的行情数据,介绍了一些获取和处理的方法,其实最原始的数据是交易明细数据,行情软件的各种周期和统计的数据都是通过明细数据跨周期转换而形成的,比如分钟K线、小时K线、当日成交量、成交额、外盘、内盘等各种指标。 本节我们主要介绍如何解读和获取股票交易明细数据,以及处理和转换交易明细数据的方法。

解读分时明细数据

此处我们从免费行情软件中截取了某股2020年1月23日的成交明细数据,我们看到成交明细中有时间、价格、现量和笔数四列数据,如下图所示:

由于是免费行情软件,此处“成交明细”数据是以3-6秒间隔去记录的(不同软件可能有差异),表示在这个时间撮合的多笔单子的总和,因此确切地说是“分时成交”数据,即依据时间段为单位统计的结果,笔数这栏表示的是在这个周期内总共成交了几笔。

这不同于“逐笔成交”的数据,“逐笔成交”数据记录的是每一笔成交的明细,这个属于行情软件收费范畴的功能。比如像以下这样的数据,如图所示:

再来看下现量这栏,现量指的是当前分时的成交量,以手为单位。其中有三种颜色,分别是红色、绿色和白色。红色代表主动买单,绿色代表主动卖单,这部分与“五档买卖明细”相关,如下图所示:

我们知道交易所成交的规则为“价格优先、时间优先”,挂单价比现价高就会优先成交,因此主动买单,指的是以委卖的价格成交,即以买卖档位窗口中“卖一”及以上的价格成交。主动卖单跟主动买单刚好相反,以“买一”及以下的价格成交,挂的卖单价格比现价低就会优先成交。

从内外盘可以看出委买委卖的情况,即外盘代表主动买盘的集合,内盘代表主动卖盘的集合。

当然,白色也比较好理解了,即指的是主动买单和主动卖单相等的情况。

获取分时明细数据

此处我们采用tushare库get_tick_data()接口来获取个股以往交易历史的分笔数据明细。比如我们获取'002372'该股'2020-01-23'当天的历史数据,如下所示:

# 获取个股以往交易历史的分笔数据明细
df_tick = ts.get_tick_data('002372',date='2020-01-23',src='tt')
print(df_tick[2000:2010])
"""
            time  price  change  volume  amount type
2000  13:37:16  12.39   -0.01     126  156114   卖盘
2001  13:37:19  12.38   -0.01       1    1238   卖盘
2002  13:37:25  12.38    0.00      39   48322   卖盘
2003  13:37:28  12.39    0.01      25   30953   买盘
2004  13:37:37  12.38   -0.01       2    2476  中性盘
2005  13:37:40  12.36   -0.02      14   17345   卖盘
2006  13:37:43  12.40    0.04       1    1240   买盘
2007  13:37:46  12.40    0.00       1    1240   买盘
2008  13:37:49  12.40    0.00      63   77978   买盘
2009  13:37:58  12.39   -0.01       1    1239   买盘
"""

返回值中time时间、price成交价格、change价格变动、volume成交手、amount成交金额(元)、type买卖类型【买盘、卖盘、中性盘】。我们验证该数据与行情软件的成交明细数据稳和。如下图所示:

然后我们采用小册子《差异化分析常用股票交易数据接口》一节的方法将分笔数据的行索引转换为时间序列,转换后数据如下所示:

"""
                         price  change  volume  amount type
time                                                   
2020-02-01 13:37:16  12.39   -0.01     126  156114   卖盘
2020-02-01 13:37:19  12.38   -0.01       1    1238   卖盘
2020-02-01 13:37:25  12.38    0.00      39   48322   卖盘
2020-02-01 13:37:28  12.39    0.01      25   30953   买盘
2020-02-01 13:37:37  12.38   -0.01       2    2476  中性盘
2020-02-01 13:37:40  12.36   -0.02      14   17345   卖盘
2020-02-01 13:37:43  12.40    0.04       1    1240   买盘
2020-02-01 13:37:46  12.40    0.00       1    1240   买盘
2020-02-01 13:37:49  12.40    0.00      63   77978   买盘
2020-02-01 13:37:58  12.39   -0.01       1    1239   买盘
"""

分时数据周期重采样

Pandas中提供了resample()方法对时间序列进行重采样,此处将获取到的tick数据合成一分钟数据。关键代码如下所示:

df_min_ohlc = df_tick.price.resample('1min', closed='left', label='left').ohlc()
"""
                      open   high    low  close
time                                           
2020-02-01 09:25:00  12.78  12.78  12.78  12.78
2020-02-01 09:26:00    NaN    NaN    NaN    NaN
2020-02-01 09:27:00    NaN    NaN    NaN    NaN
2020-02-01 09:28:00    NaN    NaN    NaN    NaN
2020-02-01 09:29:00    NaN    NaN    NaN    NaN
2020-02-01 09:30:00  12.76  12.76  12.61  12.66
2020-02-01 09:31:00  12.66  12.66  12.64  12.64
2020-02-01 09:32:00  12.64  12.64  12.59  12.59
2020-02-01 09:33:00  12.63  12.68  12.61  12.67
2020-02-01 09:34:00  12.68  12.70  12.68  12.69
"""

而后我们将df_min_ohlc数据进行清洗,最终得到的数据如下所示:


"""
                      open   high    low  close
time                                           
2020-02-01 09:25:00  12.78  12.78  12.78  12.78
2020-02-01 09:30:00  12.76  12.76  12.61  12.66
2020-02-01 09:31:00  12.66  12.66  12.64  12.64
2020-02-01 09:32:00  12.64  12.64  12.59  12.59
2020-02-01 09:33:00  12.63  12.68  12.61  12.67
"""

接下来就可以用小册子《股票数据可视化:自定义Matplotlib版股票行情界面》的代码绘制1min K线图,如下图所示:

完整代码可参考小册子《加推篇!股票分时明细数据的处理与转换》。

计算流入流出资金

接下来我们通过分时明细数据粗略地估计下该股流入和流出的资金情况。

成交额的计算为价格*成交量,不过get_tick_data()接口返回的数据已经包含了成交额数据,确实方便了不少。我们把当天所有分时的成交额累计后得到整一天的成交额为9856.02万,代码如下所示:

# 当天的成交额
print(df_tick.amount.sum())

计算资金流入和流出可以使用Pandas的groupby方法。我们先大致了解下groupby的整个过程。groupby其实可以分为拆分、应用、合并三个过程。拆分指的是根据某个规则把数据集分组,应用指的是对每一组数据进行统计操作,比如取平均、求和或者是自定义函数,最后是合并过程,合并是把操作后的结果重新聚合起来,形成另一个DataFrame数据或者Series数据。

计算资金流入和流出的代码如下所示:

print(df_tick["amount"].groupby(df_tick["type"]).sum())
"""
type
中性盘     2110576
买盘     36741662
卖盘     59707926
Name: amount, dtype: int64
"""

对于主力资金的流入和流出的计算,主要是通过资金量的大小去筛选,因为成交一笔较大大成交量的单子是需要相应大小资金,往往认为这笔成交是由机构或者大户完成的,也就是所谓的主力。

因此我们可以设置主力交易成交额阈值即可,当天所有大于该阈值的买盘的总成交额,即为主力资金流入,当天所有大于该阈值的卖盘的总成交额,即为主力资金流出。代码如下所示:

print(df_tick[df_tick["amount"]>threshold].amount.groupby(df_tick["type"]).sum())
"""
type
中性盘     1119753
买盘     14042952
卖盘     33459052
Name: amount, dtype: int64
"""

关于大单交易,此次再补充一点。get_sina_dd()接口可获取大单交易数据,默认为大于等于400手,也可通过vol参数指定返回具体成交量的交易数据,如下所示:

# 获取大单交易数据,默认为大于等于400手,数据来源于新浪财经。
data=ts.get_sina_dd('600797',date = '2019-08-08')
print(data.head(10))
"""
     code  name      time  price  volume  preprice type
0  600797  浙大网新  15:00:00   8.01  253542      8.01   买盘
1  600797  浙大网新  14:56:18   8.01   45700      8.01   卖盘
2  600797  浙大网新  14:54:39   8.01  116400      8.01   买盘
3  600797  浙大网新  14:18:18   8.00   50000      8.00   买盘
4  600797  浙大网新  13:35:57   8.02   53100      8.01   卖盘
5  600797  浙大网新  13:33:57   8.03   42200      8.03   买盘
6  600797  浙大网新  13:25:18   8.01   64100      8.01   买盘
7  600797  浙大网新  13:25:15   8.01   41800      8.01   买盘
8  600797  浙大网新  13:22:57   8.04  135500      8.03   买盘
9  600797  浙大网新  13:22:00   8.01   44600      8.01   买盘
"""

这里要说明下,如果要更精确的统计流入流出的资金情况,可采用分时逐笔成交数据去计算。

确切地说即使使用“逐笔成交”数据也只能作为寻找主力行踪的一项参考指标,这是因为“逐笔成交”是以实际成交对手盘中买卖双方较小投注量为单位统计的结果。这个我们可以作为一个话题放在小册子的话题讨论中,欢迎大家多多参与讨论!

另外,根据以往的经验来看,我们在成交明细里面识别大单以及超级大单时,可以留意具有规律性的单子,通常这些单子是用自动交易软件批量下单的,把一个大单转化大为各种小单,只有大资金才会去使用。看到这样的单子,可以作为判断有大资金进场的一个信号。

总结

本小节我们理解了行情软件上分时明细数据的含义,以及掌握了如何处理和转换这些数据的方法,这有助于我们更灵活地去提取和挖掘我们所需的行情信息。

更多的量化交易内容欢迎大家订阅小册阅读!!同时也欢迎大家关注我的微信公众号【元宵大师带你用Python量化交易】了解更多Python量化交易相关内容