Browse Source

Add realized dividends to gross performance

- Dividends will  be handled like sell-orders performancewise
This might be one approach to solve issue #3233
pull/3857/head
Dan 7 months ago
parent
commit
234e75c570
  1. 118
      apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts

118
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts

@ -137,6 +137,8 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
let grossPerformanceAtStartDateWithCurrencyEffect = new Big(0); let grossPerformanceAtStartDateWithCurrencyEffect = new Big(0);
let grossPerformanceFromSells = new Big(0); let grossPerformanceFromSells = new Big(0);
let grossPerformanceFromSellsWithCurrencyEffect = new Big(0); let grossPerformanceFromSellsWithCurrencyEffect = new Big(0);
let grossPerformanceFromDividends = new Big(0);
let grossPerformanceFromDividendsWithCurrencyEffect = new Big(0);
let initialValue: Big; let initialValue: Big;
let initialValueWithCurrencyEffect: Big; let initialValueWithCurrencyEffect: Big;
let investmentAtStartDate: Big; let investmentAtStartDate: Big;
@ -554,28 +556,27 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
order.unitPriceInBaseCurrencyWithCurrencyEffect order.unitPriceInBaseCurrencyWithCurrencyEffect
); );
const grossPerformanceFromSell = ({
order.type === 'SELL' grossPerformanceFromSells,
? order.unitPriceInBaseCurrency grossPerformanceFromSellsWithCurrencyEffect
.minus(lastAveragePrice) } = this.handleSellOrder(
.mul(order.quantity) order,
: new Big(0); lastAveragePrice,
lastAveragePriceWithCurrencyEffect,
const grossPerformanceFromSellWithCurrencyEffect = grossPerformanceFromSells,
order.type === 'SELL' grossPerformanceFromSellsWithCurrencyEffect
? order.unitPriceInBaseCurrencyWithCurrencyEffect ));
.minus(lastAveragePriceWithCurrencyEffect)
.mul(order.quantity) ({
: new Big(0); grossPerformanceFromDividends,
grossPerformanceFromDividendsWithCurrencyEffect
grossPerformanceFromSells = grossPerformanceFromSells.plus( } = this.handleDividend(
grossPerformanceFromSell order,
); grossPerformanceFromDividends,
grossPerformanceFromDividendsWithCurrencyEffect,
grossPerformanceFromSellsWithCurrencyEffect = currentExchangeRate,
grossPerformanceFromSellsWithCurrencyEffect.plus( exchangeRateAtOrderDate
grossPerformanceFromSellWithCurrencyEffect ));
);
lastAveragePrice = totalQuantityFromBuyTransactions.eq(0) lastAveragePrice = totalQuantityFromBuyTransactions.eq(0)
? new Big(0) ? new Big(0)
@ -597,19 +598,21 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
grossPerformanceFromSells.toNumber() grossPerformanceFromSells.toNumber()
); );
console.log( console.log(
'grossPerformanceFromSellWithCurrencyEffect', 'grossPerformanceFromSellsWithCurrencyEffect',
grossPerformanceFromSellWithCurrencyEffect.toNumber() grossPerformanceFromSellsWithCurrencyEffect.toNumber()
); );
} }
const newGrossPerformance = valueOfInvestment const newGrossPerformance = valueOfInvestment
.minus(totalInvestment) .minus(totalInvestment)
.plus(grossPerformanceFromSells); .plus(grossPerformanceFromSells)
.plus(grossPerformanceFromDividends);
const newGrossPerformanceWithCurrencyEffect = const newGrossPerformanceWithCurrencyEffect =
valueOfInvestmentWithCurrencyEffect valueOfInvestmentWithCurrencyEffect
.minus(totalInvestmentWithCurrencyEffect) .minus(totalInvestmentWithCurrencyEffect)
.plus(grossPerformanceFromSellsWithCurrencyEffect); .plus(grossPerformanceFromSellsWithCurrencyEffect)
.plus(grossPerformanceFromDividendsWithCurrencyEffect);
grossPerformance = newGrossPerformance; grossPerformance = newGrossPerformance;
@ -961,4 +964,67 @@ export class TWRPortfolioCalculator extends PortfolioCalculator {
timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect timeWeightedAverageInvestmentBetweenStartAndEndDateWithCurrencyEffect
}; };
} }
private handleSellOrder(
order: PortfolioOrderItem,
lastAveragePrice,
lastAveragePriceWithCurrencyEffect,
grossPerformanceFromSells,
grossPerformanceFromSellsWithCurrencyEffect
) {
if (order.type === 'SELL') {
const grossPerformanceFromSell = order.unitPriceInBaseCurrency
.minus(lastAveragePrice)
.mul(order.quantity);
const grossPerformanceFromSellWithCurrencyEffect =
order.unitPriceInBaseCurrencyWithCurrencyEffect
.minus(lastAveragePriceWithCurrencyEffect)
.mul(order.quantity);
grossPerformanceFromSells = grossPerformanceFromSells.plus(
grossPerformanceFromSell
);
grossPerformanceFromSellsWithCurrencyEffect =
grossPerformanceFromSellsWithCurrencyEffect.plus(
grossPerformanceFromSellWithCurrencyEffect
);
}
return {
grossPerformanceFromSells,
grossPerformanceFromSellsWithCurrencyEffect
};
}
private handleDividend(
order: PortfolioOrderItem,
grossPerformanceFromDividends,
grossPerformanceFromDividendsWithCurrencyEffect,
currentExchangeRate: number,
exchangeRateAtDateOfOrder: number
) {
if (order.type === 'DIVIDEND') {
const grossPerformanceFromDividend = order.unitPrice
.mul(currentExchangeRate)
.mul(order.quantity);
const grossPerformanceFromDividendWithCurrencyEffect = order.unitPrice
.mul(exchangeRateAtDateOfOrder)
.mul(order.quantity);
grossPerformanceFromDividends = grossPerformanceFromDividends.plus(
grossPerformanceFromDividend
);
grossPerformanceFromDividendsWithCurrencyEffect =
grossPerformanceFromDividendsWithCurrencyEffect.plus(
grossPerformanceFromDividendWithCurrencyEffect
);
}
return {
grossPerformanceFromDividends,
grossPerformanceFromDividendsWithCurrencyEffect
};
}
} }

Loading…
Cancel
Save