mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 6 changed files with 121 additions and 112 deletions
			
			
		| @ -1,78 +0,0 @@ | |||||
| import { Big } from 'big.js'; |  | ||||
| 
 |  | ||||
| import { PortfolioService } from './portfolio.service'; |  | ||||
| 
 |  | ||||
| describe('PortfolioService', () => { |  | ||||
|   let portfolioService: PortfolioService; |  | ||||
| 
 |  | ||||
|   beforeAll(async () => { |  | ||||
|     portfolioService = new PortfolioService( |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null, |  | ||||
|       null |  | ||||
|     ); |  | ||||
|   }); |  | ||||
| 
 |  | ||||
|   describe('annualized performance percentage', () => { |  | ||||
|     it('Get annualized performance', async () => { |  | ||||
|       expect( |  | ||||
|         portfolioService |  | ||||
|           .getAnnualizedPerformancePercent({ |  | ||||
|             daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day
 |  | ||||
|             netPerformancePercentage: new Big(0) |  | ||||
|           }) |  | ||||
|           .toNumber() |  | ||||
|       ).toEqual(0); |  | ||||
| 
 |  | ||||
|       expect( |  | ||||
|         portfolioService |  | ||||
|           .getAnnualizedPerformancePercent({ |  | ||||
|             daysInMarket: 0, |  | ||||
|             netPerformancePercentage: new Big(0) |  | ||||
|           }) |  | ||||
|           .toNumber() |  | ||||
|       ).toEqual(0); |  | ||||
| 
 |  | ||||
|       /** |  | ||||
|        * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html
 |  | ||||
|        */ |  | ||||
|       expect( |  | ||||
|         portfolioService |  | ||||
|           .getAnnualizedPerformancePercent({ |  | ||||
|             daysInMarket: 65, // < 1 year
 |  | ||||
|             netPerformancePercentage: new Big(0.1025) |  | ||||
|           }) |  | ||||
|           .toNumber() |  | ||||
|       ).toBeCloseTo(0.729705); |  | ||||
| 
 |  | ||||
|       expect( |  | ||||
|         portfolioService |  | ||||
|           .getAnnualizedPerformancePercent({ |  | ||||
|             daysInMarket: 365, // 1 year
 |  | ||||
|             netPerformancePercentage: 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( |  | ||||
|         portfolioService |  | ||||
|           .getAnnualizedPerformancePercent({ |  | ||||
|             daysInMarket: 575, // > 1 year
 |  | ||||
|             netPerformancePercentage: new Big(0.2374) |  | ||||
|           }) |  | ||||
|           .toNumber() |  | ||||
|       ).toBeCloseTo(0.145); |  | ||||
|     }); |  | ||||
|   }); |  | ||||
| }); |  | ||||
| @ -0,0 +1,50 @@ | |||||
|  | import { Big } from 'big.js'; | ||||
|  | 
 | ||||
|  | import { getAnnualizedPerformancePercent } from './calculation-helper'; | ||||
|  | 
 | ||||
|  | describe('CalculationHelper', () => { | ||||
|  |   describe('annualized performance percentage', () => { | ||||
|  |     it('Get annualized performance', async () => { | ||||
|  |       expect( | ||||
|  |         getAnnualizedPerformancePercent({ | ||||
|  |           daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day
 | ||||
|  |           netPerformancePercentage: new Big(0) | ||||
|  |         }).toNumber() | ||||
|  |       ).toEqual(0); | ||||
|  | 
 | ||||
|  |       expect( | ||||
|  |         getAnnualizedPerformancePercent({ | ||||
|  |           daysInMarket: 0, | ||||
|  |           netPerformancePercentage: new Big(0) | ||||
|  |         }).toNumber() | ||||
|  |       ).toEqual(0); | ||||
|  | 
 | ||||
|  |       /** | ||||
|  |        * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html
 | ||||
|  |        */ | ||||
|  |       expect( | ||||
|  |         getAnnualizedPerformancePercent({ | ||||
|  |           daysInMarket: 65, // < 1 year
 | ||||
|  |           netPerformancePercentage: new Big(0.1025) | ||||
|  |         }).toNumber() | ||||
|  |       ).toBeCloseTo(0.729705); | ||||
|  | 
 | ||||
|  |       expect( | ||||
|  |         getAnnualizedPerformancePercent({ | ||||
|  |           daysInMarket: 365, // 1 year
 | ||||
|  |           netPerformancePercentage: 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( | ||||
|  |         getAnnualizedPerformancePercent({ | ||||
|  |           daysInMarket: 575, // > 1 year
 | ||||
|  |           netPerformancePercentage: new Big(0.2374) | ||||
|  |         }).toNumber() | ||||
|  |       ).toBeCloseTo(0.145); | ||||
|  |     }); | ||||
|  |   }); | ||||
|  | }); | ||||
| @ -0,0 +1,20 @@ | |||||
|  | import { Big } from 'big.js'; | ||||
|  | import { isNumber } from 'lodash'; | ||||
|  | 
 | ||||
|  | export function getAnnualizedPerformancePercent({ | ||||
|  |   daysInMarket, | ||||
|  |   netPerformancePercentage | ||||
|  | }: { | ||||
|  |   daysInMarket: number; | ||||
|  |   netPerformancePercentage: Big; | ||||
|  | }): Big { | ||||
|  |   if (isNumber(daysInMarket) && daysInMarket > 0) { | ||||
|  |     const exponent = new Big(365).div(daysInMarket).toNumber(); | ||||
|  | 
 | ||||
|  |     return new Big( | ||||
|  |       Math.pow(netPerformancePercentage.plus(1).toNumber(), exponent) | ||||
|  |     ).minus(1); | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   return new Big(0); | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue