Browse Source

Use total investment as basis to avoid performance lower than -100%

pull/5027/head
Dan 2 months ago
parent
commit
c6627fc563
  1. 78
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts

78
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts

@ -767,19 +767,14 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
) )
: new Big(0); : new Big(0);
const grossPerformancePercentage = const grossPerformancePercentage = totalInvestment.gt(0)
timeWeightedAverageInvestmentBetweenStartAndEndDate.gt(0) ? totalGrossPerformance.div(totalInvestment)
? totalGrossPerformance.div( : new Big(0);
timeWeightedAverageInvestmentBetweenStartAndEndDate
)
: new Big(0);
const grossPerformancePercentageWithCurrencyEffect = const grossPerformancePercentageWithCurrencyEffect =
timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect.gt( totalInvestmentWithCurrencyEffect.gt(0)
0
)
? totalGrossPerformanceWithCurrencyEffect.div( ? totalGrossPerformanceWithCurrencyEffect.div(
timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect totalInvestmentWithCurrencyEffect
) )
: new Big(0); : new Big(0);
@ -793,12 +788,9 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
.div(totalUnits) .div(totalUnits)
: new Big(0); : new Big(0);
const netPerformancePercentage = const netPerformancePercentage = totalInvestment.gt(0)
timeWeightedAverageInvestmentBetweenStartAndEndDate.gt(0) ? totalNetPerformance.div(totalInvestment)
? totalNetPerformance.div( : new Big(0);
timeWeightedAverageInvestmentBetweenStartAndEndDate
)
: new Big(0);
const netPerformancePercentageWithCurrencyEffectMap: { const netPerformancePercentageWithCurrencyEffectMap: {
[key: DateRange]: Big; [key: DateRange]: Big;
@ -810,6 +802,9 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
for (const dateRange of [ for (const dateRange of [
'1d', '1d',
'1w',
'1m',
'3m',
'1y', '1y',
'5y', '5y',
'max', 'max',
@ -836,48 +831,6 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
const rangeEndDateString = format(endDate, DATE_FORMAT); const rangeEndDateString = format(endDate, DATE_FORMAT);
const rangeStartDateString = format(startDate, DATE_FORMAT); const rangeStartDateString = format(startDate, DATE_FORMAT);
const currentValuesAtDateRangeStartWithCurrencyEffect =
currentValuesWithCurrencyEffect[rangeStartDateString] ?? new Big(0);
const investmentValuesAccumulatedAtStartDateWithCurrencyEffect =
investmentValuesAccumulatedWithCurrencyEffect[rangeStartDateString] ??
new Big(0);
const grossPerformanceAtDateRangeStartWithCurrencyEffect =
currentValuesAtDateRangeStartWithCurrencyEffect.minus(
investmentValuesAccumulatedAtStartDateWithCurrencyEffect
);
let average = new Big(0);
let dayCount = 0;
for (let i = this.chartDates.length - 1; i >= 0; i -= 1) {
const date = this.chartDates[i];
if (date > rangeEndDateString) {
continue;
} else if (date < rangeStartDateString) {
break;
}
if (
investmentValuesAccumulatedWithCurrencyEffect[date] instanceof Big &&
investmentValuesAccumulatedWithCurrencyEffect[date].gt(0)
) {
average = average.add(
investmentValuesAccumulatedWithCurrencyEffect[date].add(
grossPerformanceAtDateRangeStartWithCurrencyEffect
)
);
dayCount++;
}
}
if (dayCount > 0) {
average = average.div(dayCount);
}
netPerformanceWithCurrencyEffectMap[dateRange] = netPerformanceWithCurrencyEffectMap[dateRange] =
netPerformanceValuesWithCurrencyEffect[rangeEndDateString]?.minus( netPerformanceValuesWithCurrencyEffect[rangeEndDateString]?.minus(
// If the date range is 'max', take 0 as a start value. Otherwise, // If the date range is 'max', take 0 as a start value. Otherwise,
@ -889,9 +842,12 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
new Big(0)) new Big(0))
) ?? new Big(0); ) ?? new Big(0);
netPerformancePercentageWithCurrencyEffectMap[dateRange] = average.gt(0) netPerformancePercentageWithCurrencyEffectMap[dateRange] =
? netPerformanceWithCurrencyEffectMap[dateRange].div(average) investmentValuesAccumulatedWithCurrencyEffect[rangeEndDateString]?.gt(0)
: new Big(0); ? netPerformanceWithCurrencyEffectMap[dateRange].div(
investmentValuesAccumulatedWithCurrencyEffect[rangeEndDateString]
)
: new Big(0);
} }
if (PortfolioCalculator.ENABLE_LOGGING) { if (PortfolioCalculator.ENABLE_LOGGING) {

Loading…
Cancel
Save