[ { "name": "Microsoft's XIRR example is 37.34% (exact root 0.37336253352)", "args": [ [ { "date": "2008-01-01", "amount": { "minor": -1000000, "currency": "GBP" } }, { "date": "2008-03-01", "amount": { "minor": 275000, "currency": "GBP" } }, { "date": "2008-10-30", "amount": { "minor": 425000, "currency": "GBP" } }, { "date": "2009-02-15", "amount": { "minor": 325000, "currency": "GBP" } }, { "date": "2009-04-01", "amount": { "minor": 275000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 3734, "rate": "0.373362534" } }, { "name": "the same flows in any order give the same rate", "args": [ [ { "date": "2009-02-15", "amount": { "minor": 325000, "currency": "GBP" } }, { "date": "2008-01-01", "amount": { "minor": -1000000, "currency": "GBP" } }, { "date": "2009-04-01", "amount": { "minor": 275000, "currency": "GBP" } }, { "date": "2008-10-30", "amount": { "minor": 425000, "currency": "GBP" } }, { "date": "2008-03-01", "amount": { "minor": 275000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 3734, "rate": "0.373362534" } }, { "name": "+10% over a 365-day year is exactly 10%", "args": [ [ { "date": "2025-01-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2026-01-01", "amount": { "minor": 110000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 1000, "rate": "0.100000000" } }, { "name": "+10% over 2024, a 366-day year, is 9.97% on a 365-day year", "args": [ [ { "date": "2024-01-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2025-01-01", "amount": { "minor": 110000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 997, "rate": "0.099713586" } }, { "name": "a loss over two years (731 days) is negative", "args": [ [ { "date": "2020-01-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 81000, "currency": "GBP" } } ] ], "expect": { "basisPoints": -999, "rate": "-0.099870272" } }, { "name": "two deposits then a closing value", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -50000, "currency": "GBP" } }, { "date": "2021-07-01", "amount": { "minor": -50000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": -20000, "currency": "GBP" } }, { "date": "2023-01-01", "amount": { "minor": 135000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 749, "rate": "0.074868597" } }, { "name": "a deposit, a withdrawal, another deposit and the closing value", "args": [ [ { "date": "2020-01-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": 20000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": -30000, "currency": "GBP" } }, { "date": "2023-01-01", "amount": { "minor": 130000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 648, "rate": "0.064752089" } }, { "name": "a loan seen from the borrower: in first, out later", "args": [ [ { "date": "2020-01-01", "amount": { "minor": 100000, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": -110000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 997, "rate": "0.099713586" } }, { "name": "30 days at 1% compounds to 12.87% a year", "args": [ [ { "date": "2024-03-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2024-03-31", "amount": { "minor": 101000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 1287, "rate": "0.128695294" } }, { "name": "a tenfold gain in a leap year", "args": [ [ { "date": "2020-01-01", "amount": { "minor": -100, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": 1000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 89373, "rate": "8.937285322" } }, { "name": "almost everything lost", "args": [ [ { "date": "2020-01-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": 1, "currency": "GBP" } } ] ], "expect": { "basisPoints": -10000, "rate": "-0.999989680" } }, { "name": "getting back exactly what was paid in is 0", "args": [ [ { "date": "2020-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2023-06-30", "amount": { "minor": 10000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 0, "rate": "0.000000000" } }, { "name": "two payments on one day are netted", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -50000, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": -50000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 110000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 1000, "rate": "0.100000000" } }, { "name": "flows netting to zero on the first date are dropped", "args": [ [ { "date": "2020-01-01", "amount": { "minor": 100, "currency": "GBP" } }, { "date": "2020-01-01", "amount": { "minor": -100, "currency": "GBP" } }, { "date": "2020-06-01", "amount": { "minor": -100000, "currency": "GBP" } }, { "date": "2021-06-01", "amount": { "minor": 110000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 1000, "rate": "0.100000000" } }, { "name": "amounts in yen", "args": [ [ { "date": "2025-01-01", "amount": { "minor": -1000000, "currency": "GBP" } }, { "date": "2026-01-01", "amount": { "minor": 1100000, "currency": "GBP" } } ] ], "expect": { "basisPoints": 1000, "rate": "0.100000000" } }, { "name": "10% and 20% both solve -100, +230, -132: refused", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 23000, "currency": "GBP" } }, { "date": "2023-01-01", "amount": { "minor": -13200, "currency": "GBP" } } ] ], "expectError": "no single rate of return solves these cash flows" }, { "name": "more paid in than out, at every date, has no rate", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 5000, "currency": "GBP" } }, { "date": "2023-01-01", "amount": { "minor": -6000, "currency": "GBP" } } ] ], "expectError": "no single rate of return solves these cash flows" }, { "name": "payments only is Excel's #NUM", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": -5000, "currency": "GBP" } } ] ], "expectError": "flows need at least one payment and one receipt" }, { "name": "flows that net to nothing on one side", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2021-01-01", "amount": { "minor": 10000, "currency": "GBP" } } ] ], "expectError": "flows need at least one payment and one receipt" }, { "name": "no flows", "args": [ [] ], "expectError": "flows must not be empty" }, { "name": "mixed currencies", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 11000, "currency": "EUR" } } ] ], "expectError": "currency mismatch" }, { "name": "an impossible date", "args": [ [ { "date": "2021-02-30", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 11000, "currency": "GBP" } } ] ], "expectError": "is not a real calendar date" }, { "name": "flows more than 100 years apart", "args": [ [ { "date": "1900-01-01", "amount": { "minor": -10000, "currency": "GBP" } }, { "date": "2001-01-01", "amount": { "minor": 11000, "currency": "GBP" } } ] ], "expectError": "flows must fall within 36500 days of each other" }, { "name": "fractional minor units", "args": [ [ { "date": "2021-01-01", "amount": { "minor": -10000.5, "currency": "GBP" } }, { "date": "2022-01-01", "amount": { "minor": 11000, "currency": "GBP" } } ] ], "expectError": "amounts must be whole minor units" } ]