Пусть у вас есть вложения активов в некую стратегию (даже если buy and hold), и вы хотите рассчитать (return on investment).  Если вы не производили никаких выводов или депозитов, тогда легко рассчитать прибыль по  формуле:  где - текущая стоимость наших активов, а - исходная стоимость активов.   Однако если в период инвестиций вы делали операции по счету, то их, конечно, нужно учитывать, и тогда простой формулы здесь недостаточно. Одним из способов расчета доходности на ивестиции является расчет перефоманса цены акции "виртуального" паевого фонда (ПИФ). Думаю, что он многим знаком, а если нет, то покажется тоже интуитивным и простым после последующего описания и примеров (надеюсь).   При первом депозите надо создать "виртуальный" паевой фонд, начальное количество акций (паёв) в котором равно депонированным активам (в акциях) с ценой за акцию  Любой депозит или вывод средств в момент времени  эквивалентен покупке или продаже акций по цене . Далее меняем состояние ПИФа при изменении счета по следующему алгоритму: Пустьактивов было добавлено к фонду в момент времени , где при депозите и при выводе. В  ПИФ состоял из  акций с ценой  После выполнения транзакции, в момент времени новое количество акций составит  а  цена акции останется той же:  Таким образом, для каждого момента времени имеем: стоимость активов  количество виртуальных акций  цену одной акции   В итоге, можно рассчитать доходность от начального момента времени по формуле:   Более того, также можно легко рассчитать  по этой формуле на любой период времени , в чем и заключается суть данного метода.  Допустим мы положили 100$ в стратегию. Сразу отметим, что в этот момент времени "покупаем" 100 акций за 1$. Далее стратегия за какое-то время заработала 20% и наш баланс теперь стал 120$, а следовательно изменилась и цена акции, она стала 120$ / 100 = 1.2$ (количество акций не изменилось, потому что никаких новых вложений или выводов не было). Пусть в этот же момент времени мы решили положить ещё 210$, чтобы увеличить абсолютный доход. Депозит эквивалентен увелечению акций на 210$ / 1.2$ = 175. Таким образом, цена акции осталась (120 + 210)$ / (100 + 175) = 1.2$, а стоимость активов изменилась. Спустя время стратегия заработала ещё 10% от нового баланса, то есть стоимость активов стала равна 363$, следовательно стоимость акции стала равна 363$ / 275 = 1,32$. Посчитаем доходность с начального момента до момента депозита: (1.2 / 1 - 1) * 100 = 20%Посчитаем доходность от момента депозита: (1.32 / 1.2 - 1) * 100 = 10%Посчитаем общую доходность на ивестиции: (1.32 / 1 - 1) * 100 = 32% Здесь мы будем манипулировать тремя простыми сущностями.  транзакция (Transaction) ивестор (Investor) ПИФ (ROICalculator) Транзакция является структурой с двумя полями, где funding - это вывод или депозит с соответсвующим знаком (X из формул)   Далее, модель инвестора - самая важная в рамках использования. Для расчетов нам важно иметь: начальный депозит дату первых инвестиций список транзакций  Cамое главное - переопределить метод доступа к балансу по временной метке. Best practice здесь запрос к БД или pandas.DataFrame  И последнее - сам ROICalculator. В целом, он полностью повторяет алгоритм, описанный выше, сохраняя состояние ПИФа в атрибуты объекта, что позволяет достаточно быстро рассчитывать share price на любой момент времени даже на больших данных с большим количеством движений по счету (проверял на боевых данных).  Допустим, вы положили средства в лендинговую стратегию с доходом около 0.05% в день на инвестированные средства. Это означает, что наш P&L на стоимость активов будет рассчитываться как: Это нужно для правильного определения доступа к балансам по временной метке.   Пусть 2020/1/1 было депонировано 100$, а 2020/4/1, было депонировано ещё 200$, тогда, с учетом описанной выше формулы получаем такую модель инвестора:  Определим модель инвестора: Создадим модель ПИФа: И теперь при помощи метода get_share_price_perfomance можем получить ROI на любой период времени. В качестве примера посчитаем 1D%, MTD% и YTD% до и после депозита и получим:  Делюсь кодом в надежде на то, что это кому-нибудь ещё пригодится и пару часов моих выходных не прошли впустую. Лично у меня получилось очень удачно совместить эту небольшую модель с API бирж, а также используя известную питоновскую ORM - sqlalchemy для доступа к балансам. Developer | FinTech | Crypto | AI