Skip to content

Commit

Permalink
Merge pull request #26 from lazarospsa/AverageReturn-#12
Browse files Browse the repository at this point in the history
AverageReturn #12,  AverageReturnAnnualized #13
  • Loading branch information
lazarospsa committed Dec 18, 2023
2 parents 5a8373f + d4a9eec commit 1be3608
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
33 changes: 33 additions & 0 deletions gofin.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,39 @@ func HoldingPeriodReturnPercentage(initialValue, finalValue float64) float64 {
return ((finalValue - initialValue) / initialValue)*100
}

// AverageReturn calculates the average return over multiple holding periods
func AverageReturn(holdingPeriodReturns []float64) float64 {
totalReturns := 0.0
numReturns := len(holdingPeriodReturns)

if numReturns == 0 {
return 0.0 // Avoid division by zero
}

for _, hpr := range holdingPeriodReturns {
totalReturns += hpr
}

return totalReturns / float64(numReturns)
}

// AverageReturnAnnualized calculates the average annualized return over multiple holding periods
func AverageReturnAnnualized(initialValues, finalValues []float64, holdingPeriods []float64) float64 {
totalAnnualizedReturns := 0.0
numReturns := len(initialValues)

if numReturns == 0 {
return 0.0 // Avoid division by zero
}

for i := 0; i < numReturns; i++ {
annualizedReturn := HoldingPeriodReturnAnnualized(initialValues[i], finalValues[i], holdingPeriods[i])
totalAnnualizedReturns += annualizedReturn
}

return totalAnnualizedReturns / float64(numReturns)
}

// HoldingPeriodReturnAnnualized calculates the annualized holding period return (HPR)
func HoldingPeriodReturnAnnualized(initialValue, finalValue float64, holdingPeriodInYears float64) float64 {
hpr := HoldingPeriodReturn(initialValue, finalValue)
Expand Down
27 changes: 27 additions & 0 deletions gofin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,33 @@ func TestHoldingPeriodReturnAnnualized(t *testing.T) {
}
}

//test AverageReturnAnnualized
func TestAverageReturnAnnualized(t *testing.T) {
var initialValues []float64 = []float64{1000.0, 1000.0}
var finalValues []float64 = []float64{1200.0, 1200.0}
var holdingPeriods []float64 = []float64{2.0, 2.0}
var expected float64 = 0.10

actual := AverageReturnAnnualized(initialValues, finalValues, holdingPeriods)

if compareFloat64(actual, expected) {
t.Errorf("Test failed, expected: '%f', got: '%f'", expected, actual)
}

}

func TestAverageReturn(t *testing.T) {
var holdingPeriodReturns []float64 = []float64{0.10, 0.20}
var expected float64 = 0.15

actual := AverageReturn(holdingPeriodReturns)

if compareFloat64(actual, expected) {
t.Errorf("Test failed, expected: '%f', got: '%f'", expected, actual)
}

}

func TestHoldingPeriodReturnAnnualizePercentage(t *testing.T) {
var initialValue float64 = 1000.0
var finalValue float64 = 1200.0
Expand Down

0 comments on commit 1be3608

Please sign in to comment.