def _create_wallet_source(wallet: 'Wallet', include_worth: bool = True) -> 'List[Stream[float]]': """Creates a list of streams to describe a `Wallet`. Parameters ---------- wallet : `Wallet` The wallet to make streams for. include_worth : bool, default True Whether or Returns ------- `List[Stream[float]]` A list of streams to describe the `wallet`. """ exchange_name = wallet.exchange.name symbol = wallet.instrument.symbol streams = [] with NameSpace(exchange_name + ":/" + symbol): free_balance = Stream.sensor(wallet, lambda w: w.balance.as_float(), dtype="float").rename("free") locked_balance = Stream.sensor(wallet, lambda w: w.locked_balance.as_float(), dtype="float").rename("locked") total_balance = Stream.sensor(wallet, lambda w: w.total_balance.as_float(), dtype="float").rename("total") streams += [free_balance, locked_balance, total_balance] if include_worth: price = Stream.select(wallet.exchange.streams(), lambda node: node.name.endswith(symbol)) worth = price.mul(total_balance).rename('worth') streams += [worth] return streams
def __init__(self, price: 'Stream'): super().__init__() self.position = -1 r = Stream.sensor(price, lambda p: p.value, dtype="float").diff() position = Stream.sensor(self, lambda rs: rs.position, dtype="float") reward = (r * position).fillna(0).rename("reward") self.feed = DataFeed([reward]) self.feed.compile()
def __init__(self, price: 'Stream') -> None: super().__init__() self.position = -1 self.executed = 0 r = (Stream.sensor(price, lambda p: p.value, dtype="float").pct_change()) #.log10()).diff() position = Stream.sensor(self, lambda rs: rs.position, dtype="float") executed = Stream.sensor(self, lambda rs: rs.executed, dtype="float") reward = (position * r - executed).fillna(0).rename("reward") self.feed = DataFeed([reward]) self.feed.compile()
def __init__(self, price: 'Stream') -> None: super().__init__() self.position = -1 ## PBR works when commissions are negligible. ## Need to modify the following line to make it work for cases where commissions are substantial: ###NOTE: the agent learns to hold its position when abs(r) < commission #r = Stream.sensor(price, lambda p: p.value, dtype="float").diff() r = Stream.sensor(price, lambda p: p.value, dtype="float").pct_change() position = Stream.sensor(self, lambda rs: rs.position, dtype="float") reward = ((position * r).fillna(0)).rename("reward") self.feed = DataFeed([reward]) self.feed.compile()
def __init__(self, price: 'Stream') -> None: super().__init__() self.position = 0 self.price = 0 self.pre_networth = 0 r = Stream.sensor(price, lambda p: p.value, dtype="float").diff() position = Stream.sensor(self, lambda rs: rs.position, dtype="float") reward = (position * r).fillna(0).rename("reward") self.feed = DataFeed([reward]) self.feed.compile()
def create_env_for_predicting(config): t = price_history['Close'] p = Stream.source(t.tolist(), dtype="float").rename("USD-BTC") bitfinex = Exchange("bitfinex", service=execute_order)(Stream.source( price_history['Close'].tolist(), dtype="float").rename("USD-BTC")) cash = Wallet(bitfinex, 100000 * USD) asset = Wallet(bitfinex, 0 * BTC) portfolio = Portfolio(USD, [cash, asset]) feed = DataFeed([ p, p.rolling(window=10).mean().rename("fast"), p.rolling(window=50).mean().rename("medium"), p.rolling(window=100).mean().rename("slow"), p.log().diff().fillna(0).rename("lr") ]) reward_scheme = PBR(price=p) action_scheme = BSH(cash=cash, asset=asset).attach(reward_scheme) renderer_feed = DataFeed([ Stream.source(price_history['Close'].tolist(), dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") ]) environment = default.create(feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, renderer_feed=renderer_feed, renderer=PositionChangeChart(), window_size=config["window_size"], max_allowed_loss=0.6) return environment
def create_env(config): x = np.arange(0, 2 * np.pi, 2 * np.pi / 1001) y = 50 * np.sin(3 * x) + 100 x = np.arange(0, 2 * np.pi, 2 * np.pi / 1000) p = Stream.source(y, dtype="float").rename("USD-TTC") coinbase = Exchange("coinbase", service=execute_order)(p) cash = Wallet(coinbase, 100000 * USD) asset = Wallet(coinbase, 0 * TTC) portfolio = Portfolio(USD, [cash, asset]) feed = DataFeed([ p, p.rolling(window=10).mean().rename("fast"), p.rolling(window=50).mean().rename("medium"), p.rolling(window=100).mean().rename("slow"), p.log().diff().fillna(0).rename("lr") ]) reward_scheme = PBR(price=p) action_scheme = BSH(cash=cash, asset=asset).attach(reward_scheme) renderer_feed = DataFeed([ Stream.source(y, dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") ]) chart_renderer = PlotlyTradingChart( display=True, # show the chart on screen (default) height= 800, # affects both displayed and saved file height. None for 100% height. save_format="html", # save the chart to an HTML file auto_open_html=True, # open the saved HTML chart in a new browser tab ) import uuid uid = uuid.uuid4() callback = LoggingCallback(f'/Users/vkrot/callback-{uid}', chart_renderer) environment = default.create( feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, renderer_feed=renderer_feed, # renderer=PositionChangeChart(), renderer=PositionChangeChart(), window_size=config["window_size"], max_allowed_loss=0.6, callback=callback) return environment
def create_env_sin(config): x = np.arange(0, 2 * np.pi, 2 * np.pi / 1001) y = 50 * np.sin(3 * x) + 100 x = np.arange(0, 2 * np.pi, 2 * np.pi / 1000) p = Stream.source(y, dtype="float").rename("USD-TTC") bitfinex = Exchange("bitfinex", service=execute_order)(p) cash = Wallet(bitfinex, 10000 * USD) asset = Wallet(bitfinex, 0 * TTC) portfolio = Portfolio(USD, [cash, asset]) feed = DataFeed([ p, p.rolling(window=10).mean().rename("fast"), p.rolling(window=50).mean().rename("medium"), p.rolling(window=100).mean().rename("slow"), p.log().diff().fillna(0).rename("lr") ]) reward_scheme = default.rewards.PBREX(price=p) #action_scheme = default.actions.BSHEX( # cash=cash, # asset=asset #).attach(reward_scheme) action_scheme = default.actions.SimpleOrders( trade_sizes=3).attach(reward_scheme) renderer_feed = DataFeed([ Stream.source(y, dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") ]) environment = default.create(feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, renderer_feed=renderer_feed, renderer=PositionChangeChart(), window_size=config["window_size"], max_allowed_loss=0.6) return environment
def create_env(config): df = load_csv('btc_usdt_m5_history.csv') y = df['close'].tolist() p = Stream.source(y, dtype="float").rename("USD-TTC") bitfinex = Exchange("bitfinex", service=execute_order)(p) cash = Wallet(bitfinex, 100000 * USD) asset = Wallet(bitfinex, 0 * TTC) portfolio = Portfolio(USD, [cash, asset]) feed = DataFeed([ p, p.rolling(window=10).mean().rename("fast"), p.rolling(window=50).mean().rename("medium"), p.rolling(window=100).mean().rename("slow"), p.log().diff().fillna(0).rename("lr") ]) reward_scheme = SimpleProfit(window_size=12) action_scheme = ManagedRiskOrders() renderer_feed = DataFeed([ Stream.source(y, dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") ]) environment = default.create( feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, renderer_feed=renderer_feed, renderer=default.renderers.PlotlyTradingChart(), window_size=config["window_size"], max_allowed_loss=0.6) return environment
def create_env(config): x = np.arange(0, 2 * np.pi, 2 * np.pi / 1001) y = 50 * np.sin(3 * x) + 100 p = Stream.source(y, dtype="float").rename("USD-TTC") coinbase = Exchange("coinbase", service=execute_order)(p) cash = Wallet(coinbase, 10000 * USD) asset = Wallet(coinbase, 0 * TTC) portfolio = Portfolio(USD, [cash, asset]) feed = DataFeed([ p, p.ewm(span=10).mean().rename("fast"), p.ewm(span=50).mean().rename("medium"), p.ewm(span=100).mean().rename("slow"), p.log().diff().fillna(0).rename("lr") ]) reward_scheme = PBR(price=p) action_scheme = BSH(cash=cash, asset=asset).attach(reward_scheme) renderer_feed = DataFeed([ Stream.source(y, dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") ]) environment = default.create(feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, renderer_feed=renderer_feed, renderer=PositionChangeChart(), window_size=config["window_size"], max_allowed_loss=0.6) return environment
def create_env(config, train="train"): cdd = CryptoDataDownload() data = cdd.fetch("Bitstamp", "USD", "BTC", "1h") if False: data.close = data.close / 20 + range(len(data)) print("genenrating fake increase") if train == "train": data = data[0:int(len(data) / 2)] # training print("using first half for training") elif train == "eval": data = data[int(len(data) / 2):] # validation print("using second half for eval") else: print("using all data") pclose = Stream.source(list(data.close), dtype="float").rename("USD-BTC") pmin = Stream.source(list(data.low), dtype="float").rename("USD-BTClow") pmax = Stream.source(list(data.high), dtype="float").rename("USD-BTChigh") pmin = Stream.source(list(data.low), dtype="float").rename("USD-BTClow") pmax = Stream.source(list(data.high), dtype="float").rename("USD-BTChigh") pmin3 = pmin.rolling(window=3).min() pmin10 = pmin.rolling(window=10).min() pmin20 = pmin.rolling(window=20).min() pmax3 = pmax.rolling(window=3).max() pmax10 = pmax.rolling(window=10).max() pmax20 = pmax.rolling(window=20).max() eo = ExchangeOptions(commission=0.002) # coinbase = Exchange("coinbase", service=execute_order, options=eo)( pclose ) cash = Wallet(coinbase, 100000 * USD) asset = Wallet(coinbase, 0 * BTC) portfolio = Portfolio(USD, [ cash, asset ]) feed = DataFeed([ (pclose.log() - pmin3.log()).fillna(0).rename("relmin3"), (pclose.log() - pmin10.log()).fillna(0).rename("relmin10"), (pclose.log() - pmin20.log()).fillna(0).rename("relmin20"), (pclose.log() - pmax3.log()).fillna(0).rename("relmax3"), (pclose.log() - pmax10.log()).fillna(0).rename("relmax10"), (pclose.log() - pmax20.log()).fillna(0).rename("relmax20"), ]) action_scheme = BSH(cash=cash, asset=asset) renderer_feed = DataFeed([ Stream.source(list(data.close), dtype="float").rename("price"), Stream.sensor(action_scheme, lambda s: s.action, dtype="float").rename("action") # only works for BSH ]) environment = default.create( feed=feed, portfolio=portfolio, action_scheme=action_scheme, reward_scheme="simple", renderer_feed=renderer_feed, renderer=PositionChangeChart(), window_size=config["window_size"], min_periods=20, max_allowed_loss=0.6 ) return environment
def build_env(config): worker_index = 1 if hasattr(config, 'worker_index'): worker_index = config.worker_index raw_data = pd.read_csv(btc_usd_file, sep=';') raw_data['date'] = pd.to_datetime(raw_data['time'], unit='ms') data = compute_features(raw_data) features = [] for c in data.columns: if c not in raw_data.columns: s = Stream.source(list(data[c]), dtype="float").rename(data[c].name) features += [s] comm = 0.00001 coinbase = Exchange("coinbase", service=execute_order, options=ExchangeOptions(commission=comm))( Stream.source(list(data["close"]), dtype="float").rename("USD-BTC")) cash = Wallet(coinbase, 10000 * USD) asset = Wallet(coinbase, 0 * BTC) portfolio = Portfolio(USD, [cash, asset]) renderer_feed = DataFeed([ Stream.source(list(data["date"])).rename("date"), Stream.source(list(data["open"]), dtype="float").rename("open"), Stream.source(list(data["high"]), dtype="float").rename("high"), Stream.source(list(data["low"]), dtype="float").rename("low"), Stream.source(list(data["close"]), dtype="float").rename("close"), Stream.source(list(data["volume"]), dtype="float").rename("volume") ]) # reward_scheme = rewards.SimpleProfit() rsi = Stream.select(features, lambda x: x.name == "rsi") reward_scheme = SparseReward(rsi=rsi, window_size=10) action_scheme = BuySellHoldActionSchemes(cash, asset) action_scheme.attach(reward_scheme) plotly = PlotlyTradingChart(display=True, height=700, save_format="html") class EpisodeStopper(Stopper): def stop(self, env: 'TradingEnv') -> bool: return env.clock.num_steps > 1000 open_position = Stream.sensor(asset, lambda a: asset.total_balance.as_float() > 0) # open_position = Stream.sensor( # action_scheme, lambda action_scheme: action_scheme.has_asset # ) features.append(open_position) feed = DataFeed(features) feed.compile() env = default.create( portfolio=portfolio, action_scheme=action_scheme, reward_scheme=reward_scheme, feed=feed, renderer_feed=renderer_feed, renderer=plotly, window_size=20, max_allowed_loss=0.5, stopper=EpisodeStopper(), callback=(LoggingCallback('http://165.227.193.153:8050', plotly) if worker_index == 1 else None)) import logging import os LOGGER = logging.getLogger(__name__) logging.basicConfig( level=logging.INFO, format= '%(asctime)s - %(name)s [%(threadName)s] - %(levelname)s - %(message)s', ) LOGGER.info('env created logger') LOGGER.info(f'env: {os.environ}') print(f'env: {os.environ}') print('env created') return env
df.sort_values(by='date', ascending=True, inplace=True) df.reset_index(drop=True, inplace=True) # Format timestamps as you want them to appear on the chart buy/sell marks. df['date'] = df['date'].dt.strftime('%Y-%m-%d %I:%M %p') return df df = load_csv('btc_usdt_m5_history.csv') price = df['close'] position = 1.1 r = Stream.sensor(price, lambda p: p.value, dtype="float").diff() position = Stream.sensor(position, lambda p: p, dtype="float") reward = (position * r).fillna(0).rename("reward") print(r) print("Type: {}".format(type(r))) print("--------------------------") print(position) print("Type: {}".format(type(position))) print("--------------------------") print(reward)