经常听见tick数据,回测的时候也用过,但是还真的没有自己去处理过tick数据,据说tick数据有很多坑,所以打算自己研究一下。首先的第一步就是先拿正常的tick数据来生成bar,从而能够理解一些细节,然后就是自己用ctp去接收tick数据,看看ctp有没有坑。
这里,完美的tick数据是wind上的。
这是wind上面导出来的,看起来还是比较正常的,反正一秒两个数据嘛。毕竟我们知道,咱们交易所给我们的数据不是真正的tick,而是snapshot,说白了就是500毫秒一次切片。一切的行情软件,其实都是根据tick数据来实现的。
tick数据当然还有别的东西,比如ask、bid但是,最重要的还是last_price和volume。last price当然可以理解,切片时候的成交价格嘛,至于volume,我们来看一下曲线:
所以,tick数据的volume是累计成交量,而一天的开始是九点的夜盘开始。当然没有夜盘的品种当然就是第二天早上九点了。
那么怎么变成分钟数据呢?也就是tick变成bar。
#encoding=utf-8
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.finance as mpf
from matplotlib.pylab import date2num
tick_df = pd.read_hdf('rb_tick.h5')
class mBar(object):
def __init__(self):
"""Constructor"""
self.open = None
self.close = None
self.high = None
self.low = None
self.datetime = None
bar = None
m_bar_list = list()
for datetime, last in tick_df[['last']].iterrows():
new_minute_flag = False
if not bar: # 第一次进循环
bar = mBar()
new_minute_flag = True
elif bar.datetime.minute != datetime.minute:
bar.datetime = bar.datetime.replace(second=0, microsecond=0) # 将秒和微秒设为0
m_bar_list.append(bar)
# 开启新的一个分钟bar线
bar = mBar()
new_minute_flag = True
if new_minute_flag:
bar.open, bar.high, bar.low = last['last'], last['last'], last['last']
else:
bar.high, bar.low = max(bar.high, last['last']), min(bar.low, last['last'])
bar.close = last['last']
bar.datetime = datetime
pk_df = pd.DataFrame(data=[[bar.datetime for bar in m_bar_list],
[bar.close for bar in m_bar_list],
[bar.open for bar in m_bar_list],
[bar.high for bar in m_bar_list],
[bar.low for bar in m_bar_list]],
index=['datetime', 'close', 'open','high', 'low']
).T[['datetime', 'open', 'high', 'low', 'close']]
pk_df['datetime'] = pk_df['datetime'].apply(lambda x: date2num(x)*1440) # 为了显示分钟而不叠起来
fig, ax = plt.subplots(facecolor=(0, 0.3, 0.5),figsize=(12,8))
mpf.candlestick_ohlc(ax,pk_df.iloc[:100].as_matrix(),width=0.7,colorup='r',colordown='green') # 上涨为红色K线,下跌为绿色,K线宽度为0.7
plt.grid(True)
我们看一下我们生成的bar和wind给出的bar。
来自wind的:
笔者核对过,完全一样。
理论上,解决这个问题之后,我们就可以把精力聚焦于如何获得质量较高的tick数据。实际过程中,我们的tick数据都是实时的,所以,tick数据的质量往往由两个因素决定,一个是我们处理tick的回调数据的速度,如果响应和处理都很慢的话,显然就会有很大的问题;另外一个影响实时的tick数据的因素就是ctp前置的实时负载,如果服务器压力大的话,很容易就会丢失数据。