Source code for flashcrashed.market.env

import gym.spaces
from gym.utils import seeding

from .gen import market_maker, FlashedMarket


[docs]class FlashGym(gym.Env): def __init__(self, real=False): self.real = real self.maker = market_maker() self.market = None self.wait = 0 self.last_price = 0 self.crashes_length = 0 self.bought, self.sold = False, False self.buy_price, self.sell_price = 0, 0
[docs] def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed]
[docs] def render(self, mode='human'): pass
[docs] def reset(self): self.wait = 0 self.crashes_length = 0 self.market = FlashedMarket(self.maker(real=self.real), self.real) self.bought, self.sold = False, False self.buy_price, self.sell_price = 0, 0 self.last_price = next(self.market) return self.last_price
[docs] def step(self, action): if action == 0: reward = self.buy_reward elif action == 2: reward = self.sell_reward else: reward = 0 ln = len(self.market.crashes) if ln and ln != self.crashes_length: self.crashes_length = ln if self.buy_price != 0: roi = round(self.sell_price / self.buy_price * 100, 2) else: roi = 0 self.market.crashes[-1].update(bought=self.bought, sold=self.sold, roi=roi) self.bought, self.sold = False, False try: self.last_price = next(self.market) done = False except StopIteration: done = True return self.last_price, reward, done, {}
@property def buy_reward(self): if not self.market.crashing: return -1 if self.bought: return -0.1 self.bought = True self.buy_price = self.last_price return 1 - 2 * abs(self.market.position - self.market.crash_mid) / self.market.drop_duration @property def sell_reward(self): if not self.market.rising and not self.market.returned: return -1 if self.sold or not self.bought: return -0.1 self.sold = True self.sell_price = self.last_price if self.real: return int(self.buy_price <= self.sell_price * 3) * 2 - 1. return 1 - 2 * max(self.market.crash_end - self.market.position, 0) / self.market.rise_duration