lib: roi does not fail on empty input data (+test)
This commit is contained in:
		
							parent
							
								
									e49da20f8c
								
							
						
					
					
						commit
						87b82b6839
					
				| @ -148,7 +148,8 @@ timeWeightedReturn showCashFlow prettyTables investmentsQuery trans (OneSpan spa | |||||||
|           cashflow |           cashflow | ||||||
| 
 | 
 | ||||||
|   let finalUnitBalance = if null units then initialUnits else let (_,_,_,u) = last units in u |   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) |       totalTWR = roundTo 2 $ (finalUnitPrice - initialUnitPrice) | ||||||
|       years = fromIntegral (diffDays spanEnd spanBegin) / 365 :: Double |       years = fromIntegral (diffDays spanEnd spanBegin) / 365 :: Double | ||||||
|       annualizedTWR = 100*((1+(realToFrac totalTWR/100))**(1/years)-1) :: 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)) |        (map ((:[]) . show) amounts)) | ||||||
| 
 | 
 | ||||||
|   -- 0% is always a solution, so require at least something here |   -- 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) | #if MIN_VERSION_math_functions(0,3,0) | ||||||
|     (RiddersParam 100 (AbsTol 0.00001)) |         (RiddersParam 100 (AbsTol 0.00001)) | ||||||
| #else | #else | ||||||
|     0.00001 |         0.00001 | ||||||
| #endif | #endif | ||||||
|     (0.000000000001,10000) (interestSum spanEnd totalCF) of |         (0.000000000001,10000) (interestSum spanEnd totalCF) of | ||||||
|     Root rate -> return ((rate-1)*100) |         Root rate -> return ((rate-1)*100) | ||||||
|     NotBracketed -> error "Error: No solution -- not bracketed." |         NotBracketed -> error "Error: No solution -- not bracketed." | ||||||
|     SearchFailed -> error "Error: Failed to find solution." |         SearchFailed -> error "Error: Failed to find solution." | ||||||
| 
 | 
 | ||||||
| type CashFlow = [(Day, Quantity)] | type CashFlow = [(Day, Quantity)] | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -210,3 +210,18 @@ hledger -f- roi --inv investment --pnl pnl -b 2017-06 -e 2018 | |||||||
| +---++------------+------------++---------------+----------+-------------+-----++-------+--------+ | +---++------------+------------++---------------+----------+-------------+-----++-------+--------+ | ||||||
| 
 | 
 | ||||||
| >>>=0 | >>>=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 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user