This commit is contained in:
Eric Meehan 2024-09-09 09:46:21 -04:00
parent 03b5877206
commit f0cb853984

48
app.py
View File

@ -1,14 +1,23 @@
import krakenex import krakenex
import os import os
import pandas import pandas
import time
from dotenv import load_dotenv from dotenv import load_dotenv
from pykrakenapi import KrakenAPI from pykrakenapi import KrakenAPI
from scipy.stats import linregress from scipy.stats import linregress
from time import sleep from time import sleep
k = krakenex.API() load_dotenv()
k.load_key('kraken.key')
R_VALUE_TARGET = float(os.getenv('R_VALUE_TARGET'))
INVESTMENT_COUNT = int(os.getenv('INVESTMENT_COUNT'))
INVESTMENT_VOLUME = float(os.getenv('INVESTMENT_VOLUME'))
k = krakenex.API(
os.getenv('KRAKEN_API_TOKEN'),
os.getenv('KRAKEN_API_SEC')
)
kraken = KrakenAPI(k, tier='Pro') kraken = KrakenAPI(k, tier='Pro')
def filter_asset_pairs(tradable_asset_pairs): def filter_asset_pairs(tradable_asset_pairs):
@ -18,8 +27,8 @@ def filter_asset_pairs(tradable_asset_pairs):
] ]
def model_asset_pair(asset_pair): def model_asset_pair(asset_pair):
sleep(1)
ohlc = kraken.get_ohlc_data(asset_pair)[0] ohlc = kraken.get_ohlc_data(asset_pair)[0]
sleep(kraken.factor)
model = pandas.DataFrame({ model = pandas.DataFrame({
'open': linregress(ohlc['time'].astype(float), ohlc['open'].astype(float)), 'open': linregress(ohlc['time'].astype(float), ohlc['open'].astype(float)),
'high': linregress(ohlc['time'].astype(float), ohlc['high'].astype(float)), 'high': linregress(ohlc['time'].astype(float), ohlc['high'].astype(float)),
@ -39,7 +48,10 @@ def grade_models(models):
'stderr': models[model].stderr.mean() 'stderr': models[model].stderr.mean()
} for model in models } for model in models
}).transpose() }).transpose()
filtered_models = model_averages[model_averages['r_value'] >= os.getenv('R_VALUE_TARGET')] filtered_models = model_averages[
(model_averages['r_value'] >= R_VALUE_TARGET) &
(model_averages['slope'] > 0)
]
return filtered_models.sort_values(by='slope', ascending=False) return filtered_models.sort_values(by='slope', ascending=False)
def sell_asset(market, volume): def sell_asset(market, volume):
@ -47,21 +59,26 @@ def sell_asset(market, volume):
ordertype = 'market', ordertype = 'market',
type = 'sell', type = 'sell',
pair = market, pair = market,
volume = volume volume = volume,
validate = False
) )
sleep(kraken.factor)
print(f"Sold {volume} on {market}")
def buy_asset(market, volume): def buy_asset(market, volume):
kraken.add_standard_order( kraken.add_standard_order(
ordertype = 'market', ordertype = 'market',
type = 'buy', type = 'buy',
pair = market, pair = market,
volume = volume volume = volume,
validate = False
) )
print(f"Purchased {volume} on {market}")
sleep(kraken.factor)
if __name__ == '__main__': def main():
load_dotenv()
asset_pairs = filter_asset_pairs(kraken.get_tradable_asset_pairs()) asset_pairs = filter_asset_pairs(kraken.get_tradable_asset_pairs())
sleep(kraken.factor)
graded_models = grade_models( graded_models = grade_models(
{asset_pair: model_asset_pair(asset_pair) for asset_pair in asset_pairs.index} {asset_pair: model_asset_pair(asset_pair) for asset_pair in asset_pairs.index}
) )
@ -72,10 +89,15 @@ if __name__ == '__main__':
if market.index[0] not in graded_models[:5].index: if market.index[0] not in graded_models[:5].index:
sell_asset(market, account_balance.loc[asset].vol) sell_asset(market, account_balance.loc[asset].vol)
while len(account_balance := kraken.get_account_balance()) - 1 < os.getenv('INVESTMENT_COUNT'): while len(account_balance := kraken.get_account_balance()) - 1 < INVESTMENT_COUNT:
if account_balance.loc['ZUSD'] <= os.getenv('INVESTMENT_VOLUME'): if account_balance.loc['ZUSD'].vol <= INVESTMENT_VOLUME:
break break
for market in graded_models: for market in graded_models.index:
if asset_pairs.loc[market].base not in account_balance.index: if asset_pairs.loc[market].base not in account_balance.index:
buy_asset(market, os.getenv('INVESTMENT_VOLUME')) ohlc, last = kraken.get_ohlc_data(market)
volume = INVESTMENT_VOLUME/ohlc.iloc[-1].close
buy_asset(market, volume)
break break
if __name__ == '__main__':
main()