diff --git a/ana/predictor.go b/ana/predictor.go index 3c81f99..5f66e71 100644 --- a/ana/predictor.go +++ b/ana/predictor.go @@ -20,6 +20,8 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6 result[k] = maps.Clone(v) } + monthsPassed := float64(delta) / float64(time.Hour*24.0*365.0/12.0) + scalar := math.Pow(1.0+apy/12.0, monthsPassed) for name := range result { if !nameMatcher.MatchString(name) { continue @@ -28,8 +30,7 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6 if !currencyMatcher.MatchString(string(currency)) { continue } - percentOfYearPassed := float64(delta) / float64(time.Hour*365) - result[name][currency] *= math.Pow(1.0+apy/12.0, percentOfYearPassed) + result[name][currency] *= scalar } } return result diff --git a/ana/predictor_test.go b/ana/predictor_test.go index 2769735..37d51a0 100644 --- a/ana/predictor_test.go +++ b/ana/predictor_test.go @@ -8,7 +8,7 @@ import ( ) func TestNewInterestPredictor(t *testing.T) { - name := "x" + acc := "x" curr := ledger.USD cases := map[string]struct { apy float64 @@ -18,22 +18,22 @@ func TestNewInterestPredictor(t *testing.T) { }{ "zero": { apy: 0, - given: ledger.Balances{name: ledger.Balance{curr: 100}}, + given: ledger.Balances{acc: ledger.Balance{curr: 100}}, delta: time.Hour * 24 * 365, - want: ledger.Balances{name: ledger.Balance{curr: 100}}, + want: ledger.Balances{acc: ledger.Balance{curr: 100}}, }, - "100%": { - apy: 1, - given: ledger.Balances{name: ledger.Balance{curr: 100}}, + "50%": { + apy: .5, + given: ledger.Balances{acc: ledger.Balance{curr: 100}}, delta: time.Hour * 24 * 365, - want: ledger.Balances{name: ledger.Balance{curr: 200}}, + want: ledger.Balances{acc: ledger.Balance{curr: 163.21}}, }, } for name, d := range cases { c := d t.Run(name, func(t *testing.T) { - predictor := NewInterestPredictor(name, string(curr), c.apy) + predictor := NewInterestPredictor(acc, string(curr), c.apy) got := predictor(c.given, c.delta) if got.Debug() != c.want.Debug() { t.Errorf("want\n\t%+v, got\n\t%+v", c.want, got)