From 87b82b6839f8ad360e11b6c4fb006e5739a97e3b Mon Sep 17 00:00:00 2001 From: Dmitry Astapov Date: Sat, 16 Nov 2019 15:42:15 +0000 Subject: [PATCH] lib: roi does not fail on empty input data (+test) --- hledger/Hledger/Cli/Commands/Roi.hs | 20 ++++++++++++-------- tests/roi.test | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/hledger/Hledger/Cli/Commands/Roi.hs b/hledger/Hledger/Cli/Commands/Roi.hs index 96be0aee8..61b99743e 100644 --- a/hledger/Hledger/Cli/Commands/Roi.hs +++ b/hledger/Hledger/Cli/Commands/Roi.hs @@ -148,7 +148,8 @@ timeWeightedReturn showCashFlow prettyTables investmentsQuery trans (OneSpan spa cashflow let finalUnitBalance = if null units then initialUnits else let (_,_,_,u) = last units in u - finalUnitPrice = valueAfter / finalUnitBalance + finalUnitPrice = if finalUnitBalance == 0 then initialUnitPrice + else valueAfter / finalUnitBalance totalTWR = roundTo 2 $ (finalUnitPrice - initialUnitPrice) years = fromIntegral (diffDays spanEnd spanBegin) / 365 :: Double annualizedTWR = 100*((1+(realToFrac totalTWR/100))**(1/years)-1) :: Double @@ -202,16 +203,19 @@ internalRateOfReturn showCashFlow prettyTables (OneSpan spanBegin spanEnd valueB (map ((:[]) . show) amounts)) -- 0% is always a solution, so require at least something here - case ridders + case totalCF of + [] -> return 0 + _ -> + case ridders #if MIN_VERSION_math_functions(0,3,0) - (RiddersParam 100 (AbsTol 0.00001)) + (RiddersParam 100 (AbsTol 0.00001)) #else - 0.00001 + 0.00001 #endif - (0.000000000001,10000) (interestSum spanEnd totalCF) of - Root rate -> return ((rate-1)*100) - NotBracketed -> error "Error: No solution -- not bracketed." - SearchFailed -> error "Error: Failed to find solution." + (0.000000000001,10000) (interestSum spanEnd totalCF) of + Root rate -> return ((rate-1)*100) + NotBracketed -> error "Error: No solution -- not bracketed." + SearchFailed -> error "Error: Failed to find solution." type CashFlow = [(Day, Quantity)] diff --git a/tests/roi.test b/tests/roi.test index cf60678a8..db1eaa79a 100644 --- a/tests/roi.test +++ b/tests/roi.test @@ -210,3 +210,18 @@ hledger -f- roi --inv investment --pnl pnl -b 2017-06 -e 2018 +---++------------+------------++---------------+----------+-------------+-----++-------+--------+ >>>=0 + +# 8. Dont fail where there is no rate-of-return +hledger -f- roi -p 2019-11 +<<< +2019/11/01 Example + Assets:Checking 1 + Income:Salary -1 +>>> ++---++------------+------------++---------------+----------+-------------+-----++-------+-------+ +| || Begin | End || Value (begin) | Cashflow | Value (end) | PnL || IRR | TWR | ++===++============+============++===============+==========+=============+=====++=======+=======+ +| 1 || 2019/11/01 | 2019/11/30 || 0 | 0 | 0 | 0 || 0.00% | 0.00% | ++---++------------+------------++---------------+----------+-------------+-----++-------+-------+ + +>>>=0