fix(analytics): TWR не цепляет остаток после полного вывода из портфеля
День, выводящий всё, кроме 1 % стоимости (EMPTIED_SHARE), не участвует в цепочке: остаток в пару рублей превращал комиссию или округление в −60 % за день, и несколько таких опустошений обнуляли всю историю.
This commit is contained in:
@@ -131,3 +131,26 @@ def test_a_large_but_plausible_rate_is_kept():
|
||||
rate = xirr([day(0), day(30)], [D("-1000"), D("1100")])
|
||||
assert rate is not None
|
||||
assert D("2.0") < rate < D("2.3")
|
||||
|
||||
|
||||
def test_emptying_the_portfolio_does_not_chain_the_residue():
|
||||
"""1 302 ₽ out of 1 302 ₽ minus a 3 ₽ residue that then loses 3 ₽ is not a -94 % day."""
|
||||
points = [
|
||||
Point(d=day(1), value=D("1302.27"), flow=D(0)),
|
||||
Point(d=day(2), value=D("0.20"), flow=D("-1299.00")),
|
||||
Point(d=day(3), value=D("5000.20"), flow=D("5000")),
|
||||
Point(d=day(4), value=D("5500.22"), flow=D(0)),
|
||||
]
|
||||
chain = twr(points, opening_value=D("1300"))
|
||||
# day 1: +0.17 %; day 2 is a residue, not chained; day 3: flat; day 4: +10 %
|
||||
assert chain.days_skipped == 0
|
||||
assert chain.days_used == 3
|
||||
assert chain.value is not None
|
||||
assert D("0.1019") < chain.value < D("0.1020")
|
||||
|
||||
|
||||
def test_a_partial_withdrawal_is_still_chained():
|
||||
points = [Point(d=day(1), value=D(55), flow=D(-50))]
|
||||
chain = twr(points, opening_value=D(100))
|
||||
assert chain.days_used == 1
|
||||
assert chain.value == D("0.100000")
|
||||
|
||||
Reference in New Issue
Block a user