注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

使用交易平台提供的api自动进行比特币交易研究  

2015-07-19 18:54:16|  分类: 经济学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这几天一直在研究使用比特币交易平台提供的api抓取挂单数据和历史成交数据。这里整理一下这几天的收获。
首先,第一感觉就是交易平台作的不错,最少比股票交易系统更加人性化,7X24小时不间段交易,并且提供交易和查询api接口,方便做量化交易。只要会点代码的,都可以使用这些接口,接口都是以json格式进行数据转送。大多数是以http协议,也有提供websocket接口的,但使用起来技术难度比较大。语言方面支持python,java,C++等等。
我为了方便代码在服务器上运行,选择了http协议的C++接口。C++处理数据速度快,这也是我选择这个语言的原因,但是使用http协议时就要设置一个定时器,每秒去交易平台的服务器取交易和挂单数据。但试了一下websocket发现没有编译成功,可以回头再试。现在就先使用http搞起来再说。
我使用代码每3秒取一次买单和卖单的挂单数据,并以json格式保存到一个文本文档中,每一行为一个json对象,其中包含50个买单挂单,50个卖单挂单,当前成交的50个历史成交记录(当然,历史记录实际上是会有重复,不过我会在最后去除重复数据),以及获取这个数据的unix时间戳。
电脑开了一晚上,抓到了近500m的数据,因为对于数据分析来说,我们就完全没有必要使用C++这么强大而复杂的语言了,我选择使用python对数据作人为分析,因为python语言是最简单而强大的语言,主要是库多,用一句通俗的话来说,就是性价比最好的语言。
先看一下使用接口抓取的数据吧。下边是截图。
使用交易平台提供的api自动进行比特币交易研究 - ♂苹果 - 眼睛想旅行
这里说一下,怎么使用C++来进行文件的尾部写入文本操作,代码如下。
使用交易平台提供的api自动进行比特币交易研究 - ♂苹果 - 眼睛想旅行
 this->mkDirWithFilePath(filePath);这个函数是建立文件路径的,我们都知道,如果文件不存在,我们去打开一个文件时会出错。所以这个方法是判断有没有文件,没有就创建一个。
接着下边的:
ofstream out(path,c_str(),ios::app);
//意思就是打开文件,并创建文件尾部数据流out,
//然后使用
 out<<pContent;
把我们生成的文本数据写入到文件流中。
最后out,close()关闭打开的文件流。
得到数据后,我们接着要进行的工作就是分析数据了。
我使用了python来对数据进行分析。下边是分析代码:

#-*- coding: utf-8 -*-

import codecs

import os,sys

import xlrd

import re

import numpy as np

import matplotlib.pyplot as plt

import json


resDir = 'res'

outDir = 'out'

excelFileName = 'log.cvs'

#log数据

logDataFile = 'log.txt'


#获取脚本路径

def cur_file_dir():

    pathx = sys.argv[0]

    path,_file = os.path.split(pathx)

    if cmp(path,'') == 0:

        path = sys.path[0]

    #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径

    if os.path.isdir(path):

        return path

    elif os.path.isfile(path):

        return os.path.dirname(path)

#获取父目录

def GetParentPath(strPath):

    if not strPath:

        return None;

    

    lsPath = os.path.split(strPath);

    if lsPath[1]:

        return lsPath[0];

    

    lsPath = os.path.split(lsPath[0]);

    return lsPath[0];



def drawTest2():

    x1 = range(0,50)

    y1 = range(50,100)

    x2 = [0,50]

    y2 = [0,50]

    fig = plt.figure(figsize=(8,4))

    ax = fig.add_subplot(111)

    ax.plot(x1,y1,'c',x2,y2,'o')

    #fig.show()

    #fig.savefig('test.pdf')

    plt.show()


def drawData(x,y,n = 1,clor = 'b'):

    plt.figure(n) # 创建图表1

    plt.plot(x, y,clor)

    


def getListWithNumber(datlist,n = 0):

    tmps = []

    for l in datlist:

        tmps.append(l[n])

    return tmps


def getDataAndDraw(filepath):

    print filepath

    logf = open(filepath,'r')

    flines = logf.readlines()

    sellNum = []

    sellPrice =[]

    buyNum = []

    buyPrice = []

    bstime = []

    marketNum = []

    marketPrice = []

    markettime = []

    marketid = {}

    for line in flines:

        txt = line.replace(' ','')

#         p = txt.find("date:")

#         txt = line[:p] + line[p:p+9] + line[p+30:]

#         txt = txt.replace('marketDat','"marketDat"').replace('price','"price"').replace('buy50s','"buy50s"').replace('sell50s','"sell50s"').replace('number','"number"')

        txt = txt.replace('\n','').replace('\r','').replace(' ','')

        dicdat = json.loads(txt)

        marketdat = dicdat['marketDat']

        buy50s = marketdat['buy50s']

        sell50s = marketdat['sell50s']

        markets = dicdat['histroyDat']

        bstime.append(marketdat['time'])

        buynumlist = []

        buyprilist = []

        sellNumList = []

        sellPriList = []

        for b in range(50):

            buynumlist.append(buy50s[b]['number'])

            buyprilist.append(buy50s[b]['price'])

            sellNumList.append(sell50s[b]['number'])

            sellPriList.append(sell50s[b]['price'])

            if not marketid.has_key(markets[b]['tid']):

                marketid[markets[b]['tid']] = markets[b]['time']

                markettime.append(markets[b]['time'])

                marketNum.append(markets[b]['number'])

                marketPrice.append(markets[b]['price'])

        buyNum.append(buynumlist)

        buyPrice.append(buyprilist)

        sellNum.append(sellNumList)

        sellPrice.append(sellPriList)

    print "marketNum=%d,and buyNum=%d"%(len(marketNum),len(buyNum))

    plt.figure(1) # 创建图表1

    plt.figure(2) # 创建图表2

    plt.figure(3)

    plt.figure(4)

    drawData(markettime, marketPrice,1)

    drawData(markettime, marketNum,2)

    buy1s = getListWithNumber(buyPrice)

    sell1s = getListWithNumber(sellPrice)

    sell2s = getListWithNumber(sellPrice,1)

    sell3s = getListWithNumber(sellPrice, 2)

    print sell1s

    print sell2s

    print sell3s

    print buy1s

    plt.figure(5)

    plt.figure(6)

    drawData(bstime, buy1s, 3,'o')

    drawData(bstime, sell1s, 4,'or')

    drawData(bstime, sell2s, 5,'or')

    drawData(bstime, sell3s, 6,'or')

    plt.show()

#主方法

def main():

    mainpath = cur_file_dir()

    print mainpath

    logfilePath = GetParentPath(mainpath) + os.sep + resDir + os.sep + 'log.txt'

    getDataAndDraw(logfilePath)


if __name__ == '__main__':

    main()

 
在分析得到数据结果后,最好是要把数据画成图表,还好python有matplotlib库可以非常简单方便的用它来画图表,最后得到的数据图如下:
使用交易平台提供的api自动进行比特币交易研究 - ♂苹果 - 眼睛想旅行
 
从上到下,以次为成交量,卖一价,买一价,历史成交价,第二个图的卖一价,因为我的数据统计上有bug,把卖50价给加到了里边,所以变成了双线图,这个bug已经修改,只是还没有重新画图。这里只是为了说明思路,就不再画新图了。
通过手动数据分析,以及这几天对市场的观察,得出这些数据中,最重要的几个部分。
1,成交价,成交量
2,买单挂单价,挂单比特币数量
3,卖单挂单价,挂单比特币数量
4,数据获取时间
一共七个重要数据,整个市场的情况就需要我们从这七个数据中分析出结果来,以确定市场未来走向,方便我最终使用api进行自动下单交易,为自已挣些零花钱。
先说第一组数据,
1)历史成交价,历史成交量,这两个数据的变化趋势我们可以大体上估计出未来成交的价格点,以及未来市场趋势如何。具体的可以通过分时均价区线的变化得出大概方向。
2)历史成交价,告诉了我们以前市场的情况,和未来市可能的发展情况,但这些预测依然存大很大的不确定性,因为下一个成交订单的直接产生,应该是在买单或者卖单的挂单中产生的。这里对买卖挂单就一起来说怎么分析了,分析挂单时,我们就不能再只是单独的使用分时均价这东西了,因为挂单在价格上也是有分布的。所以这里我们要引入另一个控制因素,分价挂单量,真对不同价格的挂单量,我们要计算出在某个价格区间出售或者买入比特币的总价值,或者说是面积条。如下图,某网站给提供的挂单图:
使用交易平台提供的api自动进行比特币交易研究 - ♂苹果 - 眼睛想旅行
上边的绿色线条为卖家挂的订单,下边红色部分为买家挂的订单,左边的K线图就是历史成交数据以及几个不同时间的分时均价曲线。
对于均价的算法,经过仔细考虑,应该是所有成交价与其成交量的乘积再除以所有成交的比特币量。只有这样的算法才能比较完整的说明当前价格的真实情况。我打算用这种计算方法来算均价。能不能行要试来才能知道。
使用python画图手动分析数据,是为了自动根据市场数据让程序能根据市变化自动完成交易,好让我们从中受益,所以手动分析最后的最后其实是要我们设计一种数据分析的算法模型,有了这个分析算法,我们才能让程序7X24小时的不间段的为我们创收。
  好了,就总结到这里了,接下来几天还要继续研究算法。
  评论这张
 
阅读(224)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017