Date Tags Quant

简单来讲就是我自己用CTP接口拿来了tick数据来做分析,期望达到一些期货软件交易明细功能所产生的效果。由于我不是行内人,所以有些地方可能实现得不是很合理或者有误,请大家指点或者提出来,非常感谢。

本篇文章只把代码贴出来,下一篇基于代码讲程序的流程。

希望通过这个实践达到如下目的:

  1. 熟悉CTP接口
  2. 熟悉期货的盘口分析

我是基于vn.py框架上做的开发,先看看期望达成的效果和我的成果

目的

目的

成果

成果

CTP接口

CTP接口这里不多说,去看看官方文档即可:CTP官方文档下载

我用到了行情查询相关的接口,先订阅,再在回调函数中处理每个tick数据。说到这里,个人觉得CTP要是能开源就好了,这样就能自己编译在mac下的版本了,哈哈,真想把CTP的dll文件反编译掉。现在我自己搞了个WindowsToGo在mac上跑着的,想装个B真不容易。

而且如果开源的话,说不定能在CTP实现层大大提高效率。而此时我们只能在CTP的上层做文章,当然我暂时不会做HFT,也无所谓了。

我的程序

我用到的数据是我们常说的tick数据,我的tick数据的知识还来自于Tick 数据在技术上究竟是什么东西?

通过这篇文章、CTP开发文档还有自己对期货行情的观察可以看出通过CTP接口订阅到的tick数据其实不是order book 每次发生变化发送的通知,而是1秒钟两次的快照数据,准确的应该是说两次快照间的统计数据。

而这个实例当中有一部分(计算单的类型:多开,空开,计算对手单的组成)是根据order book 只变化一次来进行编写的,所以这部分是不准确的,像有朋友开玩笑说,期货软件里面这部分数据也是忽悠小白的。不管怎样拥有分析tick数据的技能是不忽悠的。

直接上代码吧,哎呦,知乎也能贴代码了,不过没有语法高亮,知乎,加油哦

把代码放在vn.py项目的\vnpy\vn.ctp\vnctpmd\test\目录下就可以执行啦,需要源码的朋友也可以到我的github上去下载。程序主要是两部分,一部分是Enum和字典定义,第二部分是根据当前tick和上一个tick算出我们要的值,详细分析请见下一篇文章。

用CTP接口实现期货交易明细分析(2)

TickAnalysis on github

# 仓位变化方向
open_interest_delta_forward_enum = enum(OPEN="Open", CLOSE="Close", EXCHANGE="Exchange", NONE="None",
                                        OPENFWDOUBLE="OpenFwDouble", CLOSEFWDOUBLE="CloseFwDOuble")
# 订单成交区域,决定是多还是空
order_forward_enum = enum(UP="Up", DOWN="Down", MIDDLE="Middle")

# 最终需要的tick方向
tick_type_enum = enum(OPENLONG="OpenLong", OPENSHORT="OpenShort", OPENDOUBLE="OpenDouble",
                      CLOSELONG="CloseLong", CLOSESHORT="CloseShort", CLOSEDOUBLE="CloseDouble",
                      EXCHANGELONG="ExchangeLong", EXCHANGESHORT="ExchangeShort",
                      OPENUNKOWN="OpenUnkown", CLOSEUNKOWN="CloseUnkown", EXCHANGEUNKOWN="ExchangeUnkown",
                      UNKOWN="Unkown", NOCHANGE="NoChange")

tick_color_enum = enum(RED="Red", GREEN="Green", WHITE="White")

tick_type_key_enum = enum(TICKTYPE="TickType", TICKCOLOR="TickColor")

# 只与计算对手单的组成相关
opponent_key_enum = enum(OPPOSITE="Opposite", SIMILAR="Similar")

# 只做翻译成中文使用,对应 tick_type_enum
tick_type_str_dict = {tick_type_enum.OPENLONG: "多开", tick_type_enum.OPENSHORT: "空开",
                      tick_type_enum.OPENDOUBLE: "双开",
                      tick_type_enum.CLOSELONG: "多平", tick_type_enum.CLOSESHORT: "空平",
                      tick_type_enum.CLOSEDOUBLE: "双平",
                      tick_type_enum.EXCHANGELONG: "多换", tick_type_enum.EXCHANGESHORT: "空换",
                      tick_type_enum.OPENUNKOWN: "未知开仓", tick_type_enum.CLOSEUNKOWN: "未知平仓",
                      tick_type_enum.EXCHANGEUNKOWN: "未知换仓",
                      tick_type_enum.UNKOWN: "未知", tick_type_enum.NOCHANGE: "没有变化",
                      tick_color_enum.RED: "红", tick_color_enum.GREEN: "绿", tick_color_enum.WHITE: "白"}

# 根据 open_interest_delta_forward_enum 和 order_forward_enum 计算出tick类型的字典
tick_type_cal_dict = {
    open_interest_delta_forward_enum.NONE:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
    open_interest_delta_forward_enum.EXCHANGE:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGELONG,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGESHORT,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGEUNKOWN,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
    open_interest_delta_forward_enum.OPENFWDOUBLE:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
    open_interest_delta_forward_enum.OPEN:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENLONG,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENSHORT,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENUNKOWN,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
    open_interest_delta_forward_enum.CLOSEFWDOUBLE:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
    open_interest_delta_forward_enum.CLOSE:
        {
            order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSESHORT,
                                    tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
            order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSELONG,
                                      tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
            order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEUNKOWN,
                                        tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
        },
}


# input1 计算订单是在ask范围内成交还是在bid范围内成交
order_forward = TickAnalysis.get_order_forward(data["LastPrice"],data["AskPrice1"], data["BidPrice1"],
                        self.PreDepthMarketData["LastPrice"],
                        self.PreDepthMarketData["AskPrice1"],
                        self.PreDepthMarketData["BidPrice1"])
# input2 计算仓位变化方向
open_interest_delta_forward = TickAnalysis.get_open_interest_delta_forward(open_interest_delta,
                                            volume_delta)

# f(input1,input2) = output1 根据成交区域和仓位变化方向计算出tick的类型
 tick_type_dict = tick_type_cal_dict[open_interest_delta_forward][order_forward]

Comments

comments powered by Disqus