predictor for interest is k

This commit is contained in:
bel
2023-10-26 18:38:48 -06:00
parent 23614057a3
commit 0c50ee5a89
2 changed files with 11 additions and 10 deletions

View File

@@ -20,6 +20,8 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6
result[k] = maps.Clone(v) 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 { for name := range result {
if !nameMatcher.MatchString(name) { if !nameMatcher.MatchString(name) {
continue continue
@@ -28,8 +30,7 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6
if !currencyMatcher.MatchString(string(currency)) { if !currencyMatcher.MatchString(string(currency)) {
continue continue
} }
percentOfYearPassed := float64(delta) / float64(time.Hour*365) result[name][currency] *= scalar
result[name][currency] *= math.Pow(1.0+apy/12.0, percentOfYearPassed)
} }
} }
return result return result

View File

@@ -8,7 +8,7 @@ import (
) )
func TestNewInterestPredictor(t *testing.T) { func TestNewInterestPredictor(t *testing.T) {
name := "x" acc := "x"
curr := ledger.USD curr := ledger.USD
cases := map[string]struct { cases := map[string]struct {
apy float64 apy float64
@@ -18,22 +18,22 @@ func TestNewInterestPredictor(t *testing.T) {
}{ }{
"zero": { "zero": {
apy: 0, apy: 0,
given: ledger.Balances{name: ledger.Balance{curr: 100}}, given: ledger.Balances{acc: ledger.Balance{curr: 100}},
delta: time.Hour * 24 * 365, delta: time.Hour * 24 * 365,
want: ledger.Balances{name: ledger.Balance{curr: 100}}, want: ledger.Balances{acc: ledger.Balance{curr: 100}},
}, },
"100%": { "50%": {
apy: 1, apy: .5,
given: ledger.Balances{name: ledger.Balance{curr: 100}}, given: ledger.Balances{acc: ledger.Balance{curr: 100}},
delta: time.Hour * 24 * 365, 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 { for name, d := range cases {
c := d c := d
t.Run(name, func(t *testing.T) { 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) got := predictor(c.given, c.delta)
if got.Debug() != c.want.Debug() { if got.Debug() != c.want.Debug() {
t.Errorf("want\n\t%+v, got\n\t%+v", c.want, got) t.Errorf("want\n\t%+v, got\n\t%+v", c.want, got)