mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-26 08:45:16 +00:00
feature: add skew, covariance and variance
This commit is contained in:
parent
1e31c4fb04
commit
d8d77cec1e
|
@ -733,4 +733,51 @@ func Correlation(a Series, b Series, length int, method ...CorrFunc) float64 {
|
||||||
return runner(a, b, length)
|
return runner(a, b, length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// similar to pandas.Series.cov() function with ddof=0
|
||||||
|
//
|
||||||
|
// Compute covariance with Series
|
||||||
|
func Covariance(a Series, b Series, length int) float64 {
|
||||||
|
if a.Length() < length {
|
||||||
|
length = a.Length()
|
||||||
|
}
|
||||||
|
if b.Length() < length {
|
||||||
|
length = b.Length()
|
||||||
|
}
|
||||||
|
|
||||||
|
meana := Mean(a, length)
|
||||||
|
meanb := Mean(b, length)
|
||||||
|
sum := 0.0
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
sum += (a.Index(i) - meana) * (b.Index(i) - meanb)
|
||||||
|
}
|
||||||
|
sum /= float64(length)
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Variance(a Series, length int) float64 {
|
||||||
|
return Covariance(a, a, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
// similar to pandas.Series.skew() function.
|
||||||
|
//
|
||||||
|
// Return unbiased skew over input series
|
||||||
|
func Skew(a Series, length int) float64 {
|
||||||
|
if length > a.Length() {
|
||||||
|
length = a.Length()
|
||||||
|
}
|
||||||
|
mean := Mean(a, length)
|
||||||
|
sum2 := 0.0
|
||||||
|
sum3 := 0.0
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
diff := a.Index(i) - mean
|
||||||
|
sum2 += diff * diff
|
||||||
|
sum3 += diff * diff * diff
|
||||||
|
}
|
||||||
|
if length <= 2 || sum2 == 0 {
|
||||||
|
return math.NaN()
|
||||||
|
}
|
||||||
|
l := float64(length)
|
||||||
|
return l * math.Sqrt(l-1) / (l - 2) * sum3 / math.Pow(sum2, 1.5)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: ta.linreg
|
// TODO: ta.linreg
|
||||||
|
|
|
@ -56,3 +56,31 @@ func TestCorr(t *testing.T) {
|
||||||
corr = Correlation(&a, &b, 4, Spearman)
|
corr = Correlation(&a, &b, 4, Spearman)
|
||||||
assert.InDelta(t, corr, -0.94868, 0.001)
|
assert.InDelta(t, corr, -0.94868, 0.001)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
python
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
s1 = pd.Series([.2, 0., .6, .2, .2])
|
||||||
|
s2 = pd.Series([.3, .6, .0, .1])
|
||||||
|
print(s1.cov(s2, ddof=0))
|
||||||
|
*/
|
||||||
|
func TestCov(t *testing.T) {
|
||||||
|
var a = Float64Slice{.2, .0, .6, .2}
|
||||||
|
var b = Float64Slice{.3, .6, .0, .1}
|
||||||
|
cov := Covariance(&a, &b, 4)
|
||||||
|
assert.InDelta(t, cov, -0.042499, 0.001)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
python
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
s1 = pd.Series([.2, 0., .6, .2, .2])
|
||||||
|
print(s1.skew())
|
||||||
|
*/
|
||||||
|
func TestSkew(t *testing.T) {
|
||||||
|
var a = Float64Slice{.2, .0, .6, .2}
|
||||||
|
sk := Skew(&a, 4)
|
||||||
|
assert.InDelta(t, sk, 1.129338, 0.001)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user