В мире финансового планирования и моделирования всё большую популярность приобретают сложные инструменты, позволяющие более точно и детально прогнозировать свое финансовое будущее. Однако зачастую готовые решения не удовлетворяют требованиям пользователей из-за ограничений интерфейса или неподходящего учета индивидуальных нюансов. Меня заинтересовала идея создания собственного финансового движка Fingine, способного обеспечить гибкость и масштабируемость моделирования, ориентированного на реальные жизненные сценарии. Одна из личных целей, которая вдохновила на разработку такого инструмента, заключается в возможности выйти на пенсию в относительно молодом возрасте – около 55 лет. В процессе работы хотелось бы не зависеть от дохода, выбирать занятия по душе, не ограничиваясь финансовой выгодой.
Важным элементом на этом пути становится способность точно отслеживать состояние активов, уровень накоплений и коэффициент сбережений. Поиск и использование подходящих калькуляторов, таких как coast FIRE или ProjectionLab, помогали приблизиться к этой цели. Тем не менее, у этих продуктов были ограничения – интерфейс визуального типа (GUI) зачастую неудобен и непрозрачен, сложно выразить все нюансы ситуации через подобный формат. Отсюда родилась задумка Fingine – финансового движка, который позволял бы описывать сценарии на языке программирования, что открывало бы огромные возможности для кастомизации и расширения. Концепция Fingine предполагала стать своего рода аналогом игровых движков Unity или Unreal, только для финансового моделирования.
Такой инструмент должен был автоматически учитывать множество мелких деталей: различные счета, налоговые механизмы, события доходов и расходов, рост и снижение стоимости активов и многое другое. В основе идеи лежало объединение всех финансовых параметров в единую среду. Однако в реализации проекта столкнулись с рядом серьезных сложностей. Во-первых, осознание недостаточного уровня знаний в финансовой сфере затрудняло грамотное описание всех процессов и правил, что привело к необходимости углубленного изучения темы. Во-вторых, выбор языка разработки – Rust – оказался неудачным решением.
Его высокая сложность и недостаточная практика с ним у меня замедляли прогресс и вызывали разочарование. В итоге, сам процесс разработки стали затруднительным, и проект пришлось приостановить, хотя и полученный опыт не был напрасным. Обучение Rust и расширение финансовых знаний стали значимыми достижениями. Спустя время возникло желание вернуться к проекту, осознав ошибки и поставив более реалистичные цели. Анализ причин неудачи показал, что успешная работа над сторонним проектом требует соблюдения определенных правил.
Важно сотрудничество с людьми, чье мнение вызывает уважение – это повышает ответственность и дисциплину. Также необходим четкий и ограниченный объем работы, чтобы за разумный промежуток времени можно было продемонстрировать результат. Нельзя недооценивать важность хорошего знания инструментов разработки и избегания чрезмерных экспериментов с новыми технологиями. Последнее, но не менее значимое, это постановка ясных и измеримых целей. К сожалению, первый пункт своеобразного списка оказался недостижимым, но остальные можно эффективно использовать при подготовке к повторному запуску Fingine.
В обновленной концепции движка основной акцент был сделан на локальной специфике: моделирование финансовых сценариев для жителей Канады. Это позволило не распылять усилия на изучение и реализацию нюансов других систем. Вместо глубокой автоматической калькуляции налоговых льгот и вычетов пользователям предоставляется возможность писать собственный код, чтобы описывать особенности своей ситуации. Такой подход распространяется не только на налоги, но и на доходы, расходы, рост стоимости активов и другие финансовые элементарные процессы. Кроме того, планируется отказаться от идеи создания высокопроизводительного движка с возможностью скриптов, в пользу разработки специализированного языка, который сможет быть реализован на платформе с поддержкой метапрограммирования.
Это позволит сосредоточиться на бизнес-логике и упростит расширение функционала. Помимо этого, важной задачей стало добавление поддержки методов Монте-Карло, что существенно расширит возможности для анализа рисков и неопределенностей при планировании. Среди принципов, которыми будет руководствоваться Fingine, – отказ от попыток покрыть все возможные случаи финансовой жизни. Решено сфокусироваться на личных потребностях и отказаться от ориентации на массовое использование. Это означает, что производительность перестает быть приоритетом, важнее просто работающий инструмент, четко соответствующий собственным задачам.
При проектировании архитектуры Fingine появилось интересное представление о том, как формализовать финансовые операции. В основе лежит идея описать счета и активы с использованием матриц, где каждый элемент отражает либо сумму на счете, либо стоимость актива. Все события, происходящие в системе – поступления дохода, изменения стоимости активов или обязательств, расходы, переводы между счетами – можно представить как матричные трансформации и преобразования. Такой взгляд позволяет интуитивно и компактно работать с огромным объемом данных, проводить сложные вычисления и симуляции. Язык Elixir и его библиотека Nx для работы с числовыми массивами подходит для реализации подобного подхода.
Например, представим два счета: банковский, где лежит 2000 долларов, и пенсионный, где инвестировано 10000 долларов в индексные фонды. Их можно записать как матрицу или вектор [2000, 10000]. Событие дохода в размере 5000, от которого после налогов остается 3500, тоже записывается в виде вектора [3500, 0], с которым происходит сложение. В итоге обновленное состояние будет складываться как исходный вектор плюс вектор дохода. Данная формализация открывает перспективы более глубокой интеграции бухгалтерских принципов, в частности двойной записи, что позволит избежать ошибок и повысить качество моделирования.
Для этого планируется изучить опыт и инструментарий проекта hledger, который реализует именно эти методы. Наряду с техническими нюансами, значительным для меня остается и образовательный аспект. Переквалификация и освоение нового языка программирования, Elixir, разновидности функционального языка с возможностями распределенного выполнения, станет одновременно подготовкой к выполнению задачи Fingine и расширением компетенций в области распределенных систем. В планах – изучение ключевой литературы, таких как "Elixir in Action" и прохождение практических упражнений на платформе Exercism, а также собственных экспериментов с многопоточным и распределенным выполнением посредством проекта Gossip Glomers. Возвращаясь к теме побочных проектов, хочу отметить важность правильной постановки для достижения успеха.
Большая идея не всегда приводит к успешной реализации, особенно если свои силы и знания завышены. Скромные, отлаженные задачи, выполнение которых приводит к осязаемому результату, способны поддерживать мотивацию лучше и открывать дорогу к улучшениям. Моделирование личных финансов с помощью гибких инструментов, которые подстраиваются под реальную ситуацию и позволяют пользователю самостоятельно управлять уровнем детализации, становится все более востребованным. Fingine отражает желание управлять своим будущим осознанно, используя современные технологии и сохраняя контроль над процессом. Такой подход сможет вдохновить других энтузиастов создавать свои уникальные решения, не боясь ошибок и готовясь к постепенному освоению новых навыков.