Esempio n. 1
0
    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)
Esempio n. 2
0
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))