2021-07-01 23:11:41 +02:00
|
|
|
import Big from 'big.js';
|
|
|
|
|
2021-08-14 16:55:40 +02:00
|
|
|
import { CurrentRateService } from './current-rate.service';
|
|
|
|
import { PortfolioCalculator } from './portfolio-calculator';
|
|
|
|
|
2021-07-01 23:11:41 +02:00
|
|
|
describe('PortfolioCalculator', () => {
|
|
|
|
let currentRateService: CurrentRateService;
|
2021-07-08 22:42:19 +02:00
|
|
|
|
2021-07-01 23:11:41 +02:00
|
|
|
beforeEach(() => {
|
2021-07-08 22:42:19 +02:00
|
|
|
currentRateService = new CurrentRateService(null, null, null);
|
2021-07-01 23:11:41 +02:00
|
|
|
});
|
|
|
|
|
2021-09-12 14:08:42 -04:00
|
|
|
describe('annualized performance percentage', () => {
|
2022-04-09 10:17:31 +02:00
|
|
|
const portfolioCalculator = new PortfolioCalculator({
|
2021-09-12 14:08:42 -04:00
|
|
|
currentRateService,
|
2022-04-09 10:17:31 +02:00
|
|
|
currency: 'USD',
|
|
|
|
orders: []
|
|
|
|
});
|
2021-09-12 14:08:42 -04:00
|
|
|
|
|
|
|
it('Get annualized performance', async () => {
|
|
|
|
expect(
|
|
|
|
portfolioCalculator
|
|
|
|
.getAnnualizedPerformancePercent({
|
|
|
|
daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day
|
|
|
|
netPerformancePercent: new Big(0)
|
|
|
|
})
|
|
|
|
.toNumber()
|
|
|
|
).toEqual(0);
|
|
|
|
|
|
|
|
expect(
|
|
|
|
portfolioCalculator
|
|
|
|
.getAnnualizedPerformancePercent({
|
|
|
|
daysInMarket: 0,
|
|
|
|
netPerformancePercent: new Big(0)
|
|
|
|
})
|
|
|
|
.toNumber()
|
|
|
|
).toEqual(0);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Source: https://www.readyratios.com/reference/analysis/annualized_rate.html
|
|
|
|
*/
|
|
|
|
expect(
|
|
|
|
portfolioCalculator
|
|
|
|
.getAnnualizedPerformancePercent({
|
|
|
|
daysInMarket: 65, // < 1 year
|
|
|
|
netPerformancePercent: new Big(0.1025)
|
|
|
|
})
|
|
|
|
.toNumber()
|
|
|
|
).toBeCloseTo(0.729705);
|
|
|
|
|
|
|
|
expect(
|
|
|
|
portfolioCalculator
|
|
|
|
.getAnnualizedPerformancePercent({
|
|
|
|
daysInMarket: 365, // 1 year
|
|
|
|
netPerformancePercent: new Big(0.05)
|
|
|
|
})
|
|
|
|
.toNumber()
|
|
|
|
).toBeCloseTo(0.05);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Source: https://www.investopedia.com/terms/a/annualized-total-return.asp#annualized-return-formula-and-calculation
|
|
|
|
*/
|
|
|
|
expect(
|
|
|
|
portfolioCalculator
|
|
|
|
.getAnnualizedPerformancePercent({
|
|
|
|
daysInMarket: 575, // > 1 year
|
|
|
|
netPerformancePercent: new Big(0.2374)
|
|
|
|
})
|
|
|
|
.toNumber()
|
|
|
|
).toBeCloseTo(0.145);
|
|
|
|
});
|
|
|
|
});
|
2021-07-06 19:34:37 +02:00
|
|
|
});
|