Browse Source

Refactor portfolio calculator

pull/1803/head
Thomas 3 years ago
parent
commit
8d9d2bdfeb
  1. 93
      apps/api/src/app/portfolio/portfolio-calculator.ts

93
apps/api/src/app/portfolio/portfolio-calculator.ts

@ -235,6 +235,15 @@ export class PortfolioCalculator {
} }
} }
const valuesByDate: {
[date: string]: {
maxTotalInvestmentValue: Big;
totalCurrentValue: Big;
totalInvestmentValue: Big;
totalNetPerformanceValue: Big;
};
} = {};
const valuesBySymbol: { const valuesBySymbol: {
[symbol: string]: { [symbol: string]: {
currentValues: { [date: string]: Big }; currentValues: { [date: string]: Big };
@ -244,11 +253,6 @@ export class PortfolioCalculator {
}; };
} = {}; } = {};
const totalCurrentValues: { [date: string]: Big } = {};
const totalNetPerformanceValues: { [date: string]: Big } = {};
const totalInvestmentValues: { [date: string]: Big } = {};
const maxTotalInvestmentValues: { [date: string]: Big } = {};
for (const symbol of Object.keys(symbols)) { for (const symbol of Object.keys(symbols)) {
const { const {
currentValues, currentValues,
@ -276,58 +280,55 @@ export class PortfolioCalculator {
const dateString = format(currentDate, DATE_FORMAT); const dateString = format(currentDate, DATE_FORMAT);
for (const symbol of Object.keys(valuesBySymbol)) { for (const symbol of Object.keys(valuesBySymbol)) {
totalCurrentValues[dateString] = const symbolValues = valuesBySymbol[symbol];
totalCurrentValues[dateString] ?? new Big(0);
const currentValue =
if (valuesBySymbol[symbol]?.currentValues?.[dateString]) { symbolValues.currentValues?.[dateString] ?? new Big(0);
totalCurrentValues[dateString] = totalCurrentValues[dateString].add( const investmentValue =
valuesBySymbol[symbol].currentValues[dateString] symbolValues.investmentValues?.[dateString] ?? new Big(0);
); const maxInvestmentValue =
} symbolValues.maxInvestmentValues?.[dateString] ?? new Big(0);
const netPerformanceValue =
totalNetPerformanceValues[dateString] = symbolValues.netPerformanceValues?.[dateString] ?? new Big(0);
totalNetPerformanceValues[dateString] ?? new Big(0);
valuesByDate[dateString] = {
if (valuesBySymbol[symbol]?.netPerformanceValues?.[dateString]) { totalCurrentValue: (
totalNetPerformanceValues[dateString] = totalNetPerformanceValues[ valuesByDate[dateString]?.totalCurrentValue ?? new Big(0)
dateString ).add(currentValue),
].add(valuesBySymbol[symbol].netPerformanceValues[dateString]); totalInvestmentValue: (
valuesByDate[dateString]?.totalInvestmentValue ?? new Big(0)
).add(investmentValue),
maxTotalInvestmentValue: (
valuesByDate[dateString]?.maxTotalInvestmentValue ?? new Big(0)
).add(maxInvestmentValue),
totalNetPerformanceValue: (
valuesByDate[dateString]?.totalNetPerformanceValue ?? new Big(0)
).add(netPerformanceValue)
};
} }
totalInvestmentValues[dateString] =
totalInvestmentValues[dateString] ?? new Big(0);
if (valuesBySymbol[symbol]?.investmentValues?.[dateString]) {
totalInvestmentValues[dateString] = totalInvestmentValues[
dateString
].add(valuesBySymbol[symbol].investmentValues[dateString]);
} }
maxTotalInvestmentValues[dateString] = return Object.entries(valuesByDate).map(([date, values]) => {
maxTotalInvestmentValues[dateString] ?? new Big(0); const {
maxTotalInvestmentValue,
if (valuesBySymbol[symbol]?.maxInvestmentValues?.[dateString]) { totalCurrentValue,
maxTotalInvestmentValues[dateString] = maxTotalInvestmentValues[ totalInvestmentValue,
dateString totalNetPerformanceValue
].add(valuesBySymbol[symbol].maxInvestmentValues[dateString]); } = values;
}
}
}
return Object.keys(totalNetPerformanceValues).map((date) => { const netPerformanceInPercentage = maxTotalInvestmentValue.eq(0)
const netPerformanceInPercentage = maxTotalInvestmentValues[date].eq(0)
? 0 ? 0
: totalNetPerformanceValues[date] : totalNetPerformanceValue
.div(maxTotalInvestmentValues[date]) .div(maxTotalInvestmentValue)
.mul(100) .mul(100)
.toNumber(); .toNumber();
return { return {
date, date,
netPerformanceInPercentage, netPerformanceInPercentage,
netPerformance: totalNetPerformanceValues[date].toNumber(), netPerformance: totalNetPerformanceValue.toNumber(),
totalInvestment: totalInvestmentValues[date].toNumber(), totalInvestment: totalInvestmentValue.toNumber(),
value: totalCurrentValues[date].toNumber() value: totalCurrentValue.toNumber()
}; };
}); });
} }

Loading…
Cancel
Save