From f316cf2029b763889a26b90fce19cdb9f83535a8 Mon Sep 17 00:00:00 2001 From: eric o meehan Date: Mon, 26 Aug 2024 16:05:15 -0400 Subject: [PATCH] v0.0.2 --- Kraken.py | 83 +++++++++++++++++++++++++++++++++++++------- app.py | 81 ++++++++++++++++++++++++++++++++++++++++++ linear_regression.py | 8 ----- 3 files changed, 152 insertions(+), 20 deletions(-) create mode 100644 app.py delete mode 100644 linear_regression.py diff --git a/Kraken.py b/Kraken.py index 5713ca8..01af915 100644 --- a/Kraken.py +++ b/Kraken.py @@ -7,10 +7,75 @@ import time import urllib.parse class Kraken(): + ASSETS = [ + 'ZUSD', + 'XETH', + 'XXBT' + ] + ASSET_PAIRS = { - 'XBTUSD': 'XXBTZUSD' + 'ZUSD': { + 'ETHUSD': 'XETHZUSD', + 'XBTUSD': 'XXBTZUSD' + }, + 'XETH': { + 'ETHUSD': 'XETHZUSD', + 'ETHXBT': 'XETHXXBT' + }, + 'XXBT': { + 'ETHXBT': 'XETHXXBT', + 'XBTUSD': 'XXBTZUSD' + } } + class Order(): + + class Close(): + def __init__(self, ordertype, price, price2): + self.ordertype = ordertype + self.price = price + self.price2 = price2 + + def asdict(self): + data = { + 'ordertype': self.ordertype, + 'price': self.price + } + if self.price2: + data['price2'] = self.price2 + return data + + def __init__(self, ordertype, price, type, volume, close=None, pair=None, price2=None, timeinforce=None, userref=None): + self.close = close + self.ordertype = ordertype + self.pair = pair + self.price = price + self.price2 = price2 + self.timeinforce = timeinforce + self.type = type + self.userref = userref + self.volume = volume + + def asdict(self): + data = { + 'nonce': str(int(1000*time.time())), + 'ordertype': self.ordertype, + 'price': self.price, + 'type': self.type, + 'volume': self.volume + } + if self.close: + data['close'] = self.close + if self.pair: + data['pair'] = self.pair + if self.price2: + data['price2'] = self.price2 + if self.timeinforce: + data['timeinforce'] = self.timeinforce + if self.userref: + data['userref'] = self.userref + return data + def __init__(self): self.api_url = 'https://api.kraken.com/' self.api_token = os.getenv('KRAKEN_API_TOKEN') @@ -34,19 +99,13 @@ class Kraken(): 'API-Sign': self._get_kraken_signature(uri_path, data, self.api_sec) }, data=data - ) + ).json() def get_account_balance(self): return self._kraken_request('/0/private/Balance', {'nonce': str(int(1000*time.time()))}) + def add_order(self, order): + return self._kraken_request('/0/private/AddOrder', dict(order)) + def ohlc(self, asset_pair): - resp = requests.get(f'{self.api_url}/0/public/OHLC?pair={asset_pair}').json() - return { - 'time': [int(each[0]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'open': [float(each[1]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'high': [float(each[2]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'low': [float(each[3]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'close': [float(each[4]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'volume': [float(each[5]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]], - 'count': [float(each[6]) for each in resp['result'][self.ASSET_PAIRS[asset_pair]]] - } + return requests.get(f'{self.api_url}/0/public/OHLC?pair={asset_pair}').json() diff --git a/app.py b/app.py new file mode 100644 index 0000000..a59319f --- /dev/null +++ b/app.py @@ -0,0 +1,81 @@ +import numpy + +from dotenv import load_dotenv +from Kraken import Kraken +from scipy import stats + +load_dotenv() + +kraken = Kraken() +raw = { + asset: { + asset_pair: kraken.ohlc(asset_pair) for asset_pair in kraken.ASSET_PAIRS[asset] + } for asset in kraken.ASSETS + } +processed = { + asset: { + asset_pair: { + 'time': numpy.array( + [int(each[0]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'open': numpy.array( + [float(each[1]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'high': numpy.array( + [float(each[2]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'low': numpy.array( + [float(each[3]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'close': numpy.array( + [float(each[4]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'volume': numpy.array( + [float(each[5]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ), + 'count': numpy.array( + [float(each[6]) for each in raw[asset][asset_pair]['result'][kraken.ASSET_PAIRS[asset][asset_pair]]] + ) + } for asset_pair in kraken.ASSET_PAIRS[asset] + } for asset in kraken.ASSETS + } +linregresses = { + asset: { + asset_pair: { + 'open': stats.linregress( + processed[asset][asset_pair]['time'], + processed[asset][asset_pair]['open'] + ), + 'high': stats.linregress( + processed[asset][asset_pair]['time'], + processed[asset][asset_pair]['high'] + ), + 'low': stats.linregress( + processed[asset][asset_pair]['time'], + processed[asset][asset_pair]['low'] + ), + 'close': stats.linregress( + processed[asset][asset_pair]['time'], + processed[asset][asset_pair]['close'] + ) + } for asset_pair in kraken.ASSET_PAIRS[asset] + } for asset in kraken.ASSETS + } +slopes = { + asset: { + asset_pair: { + 'open': linregresses[asset][asset_pair]['open'].slope, + 'high': linregresses[asset][asset_pair]['high'].slope, + 'low': linregresses[asset][asset_pair]['low'].slope, + 'close': linregresses[asset][asset_pair]['close'].slope + } for asset_pair in kraken.ASSET_PAIRS[asset] + } for asset in kraken.ASSETS + } +averages = { + asset: { + asset_pair: sum( + [slopes[asset][asset_pair][each] for each in slopes[asset][asset_pair]] + )/4 for asset_pair in kraken.ASSET_PAIRS[asset] + } for asset in kraken.ASSETS + } +print(averages) diff --git a/linear_regression.py b/linear_regression.py deleted file mode 100644 index b0e3bf3..0000000 --- a/linear_regression.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy -from scipy import stats - -def linear_regression(timestamps, values): - x = numpy.array(timestamps) - y = numpy.array(values) - - return stats.linregress(x, y)