82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
import krakenex
|
|
import os
|
|
import pandas
|
|
|
|
from dotenv import load_dotenv
|
|
from pykrakenapi import KrakenAPI
|
|
from scipy.stats import linregress
|
|
from time import sleep
|
|
|
|
k = krakenex.API()
|
|
k.load_key('kraken.key')
|
|
kraken = KrakenAPI(k, tier='Pro')
|
|
|
|
def filter_asset_pairs(tradable_asset_pairs):
|
|
return tradable_asset_pairs[
|
|
(tradable_asset_pairs['quote'] == 'ZUSD') &
|
|
(tradable_asset_pairs['status'] == 'online')
|
|
]
|
|
|
|
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()
|
|
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
|