def test_parse_recon_text(self): test_recon_text = """D0-POS AAPL 100 GOOG 200 SP500 175.75 Cash 1000 D1-TRN AAPL SELL 100 30000 GOOG BUY 10 10000 Cash DEPOSIT 0 1000 Cash FEE 0 50 GOOG DIVIDEND 0 50 TD BUY 100 10000 D1-POS GOOG 220 SP500 175.75 Cash 20000 MSFT 10""" positions, transactions = recon.parse_portfolio_text(test_recon_text) self.assertEqual(2, len(positions)) self.assertEqual(1, len(transactions)) test_prtf = Portfolio.from_positions(positions[0]) self.assertDictEqual({ 'AAPL': 100, 'GOOG': 200, 'SP500': 175.75 }, test_prtf.positions) self.assertEqual(1000, test_prtf.cash)
def reconcile(initial_positions_day=0, compare_to_day=1, in_file='./data/recon.in', out_file='./data/recon.out'): ''' Main entry point for positional reconciliation. Parses command line arguments for which days to compare. Transactions will be accounted for all days between the dates being compared Writes diff to outfile in format specified ''' log.debug('Reading file {}'.format(in_file)) with open(in_file, 'r') as f: text = f.read() positions, transactions = parse_portfolio_text(text) log.debug('Parsed positions and transactions text') initial_portfolio = Portfolio.from_positions( positions[initial_positions_day]) log.debug('Initial portfolio: {}'.format(initial_portfolio)) latest_prtf_state = Portfolio.from_positions(positions[compare_to_day]) log.debug('Compare to portfolio: {}'.format(latest_prtf_state)) for day_idx in range(initial_positions_day, compare_to_day + 1): if day_idx in transactions: for trn in transactions[day_idx]: initial_portfolio.process_transaction(trn) log.debug('Portfolio after processing transactions: {}'.format( initial_portfolio)) prtf_diff = initial_portfolio.reconcile(latest_prtf_state) log.debug('Reconciliation diff: {}'.format(prtf_diff)) with open(out_file, 'w') as f: for ticker, diff in prtf_diff.items(): f.write('{} {}\n'.format(ticker, diff)) log.debug('Wrote outfile {}'.format(args.out_file))