• 【零基础】简易价差K线合成方法介绍


    一、前言

      价差K线合成一直是某种“高端”的应用,因为做套利交易的本来就少,做自设套利的就更少了。目前市面上支持套利且比较成熟的终端有极星和文华,极星支持常见的价差品种但数量有限,文华则需要支付一笔不小的费用但可以做任意合约的组合。如果要自己拿行情来做,一个是行情源本身的成本一年就上万了,其次我打听过K线合成5000能不能搞定,专业人士告诉我得再加个0。言而总之这是个比较偏的应用自己做费时费力,找人做费钱,所以我就想有没有变通的方法,最后找到一个非常简单的路径,但实时性肯定不如专业的行情终端。这里我就大概介绍一下思路,由于代码非常分散,本篇就没有源码了。

    二、K线合成原理

      K线合成是一个反推的过程,因为我们已经有了两个参考:文华和极星,所以只需要看一下别人是怎么做的,我们照办即可。这里为了便于理解,我们将待合成的两个合约分别记为“合约A”、“合约B”,合成后的合约称为“价差合约”。

    文华、极星合成规则解析:

      仔细看了一下文华和极星合成好的K线,其实逻辑很简单,先用合约A和合约B成对的tick数据两两相减得到新的tick,再用新的tick合成价差合约的K线。但在细节上二者有一点不同,极星严格按时间戳成对相减,而文华则使用最新价来成对相减,下面做一个示例:

    时间 合约A 合约B 价差(极星) 价差(文华)
    09:30:01 37 42 37-42 = -5 37-42 = -5
    09:30:02 37.5 37.5-42 = -4.5
    09:30:03 42.5 37.5-42.5 = -5
    09:30:04
    09:30:05 37 43 37-43 = -6 37-43 = -6

      可以看到所谓价差就是两个合约的最新价之差,极星严格按时间戳相减,而文华则是在其中一个合约缺少数据时使用前面最近一个时间戳的数据。如果我们将上面示例的5秒数据合成为一根K线的话,能得到以下结果:

      极星 文华
    open -5 -5
    close -6 -6
    high -5 -4.5
    low -6 -6

      从这个案例来看似乎是文华的更好,但实际情况并不一定是这样。由于期货交易的特殊性,一些不活跃的合约最新价和买卖价之间有非常大的“跳空”,比如某时刻最新价是37,但实际的买卖价可能是35和39,如果你按照37这个价格触发了交易信号,按市价去报单,那一开始你就亏了2元。那如果你按极星的规则来合成,K线的连续性就比较差,但好处是避免了价格跳空产生的损失。所以按哪一个规则了合成其实是要看你具体操作的品种和使用的交易策略,另外自己合成K线可以很灵活的修改规则,找到合适的就行。其次,我还在考虑能否设计一个新的规则,不使用最新价,而是用买卖价来合成,这样就同时兼顾了跳空和K线连续性,但也只是个想法,以后再研究。

    三、K线合成步骤

    1、行情获取

      行情获取比较简单,按行情源提供的demo直接取行情就行了,获取到行情推送直接写入数据库。

    2、价差计算

      我们获取到的行情格式一般是这样:时间戳、价格1、价格2、价格3...,总的来说就是有个时间戳和一个最新价,我们需要的也就是这两个字段而已。

      根据前面的合成规则,你可以选一种或者自己整一套规则都行,比较纠结的是用哪一种方式来计算价差,我知道的有以下几种:

      1)在行情获取模块,每有行情更新就从数据库读历史数据来计算价差合约的值,计算结果写入数据库

      2)另外跑一个新的程序来监控数据库,发现有行情更新就从数据库中读历史数据来计算

      3)在数据库里使用触发器的来计算价差

      4)数据入库同时通过队列传递给另一个进程来处理

      5)间隔若干秒从数据库提取两个合约的最新价做计算

      这里面方法没有好坏,只要适合自己就行,比如我一开始用的是3的方法,结果行情波动剧烈的时候服务器扛不住,现在使用的是方法5。

    3、K线合成

      K线合成就简单了,直接根据时间区间从前面计算好的价差值中提取出open、close、high、low即可,因为前面使用的是方法5,也就是每一秒都计算一次最新价差并保存,所以这里我就直接在触发器里做K线合成,K线的实时性挺好。

    4、K线绘制

      绘图的话用echarts就行了,有自带的K线绘制demo,用ajax定时从数据库中获取数据刷新到前端即可。不过这里有个问题,那就是如果做全量数据的获取和刷新,服务器不一定受得了,所以客户端从服务器获取肯定是做增量的,累积数据量大了K线图的刷新可能会卡。

    四、回顾

      经实践表明,K线在数据库里合成出来非常简单,画出来可太难了,涉及到前后端的协调,这是万万没想到的。除此之外,指标计算意外的简单,借助talib只需要几行代码就完事。

      如果要正经使用起来,其实还要考虑一些其他问题,这里我将我想到的比较重要的几条列出来:

      1)换月:目前行情是可以同时获取AB两个合约所有月份的数据,但我们一般只做主力合约,比如现在是10月底,主力合约是12月的。客户端上我们就只显示主力合约的价差K线,到了下个月我们在触发器上直接修改做价差的合约也不是不行,但这样就变成了“主连K线”,也就是11月的K线和12月的K线连在一起。主连的问题是会产生跳空,做指标分析时切换的当天和隔天会产生非常大的干扰(特别是较大周期的分析)。所以比较合适的办法应该是同时做11月和12月的K线合成,在换月时连同历史数据一起切换了。

      2)换年:另外要注意的是换年可能导致的问题,不同交易所合约的命名不太一样,同样的交易所不同渠道的行情命名也不一样,所以存储和处理行情数据时要考虑年份和月份分别存储,比如2020年10月能获取到的行情分别是2020.10、2020.11、2020.12、2021.01、2021.02、2021.03、2021.04、2021.05、2021.06、2021.07、2021.08、2021.09,有些交易所合约名会写成XX2010(2020年的10月)、有些则是XX10,所以在获取到原始行情后就要考虑分开存储了。

      3)数据缺失或异常:网络传输过程或者行情源本身可能导致部分数据的丢失或异常,可以考虑每日做一次全数据的核验,不过实质上没啥意义了(交易时机已过)。还可以考虑与极星或者文华做一下行情的比对,这个可以实时的做,或者只做历史数据,有助于发现特别异常的情况。一般来说不会有这种情况,但可以做做,同时可以对行情源进行比较,心里更加有数一点。

      4)网络异常:目前API是TCP传输,可以确定的是发出的数据和接收的数据肯定是一致的,那么可能出现问题的地方就是网络震荡导致的闪断或者网络直接中断,这需要模拟一下不稳定的网络环境来看看症状,而后再设计解决方案来解决问题。

      5)数据存入异常:数据在存入数据库的过程中出现异常,这个异常会有多种原因,比如数据格式有问题,触发器计算异常都有可能,这也是需要模拟一下异常情况然后看看怎么程序怎么返回再设计解决方案。

      6)心跳异常:心跳异常应该也是网络问题的一种,但具体症状是心跳超时不返回,所以可以针对性的来发现异常和处理。

      7)程序莫名异常:程序运行过程中可能会抛出一些error的,多数时候是难以预判,所以整体catch一下,有异常记录下日志或者发送消息到手机。

      8)断线重连:前面说到的一些异常可能会导致链接中断,所以还需要做好断线重连的机制,以及重连失败如何处理和通知。

      9)多行情源:如果只有一个源始终会觉得心里发毛,所以长期来看多行情源是必不可少的,但是如何避免别的源对现有源产生影响也是个问题。

      10)跨交易所:做套利肯定会有跨品种、跨交易所的情况,而不同交易所的交易时间又不一样,所以这个需要建立一个稳妥的机制。

  • 相关阅读:
    [算法练习]ZigZag Conversion
    获取所有后缀DDE打开命令
    [算法练习]Add Two Numbers
    获取dll编译时生成的pdb文件的名称
    [转载]定位 C++/CLI 库的加载失败异常
    在C++/CLI环境下,千万不要把普通全局函数当标准C/C++的函数指针传递给native的库使用
    Mono集成中使用api获取当前mono 调用堆栈的方法
    简单对比了一下MonoXml与SystemXml在Unity下的表现
    C++从LPEXCEPTION_POINTERS获取调用堆栈
    遇到doxygen生成的chm文档目录如果有中文是乱码?
  • 原文地址:https://www.cnblogs.com/cation/p/13967323.html
Copyright © 2020-2023  润新知