@@ -6067,7 +6067,7 @@ func Test_KalmanFilter(t *testing.T) {
6067
6067
}
6068
6068
}
6069
6069
6070
- func Test_KalmanFilterAccurate (t * testing.T ) {
6070
+ func Test_KalmanFilterEstimationAccurate (t * testing.T ) {
6071
6071
type args struct {
6072
6072
allKLines []types.KLine
6073
6073
window int
@@ -6121,22 +6121,27 @@ func Test_KalmanFilterAccurate(t *testing.T) {
6121
6121
6122
6122
var filterDiff2Sum , ewmaDiff2Sum float64
6123
6123
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
6125
6134
filter .PushK (k )
6126
6135
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 )
6132
6136
}
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 ))
6135
6140
if filterSquareErr > ewmaSquareErr {
6136
6141
t .Errorf ("filter K-Line square error %f > EWMA K-Line square error %v" , filterSquareErr , ewmaSquareErr )
6137
6142
}
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 ))
6140
6145
if filterCloseSquareErr > ewmaCloseSquareErr {
6141
6146
t .Errorf ("filter close price square error %f > EWMA close price square error %v" , filterCloseSquareErr , ewmaCloseSquareErr )
6142
6147
}
0 commit comments