From 99f042da0041f37c79a0863dbabd2fe319f2cd6a Mon Sep 17 00:00:00 2001 From: Reto Kaul Date: Sat, 17 Aug 2024 16:57:52 +0200 Subject: [PATCH 1/3] Do not count days with 0 investment when calculating average investment --- .../calculator/twr/portfolio-calculator.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 3b0f755fd..fea98ccf8 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -877,8 +877,6 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { startDate = addDays(start, 1); } - let average = new Big(0); - const currentValuesAtStartDateWithCurrencyEffect = currentValuesWithCurrencyEffect[format(startDate, DATE_FORMAT)] ?? new Big(0); @@ -901,11 +899,13 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { return format(date, DATE_FORMAT); }); + let average = new Big(0); let dayCount = 0; for (const date of dates) { if ( - investmentValuesAccumulatedWithCurrencyEffect[date] instanceof Big + investmentValuesAccumulatedWithCurrencyEffect[date] instanceof Big && + investmentValuesAccumulatedWithCurrencyEffect[date].gt(0) ) { average = average.add( investmentValuesAccumulatedWithCurrencyEffect[date].add( @@ -917,18 +917,16 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { } } - average = average.div(dayCount); - - // TODO: Why without minus? - netPerformanceWithCurrencyEffectMap[dateRange] = average.gt(0) - ? netPerformanceValuesWithCurrencyEffect[ - format(endDate, DATE_FORMAT) - ] /*.minus( - netPerformanceValuesWithCurrencyEffect[ - format(startDate, DATE_FORMAT) - ] - )*/ - : new Big(0); + if (dayCount > 0) { + average = average.div(dayCount); + } + + netPerformanceWithCurrencyEffectMap[dateRange] = + netPerformanceValuesWithCurrencyEffect[ + format(endDate, DATE_FORMAT) + ].minus( + netPerformanceValuesWithCurrencyEffect[format(startDate, DATE_FORMAT)] + ); netPerformancePercentageWithCurrencyEffectMap[dateRange] = average.gt(0) ? netPerformanceWithCurrencyEffectMap[dateRange].div(average) From 026af10f366bcf58753ed01cdc6b906599b9400d Mon Sep 17 00:00:00 2001 From: Reto Kaul Date: Sat, 17 Aug 2024 17:28:25 +0200 Subject: [PATCH 2/3] Fix tests --- ...ator-baln-buy-and-sell-in-two-activities.spec.ts | 2 +- .../portfolio-calculator-baln-buy-and-sell.spec.ts | 2 +- .../portfolio-calculator-novn-buy-and-sell.spec.ts | 2 +- .../calculator/twr/portfolio-calculator.ts | 13 ++++++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index a95f2eee0..5c63cb58d 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -178,7 +178,7 @@ describe('PortfolioCalculator', () => { '-0.05528341497550734703' ), netPerformancePercentageWithCurrencyEffectMap: { - max: new Big('-0.18658152554233729881') // TODO: Different + max: new Big('-0.0552834149755073478') }, netPerformanceWithCurrencyEffect: new Big('-15.8'), netPerformanceWithCurrencyEffectMap: { diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts index b0ee40299..5ce1dd80b 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -163,7 +163,7 @@ describe('PortfolioCalculator', () => { '-0.0552834149755073478' ), netPerformancePercentageWithCurrencyEffectMap: { - max: new Big('-0.18658152554233729881') // TODO: Different + max: new Big('-0.0552834149755073478') }, netPerformanceWithCurrencyEffect: new Big('-15.8'), netPerformanceWithCurrencyEffectMap: { diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts index 760508453..828cbc55e 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -193,7 +193,7 @@ describe('PortfolioCalculator', () => { '0.13100263852242744063' ), netPerformancePercentageWithCurrencyEffectMap: { - max: new Big('0.14737796833773087071') + max: new Big('0.13100263852242744063') }, netPerformanceWithCurrencyEffect: new Big('19.86'), netPerformanceWithCurrencyEffectMap: { diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index fea98ccf8..d7cbcfda3 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -924,9 +924,16 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { netPerformanceWithCurrencyEffectMap[dateRange] = netPerformanceValuesWithCurrencyEffect[ format(endDate, DATE_FORMAT) - ].minus( - netPerformanceValuesWithCurrencyEffect[format(startDate, DATE_FORMAT)] - ); + ]?.minus( + // If the date range is 'max', take 0 as a start value. Otherwise, + // the value of the end of the day of the start date is taken which + // can differ. + dateRange === 'max' + ? new Big(0) + : (netPerformanceValuesWithCurrencyEffect[ + format(startDate, DATE_FORMAT) + ] ?? new Big(0)) + ) ?? new Big(0); netPerformancePercentageWithCurrencyEffectMap[dateRange] = average.gt(0) ? netPerformanceWithCurrencyEffectMap[dateRange].div(average) From c3ec2205020c6b6002bb8809bffa6e12c8261618 Mon Sep 17 00:00:00 2001 From: Reto Kaul Date: Sat, 17 Aug 2024 20:22:17 +0200 Subject: [PATCH 3/3] Improve comment --- .../src/app/portfolio/calculator/twr/portfolio-calculator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index d7cbcfda3..d16665815 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -927,7 +927,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { ]?.minus( // If the date range is 'max', take 0 as a start value. Otherwise, // the value of the end of the day of the start date is taken which - // can differ. + // differs from the buying price. dateRange === 'max' ? new Big(0) : (netPerformanceValuesWithCurrencyEffect[