def setUp(self): start_date = datetime.datetime( year=2006, month=1, day=1, hour=0, minute=0, tzinfo=pytz.utc) end_date = datetime.datetime( year=2006, month=12, day=31, tzinfo=pytz.utc) self.benchmark_returns, self.treasury_curves = \ factory.load_market_data() self.trading_env = TradingEnvironment( self.benchmark_returns, self.treasury_curves, period_start=start_date, period_end=end_date ) self.onesec = datetime.timedelta(seconds=1) self.oneday = datetime.timedelta(days=1) self.tradingday = datetime.timedelta(hours=6, minutes=30) self.dt = datetime.datetime.utcnow() self.algo_returns_06 = factory.create_returns_from_list( RETURNS, self.trading_env ) self.metrics_06 = risk.RiskReport( self.algo_returns_06, self.trading_env ) start_08 = datetime.datetime( year=2008, month=1, day=1, hour=0, minute=0, tzinfo=pytz.utc) end_08 = datetime.datetime( year=2008, month=12, day=31, tzinfo=pytz.utc ) self.trading_env08 = TradingEnvironment( self.benchmark_returns, self.treasury_curves, period_start=start_08, period_end=end_08 )
def test_partial_month(self): start = datetime.datetime( year=1991, month=1, day=1, hour=0, minute=0, tzinfo=pytz.utc) #1992 and 1996 were leap years total_days = 365 * 5 + 2 end = start + datetime.timedelta(days=total_days) trading_env90s = TradingEnvironment( self.benchmark_returns, self.treasury_curves, period_start=start, period_end=end ) returns = factory.create_returns(total_days, trading_env90s) returns = returns[:-10] # truncate the returns series to end mid-month metrics = risk.RiskReport(returns, trading_env90s) total_months = 60 self.check_metrics(metrics, total_months, start)
def test_yahoo_bars_to_panel_source(self): env = TradingEnvironment() finder = AssetFinder(env.engine) stocks = ['AAPL', 'GE'] env.write_data(equities_identifiers=stocks) start = pd.datetime(1993, 1, 1, 0, 0, 0, 0, pytz.utc) end = pd.datetime(2002, 1, 1, 0, 0, 0, 0, pytz.utc) data = factory.load_bars_from_yahoo(stocks=stocks, indexes={}, start=start, end=end) check_fields = [ 'sid', 'open', 'high', 'low', 'close', 'volume', 'price' ] copy_panel = data.copy() sids = finder.map_identifier_index_to_sids(data.items, data.major_axis[0]) copy_panel.items = sids source = DataPanelSource(copy_panel) for event in source: for check_field in check_fields: self.assertIn(check_field, event) self.assertTrue(isinstance(event['volume'], (integer_types))) self.assertTrue(event['sid'] in sids)
def test_max_date(self): max_date = pd.Timestamp('2008-08-01', tz='UTC') env = TradingEnvironment(max_date=max_date) self.assertLessEqual(env.last_trading_day, max_date) self.assertLessEqual(env.treasury_curves.index[-1], max_date)
def create_test_df_source(sim_params=None, env=None, bars='daily'): if bars == 'daily': freq = pd.datetools.BDay() elif bars == 'minute': freq = pd.datetools.Minute() else: raise ValueError('%s bars not understood.' % bars) if sim_params and bars == 'daily': index = sim_params.trading_days else: if env is None: env = TradingEnvironment(load=noop_load) start = pd.datetime(1990, 1, 3, 0, 0, 0, 0, pytz.utc) end = pd.datetime(1990, 1, 8, 0, 0, 0, 0, pytz.utc) days = env.days_in_range(start, end) if bars == 'daily': index = days if bars == 'minute': index = pd.DatetimeIndex([], freq=freq) for day in days: day_index = env.market_minutes_for_day(day) index = index.append(day_index) x = np.arange(1, len(index) + 1) df = pd.DataFrame(x, index=index, columns=[0]) return DataFrameSource(df), df
def create_test_panel_source(sim_params=None, env=None, source_type=None): start = sim_params.first_open \ if sim_params else pd.datetime(1990, 1, 3, 0, 0, 0, 0, pytz.utc) end = sim_params.last_close \ if sim_params else pd.datetime(1990, 1, 8, 0, 0, 0, 0, pytz.utc) if env is None: env = TradingEnvironment(load=noop_load) index = env.days_in_range(start, end) price = np.arange(0, len(index)) volume = np.ones(len(index)) * 1000 arbitrary = np.ones(len(index)) df = pd.DataFrame( { 'price': price, 'volume': volume, 'arbitrary': arbitrary }, index=index) if source_type: df['type'] = source_type panel = pd.Panel.from_dict({0: df}) return DataPanelSource(panel), panel
def setUp(self): self.constants = { # Every day, assume every stock starts at 2, goes down to 1, # goes up to 4, and finishes at 3. USEquityPricing.low: 1, USEquityPricing.open: 2, USEquityPricing.close: 3, USEquityPricing.high: 4, } self.assets = [1, 2, 3] self.dates = date_range('2014-01', '2014-03', freq='D', tz='UTC') self.loader = ConstantLoader( constants=self.constants, dates=self.dates, assets=self.assets, ) self.asset_info = make_simple_asset_info( self.assets, start_date=self.dates[0], end_date=self.dates[-1], ) environment = TradingEnvironment() environment.write_data(equities_df=self.asset_info) self.asset_finder = environment.asset_finder
def create_simulation_parameters(year=2006, start=None, end=None, capital_base=float("1.0e5"), num_days=None, load=None, data_frequency='daily', emission_rate='daily', env=None): """Construct a complete environment with reasonable defaults""" if env is None: env = TradingEnvironment(load=load) if start is None: start = datetime(year, 1, 1, tzinfo=pytz.utc) if end is None: if num_days: start_index = env.trading_days.searchsorted(start) end = env.trading_days[start_index + num_days - 1] else: end = datetime(year, 12, 31, tzinfo=pytz.utc) sim_params = SimulationParameters( period_start=start, period_end=end, capital_base=capital_base, data_frequency=data_frequency, emission_rate=emission_rate, env=env, ) return sim_params
def setUp(self): self.benchmark_returns, self.treasury_curves = \ factory.load_market_data() for n in range(100): random_index = random.randint(0, len(self.treasury_curves)) self.dt = self.treasury_curves.keys()[random_index] self.end_dt = self.dt + datetime.timedelta(days=365) now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc) if self.end_dt <= now: break assert self.end_dt <= now, """ failed to find a date suitable daterange after 100 attempts. please double check treasury and benchmark data in findb, and re-run the test.""" self.trading_environment = TradingEnvironment(self.benchmark_returns, self.treasury_curves, period_start=self.dt, period_end=self.end_dt) self.onesec = datetime.timedelta(seconds=1) self.oneday = datetime.timedelta(days=1) self.tradingday = datetime.timedelta(hours=6, minutes=30) self.dt = self.trading_environment.trading_days[random_index]
def test_min_date(self): min_date = pd.Timestamp('2016-03-04', tz='UTC') env = TradingEnvironment(min_date=min_date) self.assertGreaterEqual(env.first_trading_day, min_date) self.assertGreaterEqual(env.treasury_curves.index[0], min_date)
def setUpClass(cls): random.seed(0) cls.sids = (1, 2, 3) minute_sim_ps = factory.create_simulation_parameters( num_days=3, data_frequency='minute', emission_rate='minute', ) daily_sim_ps = factory.create_simulation_parameters( num_days=30, data_frequency='daily', emission_rate='daily', ) cls.env = TradingEnvironment() cls.env.write_data(equities_identifiers=[1, 2, 3]) cls.sim_and_source = { 'minute': (minute_sim_ps, factory.create_minutely_trade_source( cls.sids, sim_params=minute_sim_ps, env=cls.env, )), 'daily': (daily_sim_ps, factory.create_trade_source( cls.sids, trade_time_increment=timedelta(days=1), sim_params=daily_sim_ps, env=cls.env, )), }
def setUpClass(cls): metadata = { 0: { 'symbol': 'CLG06', 'root_symbol': 'CL', 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), 'notice_date': pd.Timestamp('2005-12-20', tz='UTC'), 'expiration_date': pd.Timestamp('2006-01-20', tz='UTC') }, 1: { 'root_symbol': 'CL', 'symbol': 'CLK06', 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), 'notice_date': pd.Timestamp('2006-03-20', tz='UTC'), 'expiration_date': pd.Timestamp('2006-04-20', tz='UTC') }, 2: { 'symbol': 'CLQ06', 'root_symbol': 'CL', 'start_date': pd.Timestamp('2005-12-01', tz='UTC'), 'notice_date': pd.Timestamp('2006-06-20', tz='UTC'), 'expiration_date': pd.Timestamp('2006-07-20', tz='UTC') }, 3: { 'symbol': 'CLX06', 'root_symbol': 'CL', 'start_date': pd.Timestamp('2006-02-01', tz='UTC'), 'notice_date': pd.Timestamp('2006-09-20', tz='UTC'), 'expiration_date': pd.Timestamp('2006-10-20', tz='UTC') } } env = TradingEnvironment(load=noop_load) env.write_data(futures_data=metadata) cls.asset_finder = env.asset_finder
def create_random_simulation_parameters(): env = TradingEnvironment() treasury_curves = env.treasury_curves for n in range(100): random_index = random.randint(0, len(treasury_curves) - 1) start_dt = treasury_curves.index[random_index] end_dt = start_dt + timedelta(days=365) now = datetime.utcnow().replace(tzinfo=pytz.utc) if end_dt <= now: break assert end_dt <= now, """ failed to find a suitable daterange after 100 attempts. please double check treasury and benchmark data in findb, and re-run the test.""" sim_params = SimulationParameters( period_start=start_dt, period_end=end_dt, env=env, ) return sim_params, start_dt, end_dt
def create_simulation_parameters(year=2006, start=None, end=None, capital_base=float("1.0e5"), num_days=None, data_frequency='daily', emission_rate='daily', env=None): if env is None: # Construct a complete environment with reasonable defaults env = TradingEnvironment(load=noop_load) if start is None: start = pd.Timestamp("{0}-01-01".format(year), tz='UTC') if end is None: if num_days: start_index = env.trading_days.searchsorted(start) end = env.trading_days[start_index + num_days - 1] else: end = pd.Timestamp("{0}-12-31".format(year), tz='UTC') sim_params = SimulationParameters( period_start=start, period_end=end, capital_base=capital_base, data_frequency=data_frequency, emission_rate=emission_rate, env=env, ) return sim_params
def test_max_date(self): max_date = datetime(2008, 8, 1, tzinfo=pytz.utc) env = TradingEnvironment(max_date=max_date) self.assertLessEqual(env.last_trading_day, max_date) self.assertLessEqual(env.treasury_curves.index[-1], max_date)
def setUpClass(cls): cls.env = TradingEnvironment() all_market_opens = cls.env.open_and_closes.market_open indexer = all_market_opens.index.slice_indexer( start=TEST_CALENDAR_START, end=TEST_CALENDAR_STOP) cls.market_opens = all_market_opens[indexer] cls.test_calendar_start = cls.market_opens.index[0] cls.test_calendar_stop = cls.market_opens.index[-1]
def __init__(self, env=None, trading_schedule=default_nyse_schedule, first_trading_day=None): if env is None: env = TradingEnvironment() super(FakeDataPortal, self).__init__(env.asset_finder, trading_schedule, first_trading_day)
def test_tse_calendar_vs_environment(self): env = TradingEnvironment(bm_symbol='^GSPTSE', exchange_tz='US/Eastern') env_start_index = \ env.trading_days.searchsorted(tradingcalendar_tse.start) env_days = env.trading_days[env_start_index:] cal_days = tradingcalendar_tse.trading_days self.check_days(env_days, cal_days)
def test_compute_lifetimes(self): num_assets = 4 env = TradingEnvironment() trading_day = env.trading_day first_start = pd.Timestamp('2015-04-01', tz='UTC') frame = make_rotating_asset_info(num_assets=num_assets, first_start=first_start, frequency=env.trading_day, periods_between_starts=3, asset_lifetime=5) env.write_data(equities_df=frame) finder = env.asset_finder all_dates = pd.date_range( start=first_start, end=frame.end_date.max(), freq=trading_day, ) for dates in all_subindices(all_dates): expected_with_start_raw = full( shape=(len(dates), num_assets), fill_value=False, dtype=bool, ) expected_no_start_raw = full( shape=(len(dates), num_assets), fill_value=False, dtype=bool, ) for i, date in enumerate(dates): it = frame[['start_date', 'end_date']].itertuples() for j, start, end in it: # This way of doing the checks is redundant, but very # clear. if start <= date <= end: expected_with_start_raw[i, j] = True if start < date: expected_no_start_raw[i, j] = True expected_with_start = pd.DataFrame( data=expected_with_start_raw, index=dates, columns=frame.index.values, ) result = finder.lifetimes(dates, include_start_date=True) assert_frame_equal(result, expected_with_start) expected_no_start = pd.DataFrame( data=expected_no_start_raw, index=dates, columns=frame.index.values, ) result = finder.lifetimes(dates, include_start_date=False) assert_frame_equal(result, expected_no_start)
def test_sids(self): # Ensure that the sids property of the AssetFinder is functioning env = TradingEnvironment() env.write_data(equities_identifiers=[1, 2, 3]) sids = env.asset_finder.sids self.assertEqual(3, len(sids)) self.assertTrue(1 in sids) self.assertTrue(2 in sids) self.assertTrue(3 in sids)
def test_lse_calendar_vs_environment(self): env = TradingEnvironment(bm_symbol='^FTSE', exchange_tz='Europe/London') env_start_index = \ env.trading_days.searchsorted(tradingcalendar_lse.start) env_days = env.trading_days[env_start_index:] cal_days = tradingcalendar_lse.trading_days self.check_days(env_days, cal_days)
def test_bmf_calendar_vs_environment(self): env = TradingEnvironment(bm_symbol='^BVSP', exchange_tz='America/Sao_Paulo') env_start_index = \ env.trading_days.searchsorted(tradingcalendar_bmf.start) env_days = env.trading_days[env_start_index:] cal_days = tradingcalendar_bmf.trading_days self.check_days(env_days, cal_days)
def setUp(self): self.sids = range(90) self.env = TradingEnvironment() self.env.write_data(equities_identifiers=self.sids) self.sim_params = factory.create_simulation_parameters( start=datetime(1990, 1, 1, tzinfo=pytz.utc), end=datetime(1990, 1, 8, tzinfo=pytz.utc), env=self.env, )
def setUp(self): self.days = TradingEnvironment().trading_days self.index = [self.days[0], self.days[1], self.days[2]] self.panel = pd.Panel({1: pd.DataFrame({ 'price': [1, 2, 4], 'volume': [1e9, 0, 0], 'type': [DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CLOSE_POSITION]}, index=self.index) })
def setUpClass(cls): cls.tempdir = TempDirectory() cls.env = TradingEnvironment() cls.sim_params = SimulationParameters( period_start=pd.Timestamp("2006-01-05 14:31", tz="utc"), period_end=pd.Timestamp("2006-01-05 14:36", tz="utc"), capital_base=1.0e5, data_frequency="minute", emission_rate='daily', env=cls.env ) cls.sids = [133] cls.minutes = pd.DatetimeIndex( start=pd.Timestamp("2006-01-05 14:31", tz="utc"), end=pd.Timestamp("2006-01-05 14:35", tz="utc"), freq="1min" ) assets = { 133: pd.DataFrame({ "open": np.array([3.0, 3.0, 3.5, 4.0, 3.5]), "high": np.array([3.15, 3.15, 3.15, 3.15, 3.15]), "low": np.array([2.85, 2.85, 2.85, 2.85, 2.85]), "close": np.array([3.0, 3.5, 4.0, 3.5, 3.0]), "volume": [2000, 2000, 2000, 2000, 2000], "dt": cls.minutes }).set_index("dt") } write_bcolz_minute_data( cls.env, pd.date_range( start=normalize_date(cls.minutes[0]), end=normalize_date(cls.minutes[-1]) ), cls.tempdir.path, assets ) cls.env.write_data(equities_data={ 133: { "start_date": pd.Timestamp("2006-01-05", tz='utc'), "end_date": pd.Timestamp("2006-01-07", tz='utc') } }) cls.ASSET133 = cls.env.asset_finder.retrieve_asset(133) cls.data_portal = DataPortal( cls.env, equity_minute_reader=BcolzMinuteBarReader(cls.tempdir.path), )
def __init__(self, env=None, trading_calendar=None, first_trading_day=None): if env is None: env = TradingEnvironment() if trading_calendar is None: trading_calendar = get_calendar("NYSE") super(FakeDataPortal, self).__init__(env.asset_finder, trading_calendar, first_trading_day)
def setUp(self): self.assets = [1, 2, 3] self.dates = date_range('2014-01', '2014-03', freq='D', tz='UTC') asset_info = make_simple_asset_info( self.assets, start_date=self.dates[0], end_date=self.dates[-1], ) env = TradingEnvironment() env.write_data(equities_df=asset_info) self.asset_finder = env.asset_finder
def setUpClass(cls): cls.env = TradingEnvironment() # On the AfterOpen and BeforeClose tests, we want ensure that the # functions are pure, and that running them with the same input will # provide the same output, regardless of whether the function is run 1 # or N times. (For performance reasons, we cache some internal state # in AfterOpen and BeforeClose, but we don't want it to affect # purity). Hence, we use the same before_close and after_open across # subtests. cls.before_close = BeforeClose(hours=1, minutes=5) cls.after_open = AfterOpen(hours=1, minutes=5) cls.class_ = None # Mark that this is the base class.
def configure_environment(self, last_trade, benchmark, timezone): ''' Prepare benchmark loader and trading context ''' if last_trade.tzinfo is None: last_trade = pytz.utc.localize(last_trade) # Setup the trading calendar from market informations self.benchmark = benchmark self.context = TradingEnvironment( bm_symbol=benchmark, exchange_tz=timezone, load=self._get_benchmark_handler(last_trade))
def setUp(self): self.__calendar = date_range('2014', '2015', freq=trading_day) self.__assets = assets = Int64Index(arange(1, 20)) # Set up env for test env = TradingEnvironment() env.write_data(equities_df=make_simple_asset_info( assets, self.__calendar[0], self.__calendar[-1], )) self.__finder = env.asset_finder self.__mask = self.__finder.lifetimes(self.__calendar[-10:])