Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import numpy as np Chris@87: from numpy.testing import ( Chris@87: run_module_suite, TestCase, assert_, assert_almost_equal Chris@87: ) Chris@87: Chris@87: Chris@87: class TestFinancial(TestCase): Chris@87: def test_rate(self): Chris@87: assert_almost_equal(np.rate(10, 0, -3500, 10000), Chris@87: 0.1107, 4) Chris@87: Chris@87: def test_irr(self): Chris@87: v = [-150000, 15000, 25000, 35000, 45000, 60000] Chris@87: assert_almost_equal(np.irr(v), Chris@87: 0.0524, 2) Chris@87: v = [-100, 0, 0, 74] Chris@87: assert_almost_equal(np.irr(v), Chris@87: -0.0955, 2) Chris@87: v = [-100, 39, 59, 55, 20] Chris@87: assert_almost_equal(np.irr(v), Chris@87: 0.28095, 2) Chris@87: v = [-100, 100, 0, -7] Chris@87: assert_almost_equal(np.irr(v), Chris@87: -0.0833, 2) Chris@87: v = [-100, 100, 0, 7] Chris@87: assert_almost_equal(np.irr(v), Chris@87: 0.06206, 2) Chris@87: v = [-5, 10.5, 1, -8, 1] Chris@87: assert_almost_equal(np.irr(v), Chris@87: 0.0886, 2) Chris@87: Chris@87: def test_pv(self): Chris@87: assert_almost_equal(np.pv(0.07, 20, 12000, 0), Chris@87: -127128.17, 2) Chris@87: Chris@87: def test_fv(self): Chris@87: assert_almost_equal(np.fv(0.075, 20, -2000, 0, 0), Chris@87: 86609.36, 2) Chris@87: Chris@87: def test_pmt(self): Chris@87: assert_almost_equal(np.pmt(0.08/12, 5*12, 15000), Chris@87: -304.146, 3) Chris@87: Chris@87: def test_ppmt(self): Chris@87: np.round(np.ppmt(0.1/12, 1, 60, 55000), 2) == 710.25 Chris@87: Chris@87: def test_ipmt(self): Chris@87: np.round(np.ipmt(0.1/12, 1, 24, 2000), 2) == 16.67 Chris@87: Chris@87: def test_nper(self): Chris@87: assert_almost_equal(np.nper(0.075, -2000, 0, 100000.), Chris@87: 21.54, 2) Chris@87: Chris@87: def test_nper2(self): Chris@87: assert_almost_equal(np.nper(0.0, -2000, 0, 100000.), Chris@87: 50.0, 1) Chris@87: Chris@87: def test_npv(self): Chris@87: assert_almost_equal( Chris@87: np.npv(0.05, [-15000, 1500, 2500, 3500, 4500, 6000]), Chris@87: 122.89, 2) Chris@87: Chris@87: def test_mirr(self): Chris@87: val = [-4500, -800, 800, 800, 600, 600, 800, 800, 700, 3000] Chris@87: assert_almost_equal(np.mirr(val, 0.08, 0.055), 0.0666, 4) Chris@87: Chris@87: val = [-120000, 39000, 30000, 21000, 37000, 46000] Chris@87: assert_almost_equal(np.mirr(val, 0.10, 0.12), 0.126094, 6) Chris@87: Chris@87: val = [100, 200, -50, 300, -200] Chris@87: assert_almost_equal(np.mirr(val, 0.05, 0.06), 0.3428, 4) Chris@87: Chris@87: val = [39000, 30000, 21000, 37000, 46000] Chris@87: assert_(np.isnan(np.mirr(val, 0.10, 0.12))) Chris@87: Chris@87: def test_when(self): Chris@87: #begin Chris@87: assert_almost_equal(np.rate(10, 20, -3500, 10000, 1), Chris@87: np.rate(10, 20, -3500, 10000, 'begin'), 4) Chris@87: #end Chris@87: assert_almost_equal(np.rate(10, 20, -3500, 10000), Chris@87: np.rate(10, 20, -3500, 10000, 'end'), 4) Chris@87: assert_almost_equal(np.rate(10, 20, -3500, 10000, 0), Chris@87: np.rate(10, 20, -3500, 10000, 'end'), 4) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.pv(0.07, 20, 12000, 0, 1), Chris@87: np.pv(0.07, 20, 12000, 0, 'begin'), 2) Chris@87: # end Chris@87: assert_almost_equal(np.pv(0.07, 20, 12000, 0), Chris@87: np.pv(0.07, 20, 12000, 0, 'end'), 2) Chris@87: assert_almost_equal(np.pv(0.07, 20, 12000, 0, 0), Chris@87: np.pv(0.07, 20, 12000, 0, 'end'), 2) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.fv(0.075, 20, -2000, 0, 1), Chris@87: np.fv(0.075, 20, -2000, 0, 'begin'), 4) Chris@87: # end Chris@87: assert_almost_equal(np.fv(0.075, 20, -2000, 0), Chris@87: np.fv(0.075, 20, -2000, 0, 'end'), 4) Chris@87: assert_almost_equal(np.fv(0.075, 20, -2000, 0, 0), Chris@87: np.fv(0.075, 20, -2000, 0, 'end'), 4) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.pmt(0.08/12, 5*12, 15000., 0, 1), Chris@87: np.pmt(0.08/12, 5*12, 15000., 0, 'begin'), 4) Chris@87: # end Chris@87: assert_almost_equal(np.pmt(0.08/12, 5*12, 15000., 0), Chris@87: np.pmt(0.08/12, 5*12, 15000., 0, 'end'), 4) Chris@87: assert_almost_equal(np.pmt(0.08/12, 5*12, 15000., 0, 0), Chris@87: np.pmt(0.08/12, 5*12, 15000., 0, 'end'), 4) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.ppmt(0.1/12, 1, 60, 55000, 0, 1), Chris@87: np.ppmt(0.1/12, 1, 60, 55000, 0, 'begin'), 4) Chris@87: # end Chris@87: assert_almost_equal(np.ppmt(0.1/12, 1, 60, 55000, 0), Chris@87: np.ppmt(0.1/12, 1, 60, 55000, 0, 'end'), 4) Chris@87: assert_almost_equal(np.ppmt(0.1/12, 1, 60, 55000, 0, 0), Chris@87: np.ppmt(0.1/12, 1, 60, 55000, 0, 'end'), 4) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.ipmt(0.1/12, 1, 24, 2000, 0, 1), Chris@87: np.ipmt(0.1/12, 1, 24, 2000, 0, 'begin'), 4) Chris@87: # end Chris@87: assert_almost_equal(np.ipmt(0.1/12, 1, 24, 2000, 0), Chris@87: np.ipmt(0.1/12, 1, 24, 2000, 0, 'end'), 4) Chris@87: assert_almost_equal(np.ipmt(0.1/12, 1, 24, 2000, 0, 0), Chris@87: np.ipmt(0.1/12, 1, 24, 2000, 0, 'end'), 4) Chris@87: Chris@87: # begin Chris@87: assert_almost_equal(np.nper(0.075, -2000, 0, 100000., 1), Chris@87: np.nper(0.075, -2000, 0, 100000., 'begin'), 4) Chris@87: # end Chris@87: assert_almost_equal(np.nper(0.075, -2000, 0, 100000.), Chris@87: np.nper(0.075, -2000, 0, 100000., 'end'), 4) Chris@87: assert_almost_equal(np.nper(0.075, -2000, 0, 100000., 0), Chris@87: np.nper(0.075, -2000, 0, 100000., 'end'), 4) Chris@87: Chris@87: def test_broadcast(self): Chris@87: assert_almost_equal(np.nper(0.075, -2000, 0, 100000., [0, 1]), Chris@87: [21.5449442, 20.76156441], 4) Chris@87: Chris@87: assert_almost_equal(np.ipmt(0.1/12, list(range(5)), 24, 2000), Chris@87: [-17.29165168, -16.66666667, -16.03647345, Chris@87: -15.40102862, -14.76028842], 4) Chris@87: Chris@87: assert_almost_equal(np.ppmt(0.1/12, list(range(5)), 24, 2000), Chris@87: [-74.998201, -75.62318601, -76.25337923, Chris@87: -76.88882405, -77.52956425], 4) Chris@87: Chris@87: assert_almost_equal(np.ppmt(0.1/12, list(range(5)), 24, 2000, 0, Chris@87: [0, 0, 1, 'end', 'begin']), Chris@87: [-74.998201, -75.62318601, -75.62318601, Chris@87: -76.88882405, -76.88882405], 4) Chris@87: Chris@87: if __name__ == "__main__": Chris@87: run_module_suite()