Feature/fix issue with recent transactions (#750)

* Fix percentage performance issue with recent transactions

Co-authored-by: Reto Kaul <retokaul@sublimd.com>
pull/763/head
gizmodus 2 years ago committed by GitHub
parent 32fb3551dc
commit 9f67993c03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -37,6 +37,9 @@ import { TransactionPointSymbol } from './interfaces/transaction-point-symbol.in
import { TransactionPoint } from './interfaces/transaction-point.interface'; import { TransactionPoint } from './interfaces/transaction-point.interface';
export class PortfolioCalculatorNew { export class PortfolioCalculatorNew {
private static readonly CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT =
true;
private static readonly ENABLE_LOGGING = false; private static readonly ENABLE_LOGGING = false;
private currency: string; private currency: string;
@ -688,6 +691,7 @@ export class PortfolioCalculatorNew {
let grossPerformanceAtStartDate = new Big(0); let grossPerformanceAtStartDate = new Big(0);
let grossPerformanceFromSells = new Big(0); let grossPerformanceFromSells = new Big(0);
let initialValue: Big; let initialValue: Big;
let investmentAtStartDate: Big;
let lastAveragePrice = new Big(0); let lastAveragePrice = new Big(0);
let lastTransactionInvestment = new Big(0); let lastTransactionInvestment = new Big(0);
let lastValueOfInvestmentBeforeTransaction = new Big(0); let lastValueOfInvestmentBeforeTransaction = new Big(0);
@ -697,6 +701,7 @@ export class PortfolioCalculatorNew {
let totalInvestment = new Big(0); let totalInvestment = new Big(0);
let totalInvestmentWithGrossPerformanceFromSell = new Big(0); let totalInvestmentWithGrossPerformanceFromSell = new Big(0);
let totalUnits = new Big(0); let totalUnits = new Big(0);
let valueAtStartDate: Big;
// Add a synthetic order at the start and the end date // Add a synthetic order at the start and the end date
orders.push({ orders.push({
@ -774,13 +779,18 @@ export class PortfolioCalculatorNew {
order.unitPrice order.unitPrice
); );
if (!investmentAtStartDate && i >= indexOfStartOrder) {
investmentAtStartDate = totalInvestment ?? new Big(0);
valueAtStartDate = valueOfInvestmentBeforeTransaction;
}
const transactionInvestment = order.quantity const transactionInvestment = order.quantity
.mul(order.unitPrice) .mul(order.unitPrice)
.mul(this.getFactor(order.type)); .mul(this.getFactor(order.type));
totalInvestment = totalInvestment.plus(transactionInvestment); totalInvestment = totalInvestment.plus(transactionInvestment);
if (totalInvestment.gt(maxTotalInvestment)) { if (i >= indexOfStartOrder && totalInvestment.gt(maxTotalInvestment)) {
maxTotalInvestment = totalInvestment; maxTotalInvestment = totalInvestment;
} }
@ -898,12 +908,22 @@ export class PortfolioCalculatorNew {
.minus(grossPerformanceAtStartDate) .minus(grossPerformanceAtStartDate)
.minus(fees.minus(feesAtStartDate)); .minus(fees.minus(feesAtStartDate));
const maxInvestmentBetweenStartAndEndDate = valueAtStartDate.plus(
maxTotalInvestment.minus(investmentAtStartDate)
);
const grossPerformancePercentage = const grossPerformancePercentage =
PortfolioCalculatorNew.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT ||
averagePriceAtStartDate.eq(0) || averagePriceAtStartDate.eq(0) ||
averagePriceAtEndDate.eq(0) || averagePriceAtEndDate.eq(0) ||
orders[indexOfStartOrder].unitPrice.eq(0) orders[indexOfStartOrder].unitPrice.eq(0)
? totalGrossPerformance.div(maxTotalInvestment) ? maxInvestmentBetweenStartAndEndDate.gt(0)
: unitPriceAtEndDate ? totalGrossPerformance.div(maxInvestmentBetweenStartAndEndDate)
: new Big(0)
: // This formula has the issue that buying more units with a price
// lower than the average buying price results in a positive
// performance even if the market pricse stays constant
unitPriceAtEndDate
.div(averagePriceAtEndDate) .div(averagePriceAtEndDate)
.div( .div(
orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate) orders[indexOfStartOrder].unitPrice.div(averagePriceAtStartDate)
@ -915,11 +935,17 @@ export class PortfolioCalculatorNew {
: new Big(0); : new Big(0);
const netPerformancePercentage = const netPerformancePercentage =
PortfolioCalculatorNew.CALCULATE_PERCENTAGE_PERFORMANCE_WITH_MAX_INVESTMENT ||
averagePriceAtStartDate.eq(0) || averagePriceAtStartDate.eq(0) ||
averagePriceAtEndDate.eq(0) || averagePriceAtEndDate.eq(0) ||
orders[indexOfStartOrder].unitPrice.eq(0) orders[indexOfStartOrder].unitPrice.eq(0)
? totalNetPerformance.div(maxTotalInvestment) ? maxInvestmentBetweenStartAndEndDate.gt(0)
: unitPriceAtEndDate ? totalNetPerformance.div(maxInvestmentBetweenStartAndEndDate)
: new Big(0)
: // This formula has the issue that buying more units with a price
// lower than the average buying price results in a positive
// performance even if the market pricse stays constant
unitPriceAtEndDate
.minus(feesPerUnit) .minus(feesPerUnit)
.div(averagePriceAtEndDate) .div(averagePriceAtEndDate)
.div( .div(

Loading…
Cancel
Save