Недавно мне на глаза попалась статья про одну из систем финансового учёта. Помимо всего прочего, она позволяла контролировать остатки на расчётном счёте, предупреждая об опасности возникновения кассовых разрывов. Там были вот такие графики:



Что с ними не так, и можно ли сделать лучше — читайте под катом.

Идея соединять точки плавными сплайнами (и даже линиями) на графиках с деньгами в принципе неправильная: ведь в реальности деньги приходят и уходят на счёт дискретно, конкретными платежами с конкретными суммами. А попытка провести через точки гладкую кривую может вообще сыграть с нами дурную шутку вроде такой:



И второго, и третьего августа у нас на счету были деньги, при этом сглаженная кривая показывает, что мы ушли в минус, вводя нас в заблуждение. Но даже если соединять точки прямыми линиями, будет казаться, что между первым и вторым августа на счету было около 450 тыс. рублей, что тоже не соответствует действительности. Как же сделать правильно?

Несколько лет назад мне довелось разработать финансовую систему для одного из заказчиков, для которой потребовалось придумать и реализовать похожие по смыслу графики. Ниже я хотел бы рассказать про свой способ решения этой задачки.

Источником данных о состоянии расчётного счёта является банковская выписка: список операций, совершенных за определённый период времени. Каждая такая операция — это либо приход денег на счёт (оплата от клиента, проценты по банковскому депозиту и т.п.), либо расход (оплата за товары и услуги, выплата зарплаты и т.п.) При этом время совершения операции обычно не имеет значения (а зачастую мы его и не знаем, ведь платёж может быть обработан банком не сразу), важна только дата.

Получается, что мы не видим движения денег внутри дня. Зато мы знаем остаток денег на счёте в начале дня, общую сумму приходов, сумму расходов и, как следствие, остаток на конец дня. Хочется отображать эти данные в виде понятного и информативного графика.

Идею для него я подсмотрел у биржевых игроков: уже более 250 лет для отображения изменений биржевых котировок они используют т.н. «японские свечи». Выглядят они так:


Верхняя и нижняя грани тела «свечки» показывают значение котировки на открытии или закрытии периода, который в общем случае может быть любым: от нескольких минут до нескольких лет. Если за выбранный период котировки выросли (т.е. верхняя грань соответствует закрытию), тело свечи закрашивают одним цветом, если упали — другим. Также у биржевых свечей есть «усы», соответствующие минимальному и максимальному значению котировки за данный период.

Вы уже наверняка уловили аналогию между поведением биржевых котировок и нашими деньгами на расчётном счёте. У нас тоже есть остаток на начало дня (открытие) и на конец дня (закрытие). Поскольку мы не видим точной последовательности исполнения операций внутри дня, мы не будем рисовать усы (минимальный и максимальный остаток внутри дня). В результате получится график, который показывает не просто изменение остатка по счёту на конец дня, но и преобладающее направление денег в этот день (приход или расход — от этого будет зависеть цвет свечки), а также размер этого прихода или расхода.

Вот что в результате получилось (картинка кликабельна):



Сверху — японские свечи, показывающие изменение остатка на счёте, снизу — суммарные приход и расход за день в виде стандартной столбчатой диаграммы.

Здесь для примера показаны несколько плановых (именно поэтому суммы в легенде взяты в скобки) платежей для молодого стартапа: 1 сентября учредители внесли на счёт уставный капитал в размере 10 тыс. рублей, а ещё через 4 дня получили 1 млн от первого клиента. Каждый месяц стартап должен перечислить сотрудникам зарплату в размере 300 тыс. (15-го числа), а также заплатить 100 тыс. за аренду офиса (в конце месяца). Видно, что без дополнительного финансирования компания просуществует только два месяца: уже в ноябре денег для выплаты зарплаты не хватит.

А вот пример данных, смоделированных на базе движений по счетам реальной компании (картинка кликабельна):



Слева от флажка, обозначающего сегодняшнее число, находятся фактические значения, бледные графики справа — запланированные значения.

Несмотря на то, что величина остатка на обоих счетах колеблется в диапазоне от нескольких сотен тысяч до нескольких млн, суммы дневных платежей на гистограммах однозначно показывают, что верхний счёт является для компании основным. Чётко видна периодичность платежей, это — следствие того, что в компании введён т.н. платёжный день. Также можно заметить, что деньги на счёте на задерживаются — возможно, их размещают на краткосрочных депозитах. В реальной системе это легко проверить: при клике на конкретном дне открывается окошко со списком платёжек.

Вот так, благодаря идее, подсмотренной у биржевых игроков, получился очень наглядный и информативный инструмент для контроля за остатками на расчётных счетах. Надеюсь, что кто-нибудь ещё найдет эту аналогию полезной и применит её в своих продуктах.