It's tricky to get that right, though, so most developers would be much better off picking a database that does it for them.
The balance would then be calculated as the sum of transactions, and you could modify the query to view a balance in the past by only including transactions before a certain point in time.
A reversal or correction would be an append action, not a modification to existing data. Thus giving you an accurate history of the data.
This is a simple entry point, as bitemporal modelling usually affects the entire datastore and also has to handle potentially massive data and so requires ideas of how to archive old data, and provide performant ways of knowing the current state. There are lots of tricks here, and the sum of those tricks is how bitemporal modelling is achieved.