From 03b5877206e120c03a738b5e275e8643e435741f Mon Sep 17 00:00:00 2001 From: eric o meehan Date: Tue, 3 Sep 2024 23:57:47 -0400 Subject: [PATCH] v0.0.4 --- .env_example | 5 +++- app.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/.env_example b/.env_example index 1f4fe0f..b55dda3 100644 --- a/.env_example +++ b/.env_example @@ -1,3 +1,6 @@ KRAKEN_URL = "https://api.kraken.com" -KRAKEN_API_TOKEN = +KRAKEN_API_TOKEN = KRAKEN_API_SEC = +R_VALUE_TARGET = +INVESTMENT_COUNT = +INVESTMENT_VOLUME = diff --git a/app.py b/app.py index 0aee405..0e5685a 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,5 @@ import krakenex +import os import pandas from dotenv import load_dotenv @@ -10,19 +11,71 @@ k = krakenex.API() k.load_key('kraken.key') kraken = KrakenAPI(k, tier='Pro') -def get_markets_by_asset(asset): - tradable_asset_pairs = kraken.get_tradable_asset_pairs() +def filter_asset_pairs(tradable_asset_pairs): return tradable_asset_pairs[ - ((tradable_asset_pairs['base'] == asset | tradable_asset_pairs['quote'] == asset) - & (tradable_asset_pairs['status'] == 'online')) + (tradable_asset_pairs['quote'] == 'ZUSD') & + (tradable_asset_pairs['status'] == 'online') ] -def get_ohlc_linear_regression(ohlc): - regressions = pandas.DataFrame({ +def model_asset_pair(asset_pair): + sleep(1) + ohlc = kraken.get_ohlc_data(asset_pair)[0] + model = pandas.DataFrame({ 'open': linregress(ohlc['time'].astype(float), ohlc['open'].astype(float)), 'high': linregress(ohlc['time'].astype(float), ohlc['high'].astype(float)), 'low': linregress(ohlc['time'].astype(float), ohlc['low'].astype(float)), 'close': linregress(ohlc['time'].astype(float), ohlc['close'].astype(float)) }).transpose() - regressions.columns = ['slope', 'intercept', 'r_value', 'p_value', 'stderr'] - return regressions + model.columns = ['slope', 'intercept', 'r_value', 'p_value', 'stderr'] + return model + +def grade_models(models): + model_averages = pandas.DataFrame({ + model: { + 'slope': models[model].slope.mean(), + 'intercept': models[model].intercept.mean(), + 'r_value': models[model].r_value.mean(), + 'p_value': models[model].p_value.mean(), + 'stderr': models[model].stderr.mean() + } for model in models + }).transpose() + filtered_models = model_averages[model_averages['r_value'] >= os.getenv('R_VALUE_TARGET')] + return filtered_models.sort_values(by='slope', ascending=False) + +def sell_asset(market, volume): + kraken.add_standard_order( + ordertype = 'market', + type = 'sell', + pair = market, + volume = volume + ) + +def buy_asset(market, volume): + kraken.add_standard_order( + ordertype = 'market', + type = 'buy', + pair = market, + volume = volume + ) + +if __name__ == '__main__': + load_dotenv() + + asset_pairs = filter_asset_pairs(kraken.get_tradable_asset_pairs()) + graded_models = grade_models( + {asset_pair: model_asset_pair(asset_pair) for asset_pair in asset_pairs.index} + ) + + account_balance = kraken.get_account_balance() + for asset in account_balance.index.drop('ZUSD'): + market = asset_pairs[asset_pairs['base'] == asset] + if market.index[0] not in graded_models[:5].index: + sell_asset(market, account_balance.loc[asset].vol) + + while len(account_balance := kraken.get_account_balance()) - 1 < os.getenv('INVESTMENT_COUNT'): + if account_balance.loc['ZUSD'] <= os.getenv('INVESTMENT_VOLUME'): + break + for market in graded_models: + if asset_pairs.loc[market].base not in account_balance.index: + buy_asset(market, os.getenv('INVESTMENT_VOLUME')) + break