def create_returns_from_range(trading_calendar): current = trading_calendar.first_open end = trading_calendar.last_close one_day = timedelta(days=1) test_range = [] while current <= end: r = risk.DailyReturn(current, random.random()) test_range.append(r) current = get_next_trading_dt(current, one_day, trading_calendar) return test_range
def load_market_data(): try: fp_bm = get_datafile('benchmark.msgpack', "rb") except IOError: print """ data msgpacks aren't distribute with source. Fetching data from Yahoo Finance. """.strip() dump_benchmarks() fp_bm = get_datafile('benchmark.msgpack', "rb") bm_list = msgpack.loads(fp_bm.read()) bm_returns = [] for packed_date, returns in bm_list: event_dt = tuple_to_date(packed_date) #event_dt = event_dt.replace( # hour=0, # minute=0, # second=0, # tzinfo=pytz.utc #) daily_return = risk.DailyReturn(date=event_dt, returns=returns) bm_returns.append(daily_return) fp_bm.close() bm_returns = sorted(bm_returns, key=attrgetter('date')) try: fp_tr = get_datafile('treasury_curves.msgpack', "rb") except IOError: print """ data msgpacks aren't distribute with source. Fetching data from data.treasury.gov """.strip() dump_treasury_curves() fp_tr = get_datafile('treasury_curves.msgpack', "rb") tr_list = msgpack.loads(fp_tr.read()) tr_curves = {} for packed_date, curve in tr_list: tr_dt = tuple_to_date(packed_date) #tr_dt = tr_dt.replace(hour=0, minute=0, second=0, tzinfo=pytz.utc) tr_curves[tr_dt] = curve fp_tr.close() return bm_returns, tr_curves
def create_returns_from_list(returns, trading_calendar): current = trading_calendar.first_open one_day = timedelta(days=1) test_range = [] #sometimes the range starts with a non-trading day. if not trading_calendar.is_trading_day(current): current = get_next_trading_dt(current, one_day, trading_calendar) for return_val in returns: r = risk.DailyReturn(current, return_val) test_range.append(r) current = get_next_trading_dt(current, one_day, trading_calendar) return test_range
def create_returns(daycount, trading_calendar): """ For the given number of calendar (not trading) days return all the trading days between start and start + daycount. """ test_range = [] current = trading_calendar.first_open one_day = timedelta(days=1) for day in range(daycount): current = current + one_day if trading_calendar.is_trading_day(current): r = risk.DailyReturn(current, random.random()) test_range.append(r) return test_range
def handle_market_close(self): # add the return results from today to the list of DailyReturn objects. todays_date = self.market_close.replace(hour=0, minute=0, second=0) todays_return_obj = risk.DailyReturn(todays_date, self.todays_performance.returns) self.returns.append(todays_return_obj) #update risk metrics for cumulative performance self.cumulative_risk_metrics.update(self.todays_performance.returns) # increment the day counter before we move markers forward. self.day_count += 1.0 # calculate progress of test self.progress = self.day_count / self.total_days # Take a snapshot of our current peformance to return to the # browser. daily_update = self.to_dict() #move the market day markers forward self.market_open = self.market_open + self.calendar_day while not self.trading_environment.is_trading_day(self.market_open): if self.market_open > self.trading_environment.trading_days[-1]: raise Exception( "Attempt to backtest beyond available history.") self.market_open = self.market_open + self.calendar_day self.market_close = self.market_open + self.trading_day # Roll over positions to current day. self.todays_performance = PerformancePeriod( self.todays_performance.positions, self.todays_performance.ending_value, self.todays_performance.ending_cash, self.market_open, self.market_close, keep_transactions=True) return daily_update
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]) )