From 9bb12eb7818f0af9f70033c95cc73f29674d6d56 Mon Sep 17 00:00:00 2001 From: Frederic Fortier Date: Wed, 3 Jan 2018 22:59:07 -0500 Subject: [PATCH] BLD: adjusting sample algorithmns for validation --- catalyst/constants.py | 2 +- catalyst/examples/buy_low_sell_high.py | 93 ++++++------ catalyst/examples/buy_low_sell_high_live.py | 155 -------------------- catalyst/examples/mean_reversion_simple.py | 2 +- 4 files changed, 48 insertions(+), 204 deletions(-) delete mode 100644 catalyst/examples/buy_low_sell_high_live.py diff --git a/catalyst/constants.py b/catalyst/constants.py index c4111fdd..8cfd3a6b 100644 --- a/catalyst/constants.py +++ b/catalyst/constants.py @@ -7,7 +7,7 @@ import logbook For example, if you want to see the DEBUG messages, run: $ export CATALYST_LOG_LEVEL=10 ''' -LOG_LEVEL = int(os.environ.get('CATALYST_LOG_LEVEL', logbook.INFO)) +LOG_LEVEL = int(os.environ.get('CATALYST_LOG_LEVEL', logbook.DEBUG)) SYMBOLS_URL = 'https://s3.amazonaws.com/enigmaco/catalyst-exchanges/' \ '{exchange}/symbols.json' diff --git a/catalyst/examples/buy_low_sell_high.py b/catalyst/examples/buy_low_sell_high.py index f1ec25d7..51f965b4 100644 --- a/catalyst/examples/buy_low_sell_high.py +++ b/catalyst/examples/buy_low_sell_high.py @@ -1,20 +1,7 @@ -''' -This algorithm requires an additional library (ta-lib) beyond those -required by catalyst. Install it first by running: -$ pip install TA-Lib - -If you get build errors like: - "fatal error: ta-lib/ta_libc.h: No such file or directory" -it typically means that it can't find the underlying TA-Lib library and it -needs to be installed. See https://mrjbq7.github.io/ta-lib/install.html for -instructions on how to install the required dependencies. -''' - -import pandas as pd import talib +import pandas as pd from logbook import Logger -from catalyst import run_algorithm from catalyst.api import ( order, order_target_percent, @@ -23,53 +10,51 @@ from catalyst.api import ( get_open_orders, ) from catalyst.exchange.utils.stats_utils import get_pretty_stats +from catalyst.utils.run_algo import run_algorithm -algo_namespace = 'buy_low_sell_high_xrp' -log = Logger(algo_namespace) +algo_namespace = 'buy_the_dip_live' +log = Logger('buy low sell high') def initialize(context): log.info('initializing algo') - context.ASSET_NAME = 'XRP_USDT' + context.ASSET_NAME = 'btc_usdt' context.asset = symbol(context.ASSET_NAME) - context.TARGET_POSITIONS = 5000 + context.TARGET_POSITIONS = 30 context.PROFIT_TARGET = 0.1 - context.SLIPPAGE_ALLOWED = 0.05 - - context.swallow_errors = True + context.SLIPPAGE_ALLOWED = 0.02 context.errors = [] pass def _handle_data(context, data): + price = data.current(context.asset, 'price') + log.info('got price {price}'.format(price=price)) + prices = data.history( context.asset, fields='price', bar_count=20, - frequency='15m' + frequency='1D' ) - rsi = talib.RSI(prices.values, timeperiod=14)[-1] log.info('got rsi: {}'.format(rsi)) # Buying more when RSI is low, this should lower our cost basis if rsi <= 30: - buy_increment = 50 + buy_increment = 1 elif rsi <= 40: - buy_increment = 20 + buy_increment = 0.5 elif rsi <= 70: - buy_increment = 5 + buy_increment = 0.2 else: - buy_increment = None + buy_increment = 0.1 cash = context.portfolio.cash log.info('base currency available: {cash}'.format(cash=cash)) - price = data.current(context.asset, 'price') - log.info('got price {price}'.format(price=price)) - record( price=price, rsi=rsi, @@ -137,11 +122,11 @@ def _handle_data(context, data): def handle_data(context, data): log.info('handling bar {}'.format(data.current_dt)) - try: - _handle_data(context, data) - except Exception as e: - log.warn('aborting the bar on error {}'.format(e)) - context.errors.append(e) + # try: + _handle_data(context, data) + # except Exception as e: + # log.warn('aborting the bar on error {}'.format(e)) + # context.errors.append(e) log.info('completed bar {}, total execution errors {}'.format( data.current_dt, @@ -158,15 +143,29 @@ def analyze(context, stats): if __name__ == '__main__': - run_algorithm( - capital_base=10000, - data_frequency='daily', - initialize=initialize, - handle_data=handle_data, - analyze=analyze, - exchange_name='poloniex', - algo_namespace='buy_and_hodl', - base_currency='usd', - start=pd.to_datetime('2015-03-01', utc=True), - end=pd.to_datetime('2017-10-31', utc=True), - ) + live = False + if live: + run_algorithm( + capital_base=0.001, + initialize=initialize, + handle_data=handle_data, + analyze=analyze, + exchange_name='binance', + live=True, + algo_namespace=algo_namespace, + base_currency='btc', + simulate_orders=True, + ) + else: + run_algorithm( + capital_base=10000, + data_frequency='daily', + initialize=initialize, + handle_data=handle_data, + analyze=analyze, + exchange_name='poloniex', + algo_namespace='buy_and_hodl', + base_currency='usdt', + start=pd.to_datetime('2015-03-01', utc=True), + end=pd.to_datetime('2017-10-31', utc=True), + ) diff --git a/catalyst/examples/buy_low_sell_high_live.py b/catalyst/examples/buy_low_sell_high_live.py deleted file mode 100644 index 3cfc1051..00000000 --- a/catalyst/examples/buy_low_sell_high_live.py +++ /dev/null @@ -1,155 +0,0 @@ -import talib -from logbook import Logger - -from catalyst.api import ( - order, - order_target_percent, - symbol, - record, - get_open_orders, -) -from catalyst.exchange.utils.stats_utils import get_pretty_stats -from catalyst.utils.run_algo import run_algorithm - -algo_namespace = 'buy_the_dip_live' -log = Logger('buy low sell high') - - -def initialize(context): - log.info('initializing algo') - context.ASSET_NAME = 'btc_usdt' - context.asset = symbol(context.ASSET_NAME) - - context.TARGET_POSITIONS = 30 - context.PROFIT_TARGET = 0.1 - context.SLIPPAGE_ALLOWED = 0.02 - - context.errors = [] - pass - - -def _handle_data(context, data): - price = data.current(context.asset, 'price') - log.info('got price {price}'.format(price=price)) - - prices = data.history( - context.asset, - fields='price', - bar_count=20, - frequency='1D' - ) - rsi = talib.RSI(prices.values, timeperiod=14)[-1] - log.info('got rsi: {}'.format(rsi)) - - # Buying more when RSI is low, this should lower our cost basis - if rsi <= 30: - buy_increment = 1 - elif rsi <= 40: - buy_increment = 0.5 - elif rsi <= 70: - buy_increment = 0.2 - else: - buy_increment = 0.1 - - cash = context.portfolio.cash - log.info('base currency available: {cash}'.format(cash=cash)) - - record( - price=price, - rsi=rsi, - ) - - orders = get_open_orders(context.asset) - if orders: - log.info('skipping bar until all open orders execute') - return - - is_buy = False - cost_basis = None - if context.asset in context.portfolio.positions: - position = context.portfolio.positions[context.asset] - - cost_basis = position.cost_basis - log.info( - 'found {amount} positions with cost basis {cost_basis}'.format( - amount=position.amount, - cost_basis=cost_basis - ) - ) - - if position.amount >= context.TARGET_POSITIONS: - log.info('reached positions target: {}'.format(position.amount)) - return - - if price < cost_basis: - is_buy = True - elif (position.amount > 0 - and price > cost_basis * (1 + context.PROFIT_TARGET)): - profit = (price * position.amount) - (cost_basis * position.amount) - log.info('closing position, taking profit: {}'.format(profit)) - order_target_percent( - asset=context.asset, - target=0, - limit_price=price * (1 - context.SLIPPAGE_ALLOWED), - ) - else: - log.info('no buy or sell opportunity found') - else: - is_buy = True - - if is_buy: - if buy_increment is None: - log.info('the rsi is too high to consider buying {}'.format(rsi)) - return - - if price * buy_increment > cash: - log.info('not enough base currency to consider buying') - return - - log.info( - 'buying position cheaper than cost basis {} < {}'.format( - price, - cost_basis - ) - ) - order( - asset=context.asset, - amount=buy_increment, - limit_price=price * (1 + context.SLIPPAGE_ALLOWED) - ) - - -def handle_data(context, data): - log.info('handling bar {}'.format(data.current_dt)) - # try: - _handle_data(context, data) - # except Exception as e: - # log.warn('aborting the bar on error {}'.format(e)) - # context.errors.append(e) - - log.info('completed bar {}, total execution errors {}'.format( - data.current_dt, - len(context.errors) - )) - - if len(context.errors) > 0: - log.info('the errors:\n{}'.format(context.errors)) - - -def analyze(context, stats): - log.info('the daily stats:\n{}'.format(get_pretty_stats(stats))) - pass - - -if __name__ == '__main__': - run_algorithm( - capital_base=0.001, - initialize=initialize, - handle_data=handle_data, - analyze=analyze, - exchange_name='binance', - live=True, - algo_namespace=algo_namespace, - base_currency='btc', - simulate_orders=True, - ) diff --git a/catalyst/examples/mean_reversion_simple.py b/catalyst/examples/mean_reversion_simple.py index 23ca036a..bb2d35a3 100644 --- a/catalyst/examples/mean_reversion_simple.py +++ b/catalyst/examples/mean_reversion_simple.py @@ -244,7 +244,7 @@ def analyze(context=None, perf=None): if __name__ == '__main__': # The execution mode: backtest or live - MODE = 'live' + MODE = 'backtest' if MODE == 'backtest': folder = os.path.join(