|
@ -344,6 +344,12 @@ export class PortfolioCalculatorNew { |
|
|
let totalInvestment = new Big(0); |
|
|
let totalInvestment = new Big(0); |
|
|
let totalUnits = new Big(0); |
|
|
let totalUnits = new Big(0); |
|
|
|
|
|
|
|
|
|
|
|
const holdingPeriodPerformances: { |
|
|
|
|
|
grossReturn: Big; |
|
|
|
|
|
netReturn: Big; |
|
|
|
|
|
valueOfInvestment: 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({ |
|
|
symbol, |
|
|
symbol, |
|
@ -463,7 +469,7 @@ export class PortfolioCalculatorNew { |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
const netHoldingPeriodReturn = valueOfInvestmentBeforeTransaction |
|
|
const netHoldingPeriodReturn = valueOfInvestmentBeforeTransaction |
|
|
.sub(fees.sub(order.fee)) |
|
|
.sub(fees.minus(feesAtStartDate)) |
|
|
.sub( |
|
|
.sub( |
|
|
lastValueOfInvestmentBeforeTransaction.plus( |
|
|
lastValueOfInvestmentBeforeTransaction.plus( |
|
|
lastTransactionInvestment |
|
|
lastTransactionInvestment |
|
@ -479,6 +485,14 @@ export class PortfolioCalculatorNew { |
|
|
timeWeightedNetPerformancePercentage.mul( |
|
|
timeWeightedNetPerformancePercentage.mul( |
|
|
new Big(1).plus(netHoldingPeriodReturn) |
|
|
new Big(1).plus(netHoldingPeriodReturn) |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
holdingPeriodPerformances.push({ |
|
|
|
|
|
grossReturn: grossHoldingPeriodReturn, |
|
|
|
|
|
netReturn: netHoldingPeriodReturn, |
|
|
|
|
|
valueOfInvestment: lastValueOfInvestmentBeforeTransaction.plus( |
|
|
|
|
|
lastTransactionInvestment |
|
|
|
|
|
) |
|
|
|
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
grossPerformance = newGrossPerformance; |
|
|
grossPerformance = newGrossPerformance; |
|
@ -508,13 +522,39 @@ export class PortfolioCalculatorNew { |
|
|
.minus(grossPerformanceAtStartDate) |
|
|
.minus(grossPerformanceAtStartDate) |
|
|
.minus(fees.minus(feesAtStartDate)); |
|
|
.minus(fees.minus(feesAtStartDate)); |
|
|
|
|
|
|
|
|
|
|
|
let valueOfInvestmentSum = new Big(0); |
|
|
|
|
|
|
|
|
|
|
|
for (const holdingPeriodPerformance of holdingPeriodPerformances) { |
|
|
|
|
|
valueOfInvestmentSum = valueOfInvestmentSum.add( |
|
|
|
|
|
holdingPeriodPerformance.valueOfInvestment |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let totalWeightedGrossPerformance = new Big(0); |
|
|
|
|
|
let totalWeightedNetPerformance = new Big(0); |
|
|
|
|
|
|
|
|
|
|
|
// Weight the holding period returns according to their value of investment
|
|
|
|
|
|
for (const holdingPeriodPerformance of holdingPeriodPerformances) { |
|
|
|
|
|
totalWeightedGrossPerformance = totalWeightedGrossPerformance.plus( |
|
|
|
|
|
holdingPeriodPerformance.grossReturn |
|
|
|
|
|
.mul(holdingPeriodPerformance.valueOfInvestment) |
|
|
|
|
|
.div(valueOfInvestmentSum) |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
totalWeightedNetPerformance = totalWeightedNetPerformance.plus( |
|
|
|
|
|
holdingPeriodPerformance.netReturn |
|
|
|
|
|
.mul(holdingPeriodPerformance.valueOfInvestment) |
|
|
|
|
|
.div(valueOfInvestmentSum) |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
initialValue, |
|
|
initialValue, |
|
|
hasErrors: !initialValue || !unitPriceAtEndDate, |
|
|
hasErrors: !initialValue || !unitPriceAtEndDate, |
|
|
netPerformance: totalNetPerformance, |
|
|
netPerformance: totalNetPerformance, |
|
|
netPerformancePercentage: timeWeightedNetPerformancePercentage, |
|
|
netPerformancePercentage: totalWeightedNetPerformance, |
|
|
grossPerformance: totalGrossPerformance, |
|
|
grossPerformance: totalGrossPerformance, |
|
|
grossPerformancePercentage: timeWeightedGrossPerformancePercentage |
|
|
grossPerformancePercentage: totalWeightedGrossPerformance |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|