我正在直接在 golang 中开发一个技术指标库。除其他外,它是学习 golang 的练习。
我一直在通过使用 TA-Lib(或者更确切地说是围绕 TA-Lib 的 ruby 包装器)生成的数据构建测试用例来验证我的算法的结果。
在我开始实施布林带之前,这一直运行良好。我的实现似乎工作正常,但在小数点后 14-15 位有所不同。
我已经阅读了不同编程语言中的 Floating point math并怀疑这可能是罪魁祸首(我以稍微不同的顺序进行计算)。
编辑添加:
上面的问题涉及浮点数学的一个非常简单的表现形式。确认一段较长的代码实际上解决了这个问题要困难得多。
由于顺序,我如何确认它只是浮点数学的变化?
/ 结束编辑
我的理解正确吗?
这是我的实现:
package ta
import (
"math"
)
func BollingerBands(values []float64, period int) ([]float64, []float64, []float64) {
deviationsUp := 2.0
deviationsDown := 2.0
middleBand := Sma(values, period)
offset := len(values)-len(middleBand)
var upperBand []float64
var lowerBand []float64
for idx, v := range middleBand {
backIdx := offset+idx-period+1
curIdx := offset+idx+1
if backIdx < 0 {
backIdx = 0
}
stdDev := SliceStdDev(values[backIdx:curIdx])
upperBand = append(upperBand, v + (stdDev * deviationsUp))
lowerBand = append(lowerBand, v - (stdDev * deviationsDown))
}
return upperBand, middleBand, lowerBand
}
// Sma produces the Simple Moving Average for the
// supplied array of float64 values for a given period
func Sma(values []float64, period int) []float64{
var result []float64
for index,_ := range values {
indexPlusOne := index+1
if(indexPlusOne>=period) {
avg := Mean(values[indexPlusOne-period:indexPlusOne])
result = append(result, avg)
}
}
return result
}
// SliceMean returns the Mean of the slice of float64
func SliceMean(values []float64) float64 {
var total float64=0
for _,element := range values {
total += element
}
return total / float64(len(values))
}
// SliceVariance returns the variance of the slice of float64.
func SliceVariance(values []float64) float64 {
if 0 == len(values) {
return 0.0
}
m := SliceMean(values)
var sum float64
for _, v := range values {
d := v - m
sum += d * d
}
return sum / float64(len(values))
}
jeck猫
临摹微笑
相关分类