前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tick数据研究(一)

tick数据研究(一)

作者头像
钱塘小甲子
发布2019-03-20 09:56:31
2.8K0
发布2019-03-20 09:56:31
举报
文章被收录于专栏:钱塘小甲子的博客

      经常听见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。

代码语言:javascript
复制
#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前置的实时负载,如果服务器压力大的话,很容易就会丢失数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年03月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档