def test_update_portfolio_too_small(self): security_recommendation = SecurityRecommendationSet.from_dict( self.sr_dict) portfolio = Portfolio() portfolio.create_empty_portfolio(security_recommendation) with self.assertRaises(ValidationError): portfolio_mgr_svc.update_portfolio( portfolio, security_recommendation, 0)
def test_publish_current_returns(self): security_recommendation = SecurityRecommendationSet.from_dict( self.sr_dict) portfolio = Portfolio() portfolio.create_empty_portfolio(security_recommendation) (new_p, updated) = portfolio_mgr_svc.update_portfolio( portfolio, security_recommendation, 1) with patch.object(aws_service_wrapper, 'sns_publish_notification', side_effect=AWSError("", None)), \ patch.object(aws_service_wrapper, 'cf_read_export_value', return_value="some_value"): with self.assertRaises(AWSError): portfolio_mgr_svc.publish_current_returns(new_p, updated, 'sa')
def test_update_portfolio_too_big(self): security_recommendation = SecurityRecommendationSet.from_dict( self.sr_dict) portfolio = Portfolio() portfolio.create_empty_portfolio(security_recommendation) (new_p, updated) = portfolio_mgr_svc.update_portfolio( portfolio, security_recommendation, 100) ''' ensure that portfolio contains all securitie from the recommendation set ''' self.assertTrue(updated) self.assertEqual(len(new_p.model['current_portfolio'][ 'securities']), len(security_recommendation.model['securities_set'])) self.assertEqual(len(new_p.model['securities_set']), 0)
def test_update_portfolio_new_recommendation(self): sr_mod = deepcopy(self.sr_dict) sr_mod['set_id'] = 'different_set' security_recommendation = SecurityRecommendationSet.from_dict(sr_mod) portfolio = Portfolio.from_dict(self.portfolio_dict) (new_p, updated) = portfolio_mgr_svc.update_portfolio( portfolio, security_recommendation, 1) ''' ensure that 1) portfolio is updated 2) set id are being set properly ''' self.assertTrue(updated) self.assertEqual(new_p.model['set_id'], security_recommendation.model['set_id']) self.assertNotEqual(new_p.model['set_id'], self.sr_dict['set_id'])
def test_update_portfolio_empty_portfolio(self): security_recommendation = SecurityRecommendationSet.from_dict( self.sr_dict) portfolio = Portfolio() portfolio.create_empty_portfolio(security_recommendation) (new_p, updated) = portfolio_mgr_svc.update_portfolio( portfolio, security_recommendation, 1) ''' ensure that 1) portfolio is updated 2) portfolio contains 1 security 3) portfolio contains nothing in the security set ''' self.assertTrue(updated) self.assertEqual( len(new_p.model['current_portfolio']['securities']), 1) self.assertEqual(len(new_p.model['securities_set']), len( security_recommendation.model['securities_set']) - 1)
def main(): """ Main function of this script """ try: #(app_ns, portfolio_size) = parse_params() (app_ns, portfolio_size) = ('sa', 3) log.info("Application Parameters") log.info("-app_namespace: %s" % app_ns) log.info("-portfolio_size: %d" % portfolio_size) # test all connectivity upfront, so if there any issues # the problem becomes more apparent connector_test.test_all_connectivity() (current_portfolio, security_recommendation) = portfolio_mgr_svc.get_service_inputs(app_ns) log.info("Loaded recommendation set id: %s" % security_recommendation.model['set_id']) if current_portfolio is None: log.info("Creating new portfolio") current_portfolio = Portfolio(None) current_portfolio.create_empty_portfolio(security_recommendation) else: log.info("Repricing portfolio") current_portfolio.reprice(datetime.now()) (updated_portfolio, updated) = portfolio_mgr_svc.update_portfolio( current_portfolio, security_recommendation, portfolio_size) # See if there is anything that needs to be traded market_open = td_ameritrade.equity_market_open(datetime.now()) if market_open == True: broker = Broker() broker.cancel_all_open_orders() log.info("Market is open. Looking for trading opportunities") current_positions = td_ameritrade.positions_summary() try: if broker.reconcile_portfolio(current_positions, updated_portfolio) == False: log.info( "Portfolio is not in sync with brokerage account positions. Positions will be rebalanced") broker.materialize_portfolio( current_positions, updated_portfolio) finally: updated_positions = td_ameritrade.positions_summary() broker.synchronize_portfolio( updated_positions, updated_portfolio) updated_portfolio.recalc_returns() broker.cancel_all_open_orders() else: log.info("Market is closed. Nothing to trade") log.info("updated portfolio: %s" % util.format_dict(updated_portfolio.to_dict())) log.info("Saving updated portfolio") updated_portfolio.save_to_s3( app_ns, constants.S3_PORTFOLIO_OBJECT_NAME) portfolio_mgr_svc.publish_current_returns( updated_portfolio, updated, app_ns) except Exception as e: stack_trace = traceback.format_exc() log.error("Could run script, because: %s" % (str(e))) log.error(stack_trace) aws_service_wrapper.notify_error(e, "Portfolio Manager Service", stack_trace, app_ns)