49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package types
|
|
|
|
import (
|
|
"math"
|
|
)
|
|
|
|
// Sharpe: Calcluates the sharpe ratio of access returns
|
|
//
|
|
// @param returns (Series): Series of profit/loss percentage every specific interval
|
|
// @param periods (int): Freq. of returns (252/365 for daily, 12 for monthy, 1 for annually)
|
|
// @param annualize (bool): return annualize sharpe?
|
|
// @param smart (bool): return smart sharpe ratio
|
|
func Sharpe(returns Series, periods int, annualize bool, smart bool) float64 {
|
|
data := returns
|
|
var divisor = Stdev(data, data.Length(), 1)
|
|
if smart {
|
|
divisor *= autocorrPenalty(returns)
|
|
}
|
|
if divisor == 0 {
|
|
mean := Mean(data)
|
|
if mean > 0 {
|
|
return math.Inf(1)
|
|
} else if mean < 0 {
|
|
return math.Inf(-1)
|
|
} else {
|
|
return 0
|
|
}
|
|
}
|
|
result := Mean(data) / divisor
|
|
if annualize {
|
|
return result * math.Sqrt(float64(periods))
|
|
}
|
|
return result
|
|
}
|
|
|
|
func avgReturnRate(returnRate float64, periods int) float64 {
|
|
return math.Pow(1.+returnRate, 1./float64(periods)) - 1.
|
|
}
|
|
|
|
func autocorrPenalty(data Series) float64 {
|
|
num := data.Length()
|
|
coef := math.Abs(Correlation(data, Shift(data, 1), num-1))
|
|
var sum = 0.
|
|
for i := 1; i < num; i++ {
|
|
sum += float64(num-i) / float64(num) * math.Pow(coef, float64(i))
|
|
}
|
|
return math.Sqrt(1. + 2.*sum)
|
|
}
|