def test_trading_environment(self): benchmark_returns, treasury_curves = \ factory.load_market_data() env = TradingEnvironment( benchmark_returns, treasury_curves, period_start=datetime(2008, 1, 1, tzinfo=pytz.utc), period_end=datetime(2008, 12, 31, tzinfo=pytz.utc), capital_base=100000, ) #holidays taken from: http://www.nyse.com/press/1191407641943.html new_years = datetime(2008, 1, 1, tzinfo=pytz.utc) mlk_day = datetime(2008, 1, 21, tzinfo=pytz.utc) presidents = datetime(2008, 2, 18, tzinfo=pytz.utc) good_friday = datetime(2008, 3, 21, tzinfo=pytz.utc) memorial_day = datetime(2008, 5, 26, tzinfo=pytz.utc) july_4th = datetime(2008, 7, 4, tzinfo=pytz.utc) labor_day = datetime(2008, 9, 1, tzinfo=pytz.utc) tgiving = datetime(2008, 11, 27, tzinfo=pytz.utc) christmas = datetime(2008, 5, 25, tzinfo=pytz.utc) a_saturday = datetime(2008, 8, 2, tzinfo=pytz.utc) a_sunday = datetime(2008, 10, 12, tzinfo=pytz.utc) holidays = [ new_years, mlk_day, presidents, good_friday, memorial_day, july_4th, labor_day, tgiving, christmas, a_saturday, a_sunday ] for holiday in holidays: self.assertTrue(not env.is_trading_day(holiday)) first_trading_day = datetime(2008, 1, 2, tzinfo=pytz.utc) last_trading_day = datetime(2008, 12, 31, tzinfo=pytz.utc) workdays = [first_trading_day, last_trading_day] for workday in workdays: self.assertTrue(env.is_trading_day(workday)) self.assertTrue(env.last_close.month == 12) self.assertTrue(env.last_close.day == 31)
class RiskCompareIterativeToBatch(unittest.TestCase): """ Assert that RiskMetricsIterative and RiskMetricsBatch behave in the same way. """ def setUp(self): self.start_date = datetime.datetime( year=2006, month=1, day=1, hour=0, minute=0, tzinfo=pytz.utc) self.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=self.start_date, period_end=self.end_date, capital_base=1000.0 ) self.oneday = datetime.timedelta(days=1) def test_risk_metrics_returns(self): risk_metrics_refactor = risk.RiskMetricsIterative( self.start_date, self.trading_env) todays_date = self.start_date cur_returns = [] for i, ret in enumerate(RETURNS): todays_return_obj = risk.DailyReturn( todays_date, ret ) cur_returns.append(todays_return_obj) # Move forward day counter to next trading day todays_date += self.oneday while not self.trading_env.is_trading_day(todays_date): todays_date += self.oneday try: risk_metrics_original = risk.RiskMetricsBatch( start_date=self.start_date, end_date=todays_date, returns=cur_returns, trading_environment=self.trading_env ) except Exception as e: #assert that when original raises exception, same #exception is raised by risk_metrics_refactor np.testing.assert_raises( type(e), risk_metrics_refactor.update, todays_date, ret) continue risk_metrics_refactor.update(todays_date, ret) self.assertEqual( risk_metrics_original.start_date, risk_metrics_refactor.start_date) self.assertEqual( risk_metrics_original.end_date, risk_metrics_refactor.end_date) self.assertEqual( risk_metrics_original.treasury_duration, risk_metrics_refactor.treasury_duration) self.assertEqual( risk_metrics_original.treasury_curve, risk_metrics_refactor.treasury_curve) self.assertEqual( risk_metrics_original.treasury_period_return, risk_metrics_refactor.treasury_period_return) self.assertEqual( risk_metrics_original.benchmark_returns, risk_metrics_refactor.benchmark_returns) self.assertEqual( risk_metrics_original.algorithm_returns, risk_metrics_refactor.algorithm_returns) risk_original_dict = risk_metrics_original.to_dict() risk_refactor_dict = risk_metrics_refactor.to_dict() self.assertEqual(set(risk_original_dict.keys()), set(risk_refactor_dict.keys())) err_msg_format = """\ "In update step {iter}: {measure} should be {truth} but is {returned}!""" for measure in risk_original_dict.iterkeys(): if measure == 'max_drawdown': np.testing.assert_almost_equal( risk_refactor_dict[measure], risk_original_dict[measure], err_msg=err_msg_format.format( iter=i, measure=measure, truth=risk_original_dict[measure], returned=risk_refactor_dict[measure])) else: np.testing.assert_equal( risk_original_dict[measure], risk_refactor_dict[measure], err_msg_format.format( iter=i, measure=measure, truth=risk_original_dict[measure], returned=risk_refactor_dict[measure]) )
class RiskCompareIterativeToBatch(unittest.TestCase): """ Assert that RiskMetricsIterative and RiskMetricsBatch behave in the same way. """ def setUp(self): self.start_date = datetime.datetime( year=2006, month=1, day=1, hour=0, minute=0, tzinfo=pytz.utc) self.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=self.start_date, period_end=self.end_date, capital_base=1000.0 ) self.oneday = datetime.timedelta(days=1) def test_risk_metrics_returns(self): risk_metrics_refactor = risk.RiskMetricsIterative( self.start_date, self.trading_env) todays_date = self.start_date cur_returns = [] for i, ret in enumerate(RETURNS): todays_return_obj = risk.DailyReturn( todays_date, ret ) cur_returns.append(todays_return_obj) # Move forward day counter to next trading day todays_date += self.oneday while not self.trading_env.is_trading_day(todays_date): todays_date += self.oneday try: risk_metrics_original = risk.RiskMetricsBatch( start_date=self.start_date, end_date=todays_date, returns=cur_returns, trading_environment=self.trading_env ) except Exception as e: #assert that when original raises exception, same #exception is raised by risk_metrics_refactor np.testing.assert_raises( type(e), risk_metrics_refactor.update, ret) continue risk_metrics_refactor.update(ret) self.assertEqual( risk_metrics_original.start_date, risk_metrics_refactor.start_date) self.assertEqual( risk_metrics_original.end_date, risk_metrics_refactor.end_date) self.assertEqual( risk_metrics_original.treasury_duration, risk_metrics_refactor.treasury_duration) self.assertEqual( risk_metrics_original.treasury_curve, risk_metrics_refactor.treasury_curve) self.assertEqual( risk_metrics_original.treasury_period_return, risk_metrics_refactor.treasury_period_return) self.assertEqual( risk_metrics_original.benchmark_returns, risk_metrics_refactor.benchmark_returns) self.assertEqual( risk_metrics_original.algorithm_returns, risk_metrics_refactor.algorithm_returns) risk_original_dict = risk_metrics_original.to_dict() risk_refactor_dict = risk_metrics_refactor.to_dict() self.assertEqual(set(risk_original_dict.keys()), set(risk_refactor_dict.keys())) err_msg_format = """\ "In update step {iter}: {measure} should be {truth} but is {returned}!""" for measure in risk_original_dict.iterkeys(): if measure == 'max_drawdown': np.testing.assert_almost_equal( risk_refactor_dict[measure], risk_original_dict[measure], err_msg=err_msg_format.format( iter=i, measure=measure, truth=risk_original_dict[measure], returned=risk_refactor_dict[measure])) else: np.testing.assert_equal( risk_original_dict[measure], risk_refactor_dict[measure], err_msg_format.format( iter=i, measure=measure, truth=risk_original_dict[measure], returned=risk_refactor_dict[measure]) )