parent
5783497a66
commit
6cd79fab31
@ -10,11 +10,11 @@ import { Injectable } from '@nestjs/common';
|
|||||||
|
|
||||||
import { MWRPortfolioCalculator } from './mwr/portfolio-calculator';
|
import { MWRPortfolioCalculator } from './mwr/portfolio-calculator';
|
||||||
import { PortfolioCalculator } from './portfolio-calculator';
|
import { PortfolioCalculator } from './portfolio-calculator';
|
||||||
import { TWRPortfolioCalculator } from './twr/portfolio-calculator';
|
import { RoaiPortfolioCalculator } from './roai/portfolio-calculator';
|
||||||
|
|
||||||
export enum PerformanceCalculationType {
|
export enum PerformanceCalculationType {
|
||||||
MWR = 'MWR', // Money-Weighted Rate of Return
|
MWR = 'MWR', // Money-Weighted Rate of Return
|
||||||
TWR = 'TWR' // Time-Weighted Rate of Return
|
ROAI = 'ROAI' // Return on Average Investment
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -56,8 +56,8 @@ export class PortfolioCalculatorFactory {
|
|||||||
portfolioSnapshotService: this.portfolioSnapshotService,
|
portfolioSnapshotService: this.portfolioSnapshotService,
|
||||||
redisCacheService: this.redisCacheService
|
redisCacheService: this.redisCacheService
|
||||||
});
|
});
|
||||||
case PerformanceCalculationType.TWR:
|
case PerformanceCalculationType.ROAI:
|
||||||
return new TWRPortfolioCalculator({
|
return new RoaiPortfolioCalculator({
|
||||||
accountBalanceItems,
|
accountBalanceItems,
|
||||||
activities,
|
activities,
|
||||||
currency,
|
currency,
|
||||||
|
@ -137,7 +137,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -122,7 +122,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -136,7 +136,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'USD',
|
currency: 'USD',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -120,7 +120,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'USD',
|
currency: 'USD',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -107,7 +107,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'USD',
|
currency: 'USD',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -135,7 +135,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'USD',
|
currency: 'USD',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -84,7 +84,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities: [],
|
activities: [],
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -116,7 +116,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -116,7 +116,7 @@ describe('PortfolioCalculator', () => {
|
|||||||
|
|
||||||
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: 'CHF',
|
currency: 'CHF',
|
||||||
userId: userDummyData.id
|
userId: userDummyData.id
|
||||||
});
|
});
|
@ -15,7 +15,7 @@ import { Big } from 'big.js';
|
|||||||
import { addMilliseconds, differenceInDays, format, isBefore } from 'date-fns';
|
import { addMilliseconds, differenceInDays, format, isBefore } from 'date-fns';
|
||||||
import { cloneDeep, sortBy } from 'lodash';
|
import { cloneDeep, sortBy } from 'lodash';
|
||||||
|
|
||||||
export class TWRPortfolioCalculator extends PortfolioCalculator {
|
export class RoaiPortfolioCalculator extends PortfolioCalculator {
|
||||||
private chartDates: string[];
|
private chartDates: string[];
|
||||||
|
|
||||||
protected calculateOverallPerformance(
|
protected calculateOverallPerformance(
|
@ -295,7 +295,7 @@ export class PortfolioService {
|
|||||||
activities,
|
activities,
|
||||||
filters,
|
filters,
|
||||||
userId,
|
userId,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: this.request.user.Settings.settings.baseCurrency
|
currency: this.request.user.Settings.settings.baseCurrency
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ export class PortfolioService {
|
|||||||
activities,
|
activities,
|
||||||
filters,
|
filters,
|
||||||
userId,
|
userId,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: userCurrency
|
currency: userCurrency
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -680,7 +680,7 @@ export class PortfolioService {
|
|||||||
const portfolioCalculator = this.calculatorFactory.createCalculator({
|
const portfolioCalculator = this.calculatorFactory.createCalculator({
|
||||||
activities,
|
activities,
|
||||||
userId,
|
userId,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: userCurrency
|
currency: userCurrency
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -950,7 +950,7 @@ export class PortfolioService {
|
|||||||
activities,
|
activities,
|
||||||
filters,
|
filters,
|
||||||
userId,
|
userId,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: this.request.user.Settings.settings.baseCurrency
|
currency: this.request.user.Settings.settings.baseCurrency
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1116,7 +1116,7 @@ export class PortfolioService {
|
|||||||
activities,
|
activities,
|
||||||
filters,
|
filters,
|
||||||
userId,
|
userId,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: userCurrency
|
currency: userCurrency
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ export class PortfolioSnapshotProcessor {
|
|||||||
const portfolioCalculator = this.calculatorFactory.createCalculator({
|
const portfolioCalculator = this.calculatorFactory.createCalculator({
|
||||||
accountBalanceItems,
|
accountBalanceItems,
|
||||||
activities,
|
activities,
|
||||||
calculationType: PerformanceCalculationType.TWR,
|
calculationType: PerformanceCalculationType.ROAI,
|
||||||
currency: job.data.userCurrency,
|
currency: job.data.userCurrency,
|
||||||
filters: job.data.filters,
|
filters: job.data.filters,
|
||||||
userId: job.data.userId
|
userId: job.data.userId
|
||||||
|
@ -117,8 +117,8 @@
|
|||||||
<ng-container i18n>Net Performance</ng-container>
|
<ng-container i18n>Net Performance</ng-container>
|
||||||
<abbr
|
<abbr
|
||||||
class="initialism ml-2 text-muted"
|
class="initialism ml-2 text-muted"
|
||||||
title="Time-Weighted Rate of Return"
|
title="Return on Average Investment"
|
||||||
>(TWR)</abbr
|
>(ROAI)</abbr
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-column flex-wrap justify-content-end">
|
<div class="flex-column flex-wrap justify-content-end">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user