Skip to content

Commit 0a0dd89

Browse files
committed
indicator: Kalman & GH filters: compare estimation accurateness
1 parent 4338784 commit 0a0dd89

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

pkg/indicator/ghfilter_test.go

+16-11
Original file line numberDiff line numberDiff line change
@@ -6067,7 +6067,7 @@ func Test_GHFilter(t *testing.T) {
60676067
}
60686068
}
60696069

6070-
func Test_GHFilterAccurate(t *testing.T) {
6070+
func Test_GHFilterEstimationAccurate(t *testing.T) {
60716071
type args struct {
60726072
allKLines []types.KLine
60736073
priceF KLineValueMapper
@@ -6122,22 +6122,27 @@ func Test_GHFilterAccurate(t *testing.T) {
61226122

61236123
var filterDiff2Sum, ewmaDiff2Sum float64
61246124
var filterCloseDiff2Sum, ewmaCloseDiff2Sum float64
6125-
for _, k := range klines {
6125+
for i, k := range klines {
6126+
// square error between last estimated state and current actual state
6127+
if i > 0 {
6128+
filterDiff2Sum += klineSquareError(filter.Last(), k)
6129+
ewmaDiff2Sum += klineSquareError(ewma.Last(), k)
6130+
filterCloseDiff2Sum += closeSquareError(filter.Last(), k)
6131+
ewmaCloseDiff2Sum += closeSquareError(ewma.Last(), k)
6132+
}
6133+
6134+
// update estimations
61266135
filter.PushK(k)
61276136
ewma.PushK(k)
6128-
6129-
filterDiff2Sum += klineSquareError(filter.Last(), k)
6130-
ewmaDiff2Sum += klineSquareError(ewma.Last(), k)
6131-
filterCloseDiff2Sum += closeSquareError(filter.Last(), k)
6132-
ewmaCloseDiff2Sum += closeSquareError(ewma.Last(), k)
61336137
}
6134-
filterSquareErr := math.Sqrt(filterDiff2Sum / float64(len(klines)*4))
6135-
ewmaSquareErr := math.Sqrt(ewmaDiff2Sum / float64(len(klines)*4))
6138+
numEstimations := len(klines) - 1
6139+
filterSquareErr := math.Sqrt(filterDiff2Sum / float64(numEstimations*4))
6140+
ewmaSquareErr := math.Sqrt(ewmaDiff2Sum / float64(numEstimations*4))
61366141
if filterSquareErr > ewmaSquareErr {
61376142
t.Errorf("filter K-Line square error %f > EWMA K-Line square error %v", filterSquareErr, ewmaSquareErr)
61386143
}
6139-
filterCloseSquareErr := math.Sqrt(filterCloseDiff2Sum / float64(len(klines)))
6140-
ewmaCloseSquareErr := math.Sqrt(ewmaCloseDiff2Sum / float64(len(klines)))
6144+
filterCloseSquareErr := math.Sqrt(filterCloseDiff2Sum / float64(numEstimations))
6145+
ewmaCloseSquareErr := math.Sqrt(ewmaCloseDiff2Sum / float64(numEstimations))
61416146
if filterCloseSquareErr > ewmaCloseSquareErr {
61426147
t.Errorf("filter close price square error %f > EWMA close price square error %v", filterCloseSquareErr, ewmaCloseSquareErr)
61436148
}

pkg/indicator/kalmanfilter_test.go

+16-11
Original file line numberDiff line numberDiff line change
@@ -6067,7 +6067,7 @@ func Test_KalmanFilter(t *testing.T) {
60676067
}
60686068
}
60696069

6070-
func Test_KalmanFilterAccurate(t *testing.T) {
6070+
func Test_KalmanFilterEstimationAccurate(t *testing.T) {
60716071
type args struct {
60726072
allKLines []types.KLine
60736073
window int
@@ -6121,22 +6121,27 @@ func Test_KalmanFilterAccurate(t *testing.T) {
61216121

61226122
var filterDiff2Sum, ewmaDiff2Sum float64
61236123
var filterCloseDiff2Sum, ewmaCloseDiff2Sum float64
6124-
for _, k := range klines {
6124+
for i, k := range klines {
6125+
// square error between last estimated state and current actual state
6126+
if i > 0 {
6127+
filterDiff2Sum += klineSquareError(filter.Last(), k)
6128+
ewmaDiff2Sum += klineSquareError(ewma.Last(), k)
6129+
filterCloseDiff2Sum += closeSquareError(filter.Last(), k)
6130+
ewmaCloseDiff2Sum += closeSquareError(ewma.Last(), k)
6131+
}
6132+
6133+
// update estimations
61256134
filter.PushK(k)
61266135
ewma.PushK(k)
6127-
6128-
filterDiff2Sum += klineSquareError(filter.Last(), k)
6129-
ewmaDiff2Sum += klineSquareError(ewma.Last(), k)
6130-
filterCloseDiff2Sum += closeSquareError(filter.Last(), k)
6131-
ewmaCloseDiff2Sum += closeSquareError(ewma.Last(), k)
61326136
}
6133-
filterSquareErr := math.Sqrt(filterDiff2Sum / float64(len(klines)*4))
6134-
ewmaSquareErr := math.Sqrt(ewmaDiff2Sum / float64(len(klines)*4))
6137+
numEstimations := len(klines) - 1
6138+
filterSquareErr := math.Sqrt(filterDiff2Sum / float64(numEstimations*4))
6139+
ewmaSquareErr := math.Sqrt(ewmaDiff2Sum / float64(numEstimations*4))
61356140
if filterSquareErr > ewmaSquareErr {
61366141
t.Errorf("filter K-Line square error %f > EWMA K-Line square error %v", filterSquareErr, ewmaSquareErr)
61376142
}
6138-
filterCloseSquareErr := math.Sqrt(filterCloseDiff2Sum / float64(len(klines)))
6139-
ewmaCloseSquareErr := math.Sqrt(ewmaCloseDiff2Sum / float64(len(klines)))
6143+
filterCloseSquareErr := math.Sqrt(filterCloseDiff2Sum / float64(numEstimations))
6144+
ewmaCloseSquareErr := math.Sqrt(ewmaCloseDiff2Sum / float64(numEstimations))
61406145
if filterCloseSquareErr > ewmaCloseSquareErr {
61416146
t.Errorf("filter close price square error %f > EWMA close price square error %v", filterCloseSquareErr, ewmaCloseSquareErr)
61426147
}

0 commit comments

Comments
 (0)