You can solve it using a fairly simple JOIN;
SELECT DATE(a.created_at) date, a.debit, a.credit,
SUM(b.credit - b.debit) balance
FROM transactions a
LEFT JOIN transactions b
ON DATE(a.created_at) >= DATE(b.created_at)
GROUP BY DATE(created_at)
ORDER BY DATE(created_at) DESC
The problem here is that the JOIN condition and the GROUP BY condition use a value calculated on a field instead of using the field itself. This will limit the use of indexes and make the query really slow for large amounts of data.
A solution would be to add a separate DATE field which holds the date of the transaction. This will allow the JOIN/GROUP BY to work directly on a field and it can use indexing much more efficiently.