269 lines
8.1 KiB
Python
269 lines
8.1 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding:utf-8 -*-
|
||
"""
|
||
数字货币行情数据
|
||
Created on 2017年9月9日
|
||
@author: Jimmy Liu
|
||
@group : waditu
|
||
@contact: jimmysoa@sina.cn
|
||
"""
|
||
|
||
import pandas as pd
|
||
import traceback
|
||
import time
|
||
import json
|
||
try:
|
||
from urllib.request import urlopen, Request
|
||
except ImportError:
|
||
from urllib2 import urlopen, Request
|
||
|
||
|
||
URL = {
|
||
"hb": {
|
||
"rt" : 'http://api.huobi.com/staticmarket/ticker_%s_json.js',
|
||
"kline" : 'http://api.huobi.com/staticmarket/%s_kline_%s_json.js?length=%s',
|
||
"snapshot" : 'http://api.huobi.com/staticmarket/depth_%s_%s.js',
|
||
"tick" : 'http://api.huobi.com/staticmarket/detail_%s_json.js',
|
||
},
|
||
"ok": {
|
||
"rt" : 'https://www.okcoin.cn/api/v1/ticker.do?symbol=%s_cny',
|
||
"kline" : 'https://www.okcoin.cn/api/v1/kline.do?symbol=%s_cny&type=%s&size=%s',
|
||
"snapshot" : 'https://www.okcoin.cn/api/v1/depth.do?symbol=%s_cny&merge=&size=%s',
|
||
"tick" : 'https://www.okcoin.cn/api/v1/trades.do?symbol=%s_cny',
|
||
},
|
||
'chbtc': {
|
||
"rt" : 'http://api.chbtc.com/data/v1/ticker?currency=%s_cny',
|
||
"kline" : 'http://api.chbtc.com/data/v1/kline?currency=%s_cny&type=%s&size=%s',
|
||
"snapshot" : 'http://api.chbtc.com/data/v1/depth?currency=%s_cny&size=%s&merge=',
|
||
"tick" : 'http://api.chbtc.com/data/v1/trades?currency=%s_cny',
|
||
}
|
||
}
|
||
|
||
KTYPES = {
|
||
"D": {
|
||
"hb" : '100',
|
||
'ok' : '1day',
|
||
'chbtc' : '1day',
|
||
},
|
||
"W": {
|
||
"hb" : '200',
|
||
'ok' : '1week',
|
||
'chbtc' : '1week',
|
||
},
|
||
"M": {
|
||
"hb" : '300',
|
||
"ok" : '',
|
||
"chbtc" : '',
|
||
},
|
||
"1MIN": {
|
||
"hb" : '001',
|
||
'ok' : '1min',
|
||
'chbtc' : '1min',
|
||
},
|
||
"5MIN": {
|
||
"hb" : '005',
|
||
'ok' : '5min',
|
||
'chbtc' : '5min',
|
||
},
|
||
"15MIN": {
|
||
"hb" : '015',
|
||
'ok' : '15min',
|
||
'chbtc' : '15min',
|
||
},
|
||
"30MIN": {
|
||
"hb" : '030',
|
||
'ok' : '30min',
|
||
'chbtc' : '30min',
|
||
},
|
||
"60MIN": {
|
||
"hb" : '060',
|
||
'ok' : '1hour',
|
||
'chbtc' : '1hour',
|
||
},
|
||
}
|
||
|
||
|
||
def coins_tick(broker='hb', code='btc'):
|
||
"""
|
||
实时tick行情
|
||
params:
|
||
---------------
|
||
broker: hb:火币
|
||
ok:okCoin
|
||
chbtc:中国比特币
|
||
code: hb:btc,ltc
|
||
----okcoin---
|
||
btc_cny:比特币 ltc_cny:莱特币 eth_cny :以太坊 etc_cny :以太经典 bcc_cny :比特现金
|
||
----chbtc----
|
||
btc_cny:BTC/CNY
|
||
ltc_cny :LTC/CNY
|
||
eth_cny :以太币/CNY
|
||
etc_cny :ETC币/CNY
|
||
bts_cny :BTS币/CNY
|
||
eos_cny :EOS币/CNY
|
||
bcc_cny :BCC币/CNY
|
||
qtum_cny :量子链/CNY
|
||
hsr_cny :HSR币/CNY
|
||
return:json
|
||
---------------
|
||
hb:
|
||
{
|
||
"time":"1504713534",
|
||
"ticker":{
|
||
"symbol":"btccny",
|
||
"open":26010.90,
|
||
"last":28789.00,
|
||
"low":26000.00,
|
||
"high":28810.00,
|
||
"vol":17426.2198,
|
||
"buy":28750.000000,
|
||
"sell":28789.000000
|
||
}
|
||
}
|
||
ok:
|
||
{
|
||
"date":"1504713864",
|
||
"ticker":{
|
||
"buy":"28743.0",
|
||
"high":"28886.99",
|
||
"last":"28743.0",
|
||
"low":"26040.0",
|
||
"sell":"28745.0",
|
||
"vol":"20767.734"
|
||
}
|
||
}
|
||
chbtc:
|
||
{
|
||
u'date': u'1504794151878',
|
||
u'ticker': {
|
||
u'sell': u'28859.56',
|
||
u'buy': u'28822.89',
|
||
u'last': u'28859.56',
|
||
u'vol': u'2702.71',
|
||
u'high': u'29132',
|
||
u'low': u'27929'
|
||
}
|
||
}
|
||
|
||
|
||
"""
|
||
return _get_data(URL[broker]['rt'] % (code))
|
||
|
||
def coins_bar(broker='hb', code='btc', ktype='D', size='2000'):
|
||
"""
|
||
获取各类k线数据
|
||
params:
|
||
broker:hb,ok,chbtc
|
||
code:btc,ltc,eth,etc,bcc
|
||
ktype:D,W,M,1min,5min,15min,30min,60min
|
||
size:<2000
|
||
return DataFrame: 日期时间,开盘价,最高价,最低价,收盘价,成交量
|
||
"""
|
||
try:
|
||
js = _get_data(URL[broker]['kline'] % (code, KTYPES[ktype.strip().upper()][broker], size))
|
||
if js is None:
|
||
return js
|
||
if broker == 'chbtc':
|
||
js = js['data']
|
||
df = pd.DataFrame(js, columns=['DATE', 'OPEN', 'HIGH', 'LOW', 'CLOSE', 'VOL'])
|
||
if broker == 'hb':
|
||
if ktype.strip().upper() in ['D', 'W', 'M']:
|
||
df['DATE'] = df['DATE'].apply(lambda x: x[0:8])
|
||
else:
|
||
df['DATE'] = df['DATE'].apply(lambda x: x[0:12])
|
||
else:
|
||
df['DATE'] = df['DATE'].apply(lambda x: int2time(x / 1000))
|
||
if ktype.strip().upper() in ['D', 'W', 'M']:
|
||
df['DATE'] = df['DATE'].apply(lambda x: str(x)[0:10])
|
||
df['DATE'] = pd.to_datetime(df['DATE'])
|
||
return df
|
||
except Exception:
|
||
print(traceback.print_exc())
|
||
|
||
|
||
def coins_snapshot(broker='hb', code='btc', size='5'):
|
||
"""
|
||
获取实时快照数据
|
||
params:
|
||
broker:hb,ok,chbtc
|
||
code:btc,ltc,eth,etc,bcc
|
||
size:<150
|
||
return Panel: asks,bids
|
||
"""
|
||
try:
|
||
js = _get_data(URL[broker]['snapshot'] % (code, size))
|
||
if js is None:
|
||
return js
|
||
if broker == 'hb':
|
||
timestr = js['ts']
|
||
timestr = int2time(timestr / 1000)
|
||
if broker == 'ok':
|
||
timestr = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
|
||
if broker == 'chbtc':
|
||
timestr = js['timestamp']
|
||
timestr = int2time(timestr)
|
||
asks = pd.DataFrame(js['asks'], columns = ['price', 'vol'])
|
||
bids = pd.DataFrame(js['bids'], columns = ['price', 'vol'])
|
||
asks['time'] = timestr
|
||
bids['time'] = timestr
|
||
djs = {"asks": asks, "bids": bids}
|
||
pf = pd.Panel(djs)
|
||
return pf
|
||
except Exception:
|
||
print(traceback.print_exc())
|
||
|
||
|
||
def coins_trade(broker='hb', code='btc'):
|
||
"""
|
||
获取实时交易数据
|
||
params:
|
||
-------------
|
||
broker: hb,ok,chbtc
|
||
code:btc,ltc,eth,etc,bcc
|
||
|
||
return:
|
||
---------------
|
||
DataFrame
|
||
'tid':order id
|
||
'datetime', date time
|
||
'price' : trade price
|
||
'amount' : trade amount
|
||
'type' : buy or sell
|
||
"""
|
||
js = _get_data(URL[broker]['tick'] % code)
|
||
if js is None:
|
||
return js
|
||
if broker == 'hb':
|
||
df = pd.DataFrame(js['trades'])
|
||
df = df[['id', 'ts', 'price', 'amount', 'direction']]
|
||
df['ts'] = df['ts'].apply(lambda x: int2time(x / 1000))
|
||
if broker == 'ok':
|
||
df = pd.DataFrame(js)
|
||
df = df[['tid', 'date_ms', 'price', 'amount', 'type']]
|
||
df['date_ms'] = df['date_ms'].apply(lambda x: int2time(x / 1000))
|
||
if broker == 'chbtc':
|
||
df = pd.DataFrame(js)
|
||
df = df[['tid', 'date', 'price', 'amount', 'type']]
|
||
df['date'] = df['date'].apply(lambda x: int2time(x))
|
||
df.columns = ['tid', 'datetime', 'price', 'amount', 'type']
|
||
return df
|
||
|
||
|
||
def _get_data(url):
|
||
try:
|
||
request = Request(url)
|
||
lines = urlopen(request, timeout = 10).read()
|
||
if len(lines) < 50: #no data
|
||
return None
|
||
js = json.loads(lines.decode('GBK'))
|
||
return js
|
||
except Exception:
|
||
print(traceback.print_exc())
|
||
|
||
|
||
def int2time(timestamp):
|
||
value = time.localtime(timestamp)
|
||
dt = time.strftime('%Y-%m-%d %H:%M:%S', value)
|
||
return dt
|
||
|