In [ ]:
import datetime
def weekly_expiry():
    d = datetime.date.today()
    while d.weekday() != 5:
        d += datetime.timedelta(1)
    return d

In [ ]:
def  quarter_expiry():
    ref = datetime.date.today()
    if ref.month < 4:
        d = datetime.date(ref.year, 3, 31)
    elif ref.month < 7:
        d = datetime.date(ref.year, 6, 30)
    elif ref.month < 10:
        d = datetime.date(ref.year, 9, 30)
    else:
        d= datetime.date(ref.year, 12, 31)
    while d.weekday() != 5:
        d -= datetime.timedelta(1)
    return d
quarter_expiry()

In [ ]:
import json
import requests
import dateutil.parser
import matplotlib.pyplot as plt
import numpy as np

In [ ]:
#usdcny = requests.get('http://rate-exchange.appspot.com/currency?from=USD&to=CNY').json()['rate']
usdcny = 6.18



def get_data():
    retval = {}
    expiry = {}
    futures = {}
    expiry['week'] = weekly_expiry()
    expiry['next_week'] = weekly_expiry() + datetime.timedelta(7)
    expiry['quarter'] = quarter_expiry()
    retval['spot'] = {}

    bitFinexTick = requests.get("https://api.bitfinex.com/v1/ticker/btcusd")
    retval['spot']['bitfinex'] = bitFinexTick.json()['last_price']
    #bitmex
    data = requests.get('https://www.bitmex.com:443/api/v1/instrument/active').json()
    for contracttype in ["XBU", "XBT"]:
        symbols = []
        dates = []
        bids = []
        asks = []
        last = []
        for i in data:
            if i['rootSymbol'] == contracttype and i['buyLeg'] == "":
                dates.append(dateutil.parser.parse(i['expiry']))
                symbols.append(i['symbol'])
                bids.append(i['bidPrice'])
                asks.append(i['askPrice'])
                last.append(i['lastPrice'])
        futures["bitmex" + contracttype ] = {"dates": dates,
                                            "bids" : np.array(bids),
                                            "asks" : np.array(asks),
                                            "last" : np.array(last)}
        #okcoin
    symbols = []
    dates = []
    bids = []
    asks = []
    last = []
    for i in ["this_week", "next_week", "month", "quarter"]:
        response = requests.get('https://www.okcoin.com/api/future_ticker.do', params={"symbol": "btc_usd",
                                                                                       "contractType": i})
        data = response.json()["ticker"][0]
        d = datetime.date(int(str(data['contractId'])[0:4]),
                      int(str(data['contractId'])[4:6]),
                      int(str(data['contractId'])[6:8]))
        dates.append(d)
        bids.append(data["buy"])
        asks.append(data['sell'])
        last.append(data['last'])
    futures['okcoin'] = {"dates": dates,
                        "bids" : np.array(bids),
                        "asks" : np.array(asks),
                        "last": np.array(last)}
    #796
    data = requests.get("http://api.796.com/v3/futures/ticker.html?type=weekly").json()['ticker']
    futures['796'] = {'dates':[weekly_expiry()],
                     "bids" : np.array([float(data['buy'])]),
                     "asks" : np.array([float(data['sell'])]),
                     "last" : np.array([float(data['last'])])}
    data = requests.get("http://api.796.com/v3/futures/ticker.html?type=btccnyweeklyfutures").json()['ticker']
    if float(data['buy']) > 0.0 and float(data['sell']) > 0.0:
        futures['796CNY'] = {'dates':[weekly_expiry()],
                         "bids" : np.array([float(data['buy'])/usdcny]),
                         "asks" : np.array([float(data['sell'])/usdcny]),
                         "last" : np.array([float(data['last'])/usdcny])}
    # bitvic
    dates= []
    bids = []
    asks = []
    last = []
    for i in ["week", "next_week", "quarter"]:
        data = requests.get('http://market.bitvc.com/futures/ticker_btc_' + i + '.js').json()
        dates.append(expiry[i])
        bids.append(data['buy'])
        asks.append(data['sell'])
        last.append(data['last'])
    futures['bitvc'] = {'dates':dates,
                     "bids" : np.array(bids).astype(float)/usdcny,
                     "asks" : np.array(asks).astype(float)/usdcny,
                     "last" : np.array(last).astype(float)/usdcny}      
    retval['futures'] = futures
    return retval

In [ ]:
def plotme(data):
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    plt.margins(x=0.1, y=0.1)
    for k, v in data['futures'].items():
        ax.errorbar(v['dates'], v['last'], 
                    yerr=[v['last']-v['asks'], 
                          v['bids']-v['last']], fmt="o")

In [ ]:
def plot_rates(data):
    spot = data['spot']['bitfinex']
    now = datetime.datetime.now()
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    plt.margins(x=0.1, y=0.1)
    for k, v in data['futures'].items():
        t = list(map (lambda x : (x-now).days, v['dates']))
        print(t)
        r = log(v['last']/spot)/t
        ax.errorbar(v['dates'], r)

In [ ]:
%matplotlib inline
data = get_data()
plotme(data)

In [ ]:
print(data)

In [ ]: