欢迎你们订阅《Python实战-构建基于股票的量化交易系统》小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍。本篇专栏为小册子内容的加推篇!!!bash
在小册子中咱们主要针对于股票日线级别的行情数据,介绍了一些获取和处理的方法,其实最原始的数据是交易明细数据,行情软件的各类周期和统计的数据都是经过明细数据跨周期转换而造成的,好比分钟K线、小时K线、当日成交量、成交额、外盘、内盘等各类指标。 本节咱们主要介绍如何解读和获取股票交易明细数据,以及处理和转换交易明细数据的方法。微信
此处咱们从免费行情软件中截取了某股2020年1月23日的成交明细数据,咱们看到成交明细中有时间、价格、现量和笔数四列数据,以下图所示:函数
因为是免费行情软件,此处“成交明细”数据是以3-6秒间隔去记录的(不一样软件可能有差别),表示在这个时间撮合的多笔单子的总和,所以确切地说是“分时成交”数据,即依据时间段为单位统计的结果,笔数这栏表示的是在这个周期内总共成交了几笔。ui
这不一样于“逐笔成交”的数据,“逐笔成交”数据记录的是每一笔成交的明细,这个属于行情软件收费范畴的功能。好比像如下这样的数据,如图所示:spa
再来看下现量这栏,现量指的是当前分时的成交量,以手为单位。其中有三种颜色,分别是红色、绿色和白色。红色表明主动买单,绿色表明主动卖单,这部分与“五档买卖明细”相关,以下图所示:3d
咱们知道交易所成交的规则为“价格优先、时间优先”,挂单价比现价高就会优先成交,所以主动买单,指的是以委卖的价格成交,即以买卖档位窗口中“卖一”及以上的价格成交。主动卖单跟主动买单恰好相反,以“买一”及如下的价格成交,挂的卖单价格比现价低就会优先成交。code
从内外盘能够看出委买委卖的状况,即外盘表明主动买盘的集合,内盘表明主动卖盘的集合。cdn
固然,白色也比较好理解了,即指的是主动买单和主动卖单相等的状况。blog
此处咱们采用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量化交易相关内容