{"id":313134,"date":"2020-11-14T15:00:42","date_gmt":"2020-11-14T15:00:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313134"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313134","title":{"rendered":"\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u044c \u043d\u0430 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438 \u0438\u043b\u0438 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 ROI \u043d\u0430 Python"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<h2>\u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0432 \u043d\u0435\u043a\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Buy_and_hold\" rel=\"noopener noreferrer nofollow\">buy and hold<\/a>), \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"ROI\" alt=\"ROI\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/117\/fe9\/60f\/117fe960fb521d3457632e77b291c40d.svg\">(<a href=\"https:\/\/en.wikipedia.org\/wiki\/Return_on_investment\" rel=\"noopener noreferrer nofollow\">return on investment<\/a>). <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0438\u043b\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0432, \u0442\u043e\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u044c <br \/>\u043f\u043e  \u0444\u043e\u0440\u043c\u0443\u043b\u0435: <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\\\ROI = NAV \/ initial \\: investments\\\\\" alt=\"\\\\ROI = NAV \/ initial \\: investments\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/05e\/36c\/31a\/05e36c31a6e5d7dfa7624945a86a4c13.svg\" width=\"732\" height=\"36\"><\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"NAV\" alt=\"NAV\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/990\/5f5\/124\/9905f512491e33d2e77910033caf7908.svg\">&#8212; \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0430\u043a\u0442\u0438\u0432\u043e\u0432, \u0430 <img decoding=\"async\" class=\"formula inline\" source=\"initial \\: investments \" alt=\"initial \\: investments \" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4da\/137\/46e\/4da13746e375b7c9b457749c0b523077.svg\">&#8212; \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432. <\/p>\n<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439 \u0432\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u0447\u0435\u0442\u0443, \u0442\u043e \u0438\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b <img decoding=\"async\" class=\"formula inline\" source=\"ROI\" alt=\"ROI\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f0\/16a\/cfd\/5f016acfd1384d71e9456920620bc308.svg\">\u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0438\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0435\u0440\u0435\u0444\u043e\u043c\u0430\u043d\u0441\u0430 \u0446\u0435\u043d\u044b \u0430\u043a\u0446\u0438\u0438 &#171;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e&#187; \u043f\u0430\u0435\u0432\u043e\u0433\u043e \u0444\u043e\u043d\u0434\u0430 (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D0%B5%D0%B2%D0%BE%D0%B9_%D0%B8%D0%BD%D0%B2%D0%B5%D1%81%D1%82%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84..\" rel=\"noopener noreferrer nofollow\">\u041f\u0418\u0424<\/a>). \u0414\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u043e\u0433\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 (\u043d\u0430\u0434\u0435\u044e\u0441\u044c). <\/p>\n<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0443\u043b <\/h2>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439&#187; \u043f\u0430\u0435\u0432\u043e\u0439 \u0444\u043e\u043d\u0434, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 (\u043f\u0430\u0451\u0432) \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0432\u043d\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0430\u043a\u0442\u0438\u0432\u0430\u043c <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/237\/f6c\/2da\/237f6c2da45e5a38bdf1ad1ba43b1ea1.svg\">(\u0432 \u0430\u043a\u0446\u0438\u044f\u0445) \u0441 \u0446\u0435\u043d\u043e\u0439 \u0437\u0430 \u0430\u043a\u0446\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"P=1\" alt=\"P=1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6f\/f2d\/981\/c6ff2d9818ef9c72f259a892340d734d.svg\"><\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"t\" alt=\"t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f4\/8ff\/727\/6f48ff72775659c3d578acb366ff1107.svg\"> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u0430\u043a\u0446\u0438\u0439 \u043f\u043e \u0446\u0435\u043d\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"P_t\" alt=\"P_t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d47\/817\/733\/d478177338653f540456c4e6227d898a.svg\">. \u0414\u0430\u043b\u0435\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041f\u0418\u0424\u0430 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u041f\u0443\u0441\u0442\u044c<img decoding=\"async\" class=\"formula inline\" source=\"X\" alt=\"X\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbb\/a64\/613\/cbba64613750dfedd0d82b36dd088fd8.svg\">\u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043a \u0444\u043e\u043d\u0434\u0443 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"T\" alt=\"T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fd\/af8\/4de\/2fdaf84dee207511cfa97c95653408e0.svg\">, \u0433\u0434\u0435<br \/><img decoding=\"async\" class=\"formula inline\" source=\"X &gt; 0\" alt=\"X &gt; 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/17c\/98d\/793\/17c98d793c3b0b38000dc24d1747ce32.svg\"> \u043f\u0440\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0435 \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"X &lt; 0\" alt=\"X &lt; 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/664\/9fd\/e49\/6649fde49f9c597e3911c3b45aff3141.svg\">\u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412 <img decoding=\"async\" class=\"formula inline\" source=\"T_0 = T - \\varepsilon\" alt=\"T_0 = T - \\varepsilon\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a00\/4b2\/ad1\/a004b2ad1490d0bfa9b9a9b5f02e49db.svg\"> \u041f\u0418\u0424 \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0438\u0437 <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/abe\/551\/2f6\/abe5512f6ec43f17c18fe0a3168a18b9.svg\"> \u0430\u043a\u0446\u0438\u0439 \u0441 \u0446\u0435\u043d\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"P_{T_0} = {NAV}_{T_0} \/ N\" alt=\"P_{T_0} = {NAV}_{T_0} \/ N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a80\/cbb\/d9f\/a80cbbd9f7aaae3e7ead51ff78ef5acf.svg\"><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"T_1 = T + \\varepsilon\" alt=\"T_1 = T + \\varepsilon\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/71f\/621\/c94\/71f621c94f3b0449c2341ce49ae3d0a3.svg\">\u043d\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"M = N + X \/ P_{T_0}\" alt=\"M = N + X \/ P_{T_0}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f5e\/214\/d5a\/f5e214d5a27f31e73b08d0b88ba876f5.svg\"> \u0430  \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u0439 \u0436\u0435: <img decoding=\"async\" class=\"formula inline\" source=\"P_{T_0} = P_{T_1} = NAV_{T_1} \/ M\" alt=\"P_{T_0} = P_{T_1} = NAV_{T_1} \/ M\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/49a\/fb8\/aec\/49afb8aec84ac569ec244d0ea9db2f33.svg\"><\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"t\" alt=\"t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bbb\/c5b\/43f\/bbbc5b43f654c5d3dfb4a3b88df4dcba.svg\">\u0438\u043c\u0435\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 <img decoding=\"async\" class=\"formula inline\" source=\"NAV_t\" alt=\"NAV_t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc0\/bb0\/af3\/cc0bb0af3e397de20ad75f2a191837d2.svg\"><\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u043a\u0446\u0438\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"N_t\" alt=\"N_t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/211\/a88\/acc\/211a88acc2c48134581b855e45cb35a6.svg\"><\/p>\n<\/li>\n<li>\n<p>\u0446\u0435\u043d\u0443 \u043e\u0434\u043d\u043e\u0439 \u0430\u043a\u0446\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"P_t = NAV_t \/ N_t\" alt=\"P_t = NAV_t \/ N_t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bca\/f10\/cca\/bcaf10cca8c9e5ea6a45dba75ea90da9.svg\"><\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <br \/>\u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"ROI = P_t \/ P_{t_0} - 1\" alt=\"ROI = P_t \/ P_{t_0} - 1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a6\/973\/dd7\/9a6973dd7cb313cd18b379820ef62d73.svg\" width=\"135\" height=\"20\"><\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"ROI\" alt=\"ROI\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/115\/554\/b23\/115554b23f7cf4ef7c6a9d0871b42a28.svg\"> \u043f\u043e \u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"(t_0, t), t &gt; t_0\" alt=\"(t_0, t), t &gt; t_0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75c\/853\/319\/75c853319ab79e6bcbe7eb4f56051215.svg\">, \u0432 \u0447\u0435\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440<\/h2>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 100$ \u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#171;\u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c&#187; 100 \u0430\u043a\u0446\u0438\u0439 \u0437\u0430 1$. \u0414\u0430\u043b\u0435\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 20% \u0438 \u043d\u0430\u0448 \u0431\u0430\u043b\u0430\u043d\u0441 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b 120$, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0438 \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438, \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 120$ \/ 100 = 1.2$ (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u043e\u0432\u044b\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e).<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0449\u0451 210$, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0434\u043e\u0445\u043e\u0434. \u0414\u0435\u043f\u043e\u0437\u0438\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0443\u0432\u0435\u043b\u0435\u0447\u0435\u043d\u0438\u044e \u0430\u043a\u0446\u0438\u0439 \u043d\u0430 210$ \/ 1.2$ = 175. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c (120 + 210)$ \/ (100 + 175) = 1.2$, \u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c. \u0421\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0435\u0449\u0451 10% \u043e\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 363$, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 363$ \/ 275 = 1,32$. <\/p>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430: (1.2 \/ 1 &#8212; 1) * 100 = <strong>20%<\/strong><br \/>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430: (1.32 \/ 1.2 &#8212; 1) * 100 = <strong>10%<\/strong><br \/>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u0449\u0443\u044e \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0438\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438: (1.32 \/ 1 &#8212; 1) * 100 =<strong> 32%<br \/><\/strong><\/p>\n<h2>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u043e \u043a\u043e\u0434<\/h2>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438. <\/p>\n<ol>\n<li>\n<p>\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f (<code>Transaction<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0438\u0432\u0435\u0441\u0442\u043e\u0440 (<code>Investor<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0418\u0424 (<code>ROICalculator<\/code>)<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438, \u0433\u0434\u0435 <code>funding<\/code> &#8212; \u044d\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043b\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c (<strong>X<\/strong> \u0438\u0437 \u0444\u043e\u0440\u043c\u0443\u043b) <\/p>\n<pre><code class=\"python\">class Transaction:     '''     Transaction model.      timestamp: datetime.datetime - transaction timestamp     funding: float - deposit or withdrawal     {         deposit: +X in asset [U]         withdrawal: -X in asset [U]     }     '''     def __init__(self, timestamp: datetime, funding: float):         self.timestamp = timestamp         self.funding = funding <\/code><\/pre>\n<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430 &#8212; \u0441\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u043f\u043e\u0437\u0438\u0442<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u0443 \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 <\/p>\n<\/li>\n<\/ol>\n<p>C\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0443 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0435. <strong>Best practice <\/strong>\u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0411\u0414 \u0438\u043b\u0438 <code>pandas.DataFrame<\/code><\/p>\n<pre><code class=\"python\">Transactions = List[Transaction]  class Investor(ABC):     '''     Investor model.      1. Attributes     investment_timestamp: datetime.datetime - investment timestamp (deposit timestamp)     deposit: float - deposit amount in asset [U]     transactions: Transactions - list of transactions with fundings and timestamp      2. get_nav_by_timestamp - investor's net asset value      '''      def __init__(self, investment_timestamp: datetime, deposit: float, transactions: Transactions, *args, **kwargs):         self.investment_timestamp = investment_timestamp         self.deposit = deposit          # sort transactions by timestamp         # from first transaction to last         #         # EXCEPT DEPOSIT TRANSACTION         #         self.transactions = sorted(             transactions, key=lambda x: x.timestamp, reverse=False)      @abstractmethod     def get_nav_by_timestamp(self, timestamp: datetime) -&gt; float:         '''returns NAV'''         raise NotImplementedError<\/code><\/pre>\n<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 &#8212; \u0441\u0430\u043c <code>ROICalculator<\/code>. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041f\u0418\u0424\u0430 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c share price \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"t\" alt=\"t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e24\/17b\/ce3\/e2417bce3df7fb9c3b63a248a60dbecf.svg\">\u0434\u0430\u0436\u0435 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0441\u0447\u0435\u0442\u0443 (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043d\u0430 \u0431\u043e\u0435\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445). <\/p>\n<pre><code class=\"python\">class ROICalculator:     '''     ROICalculator.      1. Create virtual pif __init_pif      {         init shares = deposit quantity of asset[U]         share price = 1     }      2. System go through 3 conditions while getting funding     {         Let funding X[U] was added to virtual pif at T;          T - transaction timestamp,         T0 = T - eps - timestamp before transaction         T1 = T + eps - timestamp after transaction          pif consisted of N SHARES with share price P_0[U] = NAV_T0[U] \/ N.          Add X[U] to virtual pif: M = N + X[U] \/ P_0[U],         where M - new shares amount          Update share price P[U] = NAV_T1[U] \/ M      }     '''      def __init__(self, investor: Investor, eps_hours=1):         # eps is used while getting nav_before         # and nav_after transaction         self.investor = investor         self.eps_hours = eps_hours         self.__init_pif()      def __init_pif(self):         self.shares = self.investor.deposit         self.share_price = 1      def __calculate_shares(self, funding: float):         self.shares += funding \/ self.share_price      def __calculate_share_price(self, nav: float):         self.share_price = nav \/ self.shares      def __calculate_shares_by_timestamp(self, timestamp: datetime):          # create virtual pif each time calculating shares         self.__init_pif()          for transaction in self.investor.transactions:             if transaction.timestamp &gt; timestamp:                 break              # 1 condition: before transaction             # T0             timestamp_before_transtaction = transaction.timestamp - \\                 timedelta(hours=self.eps_hours)              if timestamp_before_transtaction &lt; self.investor.investment_timestamp:                 nav_before = self.investor.deposit              # NAV_T0             try:                 nav_before = self.investor.get_nav_by_timestamp(                     timestamp_before_transtaction)             except Exception as e:                 print(e)              # P0 = NAV_T0 \/ N             self.__calculate_share_price(nav_before)              # 2 condition: add funding to virtual pif             # shares = M             self.__calculate_shares(transaction.funding)              # T1             timestamp_after_transtaction = transaction.timestamp + \\                 timedelta(hours=self.eps_hours)              # NAV_T             try:                 nav_after = self.investor.get_nav_by_timestamp(                     timestamp_after_transtaction)             except Exception as e:                 print(e)              # update share price             # P[U] = NAV_T1[U] \/ M             self.__calculate_share_price(nav_after)      def __calculate_share_price_by_timestamp(self, timestamp: datetime):         # update shares N in self.shares         self.__calculate_shares_by_timestamp(timestamp)          # get NAV from data         nav = self.investor.get_nav_by_timestamp(timestamp)          # update share_price in self.share_price         self.__calculate_share_price(nav)      def get_share_price_perfomance(self, t0: datetime, t: datetime) -&gt; float:         '''         t  - end_timestamp         t0 - start_timestamp, t &gt; t0          t = datetime.utcnow(), t0 = investment_timestamp to get ROI         '''         self.__calculate_share_price_by_timestamp(t)         # fix share_price at t         k = self.share_price          self.__calculate_share_price_by_timestamp(t0)         # fix share_price at t0         k0 = self.share_price          return k \/ k0 - 1 <\/code><\/pre>\n<\/p>\n<h2>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/h2>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0432 \u043b\u0435\u043d\u0434\u0438\u043d\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0441 \u0434\u043e\u0445\u043e\u0434\u043e\u043c \u043e\u043a\u043e\u043b\u043e 0.05% \u0432 \u0434\u0435\u043d\u044c \u043d\u0430 <strong>\u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430. <\/strong>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0448 P&amp;L \u043d\u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a<strong>:<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"periods_i - days \\: between \\: transaction_i \\: and\\:  transaction_{i-1}, \\\\ investments_i - total \\: investments \\: in \\: the \\: period_i\" alt=\"periods_i - days \\: between \\: transaction_i \\: and\\:  transaction_{i-1}, \\\\ investments_i - total \\: investments \\: in \\: the \\: period_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f2\/f8d\/872\/2f2f8d872a81ff7d789df9e195d4e73e.svg\" width=\"732\" height=\"41\"><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"PnL_t = 0.005 * \\sum_{i=1}^n investments_i * period_i, \\: n - transactions \\: number \\: before \\: t\" alt=\"PnL_t = 0.005 * \\sum_{i=1}^n investments_i * period_i, \\: n - transactions \\: number \\: before \\: t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be3\/ded\/e18\/be3dede180d10f624713677fc1dae423.svg\" width=\"578\" height=\"50\"><\/p>\n<p>\u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0430\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0435. <\/p>\n<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c 2020\/1\/1 \u0431\u044b\u043b\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e 100$, \u0430 2020\/4\/1, \u0431\u044b\u043b\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0435\u0449\u0451 200$, \u0442\u043e\u0433\u0434\u0430, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"python\">class ExampleInvestor(Investor):     '''      Simple lending (static) strategy with 0.05% profit daily     on investments without reinvestment      '''      def __init__(self, investment_timestamp, deposit, transactions):         super().__init__(investment_timestamp, deposit, transactions)      def lending_assets(self, timestamp):         # before transaction         if timestamp &lt;= datetime(2020, 4, 1):             return 100         # after transaction         else:             return 300      def get_nav_by_timestamp(self, timestamp):         '''          NAV = investments + PnL         daily PnL = 0.0005 * investments =&gt;         total PnL = 0.0005 * sum(invesmetns_i * period_i)          '''         if timestamp &lt; datetime(2020, 4, 1):             pnl = 0.0005 * \\                 self.lending_assets(timestamp) * \\                 (timestamp - self.investment_timestamp).days             return self.lending_assets(timestamp) + pnl          elif timestamp &gt; datetime(2020, 4, 1):             # redefine investments_i and daily PnL             transaction_timestamp = datetime(2020, 4, 1)             acc_pnl_before_transaction = 0.0005 * self.lending_assets(                 transaction_timestamp) * (transaction_timestamp - self.investment_timestamp).days             pnl =  0.0005 * self.lending_assets(timestamp) * (timestamp - transaction_timestamp).days +\\                 acc_pnl_before_transaction              return self.lending_assets(timestamp) + pnl<\/code><\/pre>\n<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"python\">transaction = Transaction(datetime(2020, 4, 1), funding=200) investor = ExampleInvestor(investment_timestamp=datetime(2020, 1, 1),                            deposit=100, transactions=[transaction])<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u041f\u0418\u0424\u0430:<\/p>\n<pre><code class=\"python\">pif = ROICalculator(investor)<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>get_share_price_perfomance<\/code><strong> <\/strong>\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c ROI \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<strong>. <\/strong>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c 1D%, MTD% \u0438 YTD% \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code>1D return on 2020-03-31 = 0.05 % MTD return on 2020-03-31 = 1.51 % YTD return on 2020-03-31 = 4.50 %  1D return on 2020-04-30 = 0.05 % MTD return on 2020-04-30 = 1.44 % YTD return on 2020-04-30 = 6.01 %<\/code><\/pre>\n<\/p>\n<p>\u0414\u0435\u043b\u044e\u0441\u044c <a href=\"https:\/\/github.com\/likeblood\/ROICalculator\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434\u043e\u043c<\/a> \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u043f\u0430\u0440\u0443 \u0447\u0430\u0441\u043e\u0432 \u043c\u043e\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0438 \u0432\u043f\u0443\u0441\u0442\u0443\u044e. \u041b\u0438\u0447\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0441 API \u0431\u0438\u0440\u0436, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0443\u044e ORM &#8212; <a href=\"https:\/\/www.sqlalchemy.org\" rel=\"noopener noreferrer nofollow\">sqlalchemy<\/a> \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0430\u043c.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/527722\/\"> https:\/\/habr.com\/ru\/post\/527722\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<h2>\u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0432 \u043d\u0435\u043a\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Buy_and_hold\" rel=\"noopener noreferrer nofollow\">buy and hold<\/a>), \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Return_on_investment\" rel=\"noopener noreferrer nofollow\">return on investment<\/a>). <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0438\u043b\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0432, \u0442\u043e\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u044c <br \/>\u043f\u043e  \u0444\u043e\u0440\u043c\u0443\u043b\u0435: <\/p>\n<p>\u0433\u0434\u0435 &#8212; \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u0430\u043a\u0442\u0438\u0432\u043e\u0432, \u0430 &#8212; \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432. <\/p>\n<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439 \u0432\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u0447\u0435\u0442\u0443, \u0442\u043e \u0438\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0438\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0435\u0440\u0435\u0444\u043e\u043c\u0430\u043d\u0441\u0430 \u0446\u0435\u043d\u044b \u0430\u043a\u0446\u0438\u0438 &#171;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e&#187; \u043f\u0430\u0435\u0432\u043e\u0433\u043e \u0444\u043e\u043d\u0434\u0430 (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D0%B5%D0%B2%D0%BE%D0%B9_%D0%B8%D0%BD%D0%B2%D0%B5%D1%81%D1%82%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84..\" rel=\"noopener noreferrer nofollow\">\u041f\u0418\u0424<\/a>). \u0414\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u043e\u0433\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 (\u043d\u0430\u0434\u0435\u044e\u0441\u044c). <\/p>\n<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0443\u043b <\/h2>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439&#187; \u043f\u0430\u0435\u0432\u043e\u0439 \u0444\u043e\u043d\u0434, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 (\u043f\u0430\u0451\u0432) \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0432\u043d\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0430\u043a\u0442\u0438\u0432\u0430\u043c (\u0432 \u0430\u043a\u0446\u0438\u044f\u0445) \u0441 \u0446\u0435\u043d\u043e\u0439 \u0437\u0430 \u0430\u043a\u0446\u0438\u044e <\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438  \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u0430\u043a\u0446\u0438\u0439 \u043f\u043e \u0446\u0435\u043d\u0435 . \u0414\u0430\u043b\u0435\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041f\u0418\u0424\u0430 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u041f\u0443\u0441\u0442\u044c\u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043a \u0444\u043e\u043d\u0434\u0443 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 , \u0433\u0434\u0435<br \/> \u043f\u0440\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0435 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412  \u041f\u0418\u0424 \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0438\u0437  \u0430\u043a\u0446\u0438\u0439 \u0441 \u0446\u0435\u043d\u043e\u0439 <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442  \u0430  \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u0439 \u0436\u0435: <\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043c\u0435\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 <\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u043a\u0446\u0438\u0439 <\/p>\n<\/li>\n<li>\n<p>\u0446\u0435\u043d\u0443 \u043e\u0434\u043d\u043e\u0439 \u0430\u043a\u0446\u0438\u0438 <\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <br \/>\u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c  \u043f\u043e \u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 , \u0432 \u0447\u0435\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440<\/h2>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 100$ \u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#171;\u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c&#187; 100 \u0430\u043a\u0446\u0438\u0439 \u0437\u0430 1$. \u0414\u0430\u043b\u0435\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 20% \u0438 \u043d\u0430\u0448 \u0431\u0430\u043b\u0430\u043d\u0441 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b 120$, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0438 \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438, \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 120$ \/ 100 = 1.2$ (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0446\u0438\u0439 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u043e\u0432\u044b\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e).<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0449\u0451 210$, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0434\u043e\u0445\u043e\u0434. \u0414\u0435\u043f\u043e\u0437\u0438\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0443\u0432\u0435\u043b\u0435\u0447\u0435\u043d\u0438\u044e \u0430\u043a\u0446\u0438\u0439 \u043d\u0430 210$ \/ 1.2$ = 175. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0446\u0435\u043d\u0430 \u0430\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c (120 + 210)$ \/ (100 + 175) = 1.2$, \u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c. \u0421\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0435\u0449\u0451 10% \u043e\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 363$, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 363$ \/ 275 = 1,32$. <\/p>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430: (1.2 \/ 1 &#8212; 1) * 100 = <strong>20%<\/strong><br \/>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430: (1.32 \/ 1.2 &#8212; 1) * 100 = <strong>10%<\/strong><br \/>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0431\u0449\u0443\u044e \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0438\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438: (1.32 \/ 1 &#8212; 1) * 100 =<strong> 32%<br \/><\/strong><\/p>\n<h2>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u043e \u043a\u043e\u0434<\/h2>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438. <\/p>\n<ol>\n<li>\n<p>\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f (<code>Transaction<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0438\u0432\u0435\u0441\u0442\u043e\u0440 (<code>Investor<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0418\u0424 (<code>ROICalculator<\/code>)<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438, \u0433\u0434\u0435 <code>funding<\/code> &#8212; \u044d\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u043b\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c (<strong>X<\/strong> \u0438\u0437 \u0444\u043e\u0440\u043c\u0443\u043b) <\/p>\n<pre><code class=\"python\">class Transaction:     '''     Transaction model.      timestamp: datetime.datetime - transaction timestamp     funding: float - deposit or withdrawal     {         deposit: +X in asset [U]         withdrawal: -X in asset [U]     }     '''     def __init__(self, timestamp: datetime, funding: float):         self.timestamp = timestamp         self.funding = funding <\/code><\/pre>\n<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430 &#8212; \u0441\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u043f\u043e\u0437\u0438\u0442<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u0443 \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 <\/p>\n<\/li>\n<\/ol>\n<p>C\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0443 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0435. <strong>Best practice <\/strong>\u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0411\u0414 \u0438\u043b\u0438 <code>pandas.DataFrame<\/code><\/p>\n<pre><code class=\"python\">Transactions = List[Transaction]  class Investor(ABC):     '''     Investor model.      1. Attributes     investment_timestamp: datetime.datetime - investment timestamp (deposit timestamp)     deposit: float - deposit amount in asset [U]     transactions: Transactions - list of transactions with fundings and timestamp      2. get_nav_by_timestamp - investor's net asset value      '''      def __init__(self, investment_timestamp: datetime, deposit: float, transactions: Transactions, *args, **kwargs):         self.investment_timestamp = investment_timestamp         self.deposit = deposit          # sort transactions by timestamp         # from first transaction to last         #         # EXCEPT DEPOSIT TRANSACTION         #         self.transactions = sorted(             transactions, key=lambda x: x.timestamp, reverse=False)      @abstractmethod     def get_nav_by_timestamp(self, timestamp: datetime) -&gt; float:         '''returns NAV'''         raise NotImplementedError<\/code><\/pre>\n<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 &#8212; \u0441\u0430\u043c <code>ROICalculator<\/code>. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041f\u0418\u0424\u0430 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c share price \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0441\u0447\u0435\u0442\u0443 (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043d\u0430 \u0431\u043e\u0435\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445). <\/p>\n<pre><code class=\"python\">class ROICalculator:     '''     ROICalculator.      1. Create virtual pif __init_pif      {         init shares = deposit quantity of asset[U]         share price = 1     }      2. System go through 3 conditions while getting funding     {         Let funding X[U] was added to virtual pif at T;          T - transaction timestamp,         T0 = T - eps - timestamp before transaction         T1 = T + eps - timestamp after transaction          pif consisted of N SHARES with share price P_0[U] = NAV_T0[U] \/ N.          Add X[U] to virtual pif: M = N + X[U] \/ P_0[U],         where M - new shares amount          Update share price P[U] = NAV_T1[U] \/ M      }     '''      def __init__(self, investor: Investor, eps_hours=1):         # eps is used while getting nav_before         # and nav_after transaction         self.investor = investor         self.eps_hours = eps_hours         self.__init_pif()      def __init_pif(self):         self.shares = self.investor.deposit         self.share_price = 1      def __calculate_shares(self, funding: float):         self.shares += funding \/ self.share_price      def __calculate_share_price(self, nav: float):         self.share_price = nav \/ self.shares      def __calculate_shares_by_timestamp(self, timestamp: datetime):          # create virtual pif each time calculating shares         self.__init_pif()          for transaction in self.investor.transactions:             if transaction.timestamp &gt; timestamp:                 break              # 1 condition: before transaction             # T0             timestamp_before_transtaction = transaction.timestamp - \\                 timedelta(hours=self.eps_hours)              if timestamp_before_transtaction &lt; self.investor.investment_timestamp:                 nav_before = self.investor.deposit              # NAV_T0             try:                 nav_before = self.investor.get_nav_by_timestamp(                     timestamp_before_transtaction)             except Exception as e:                 print(e)              # P0 = NAV_T0 \/ N             self.__calculate_share_price(nav_before)              # 2 condition: add funding to virtual pif             # shares = M             self.__calculate_shares(transaction.funding)              # T1             timestamp_after_transtaction = transaction.timestamp + \\                 timedelta(hours=self.eps_hours)              # NAV_T             try:                 nav_after = self.investor.get_nav_by_timestamp(                     timestamp_after_transtaction)             except Exception as e:                 print(e)              # update share price             # P[U] = NAV_T1[U] \/ M             self.__calculate_share_price(nav_after)      def __calculate_share_price_by_timestamp(self, timestamp: datetime):         # update shares N in self.shares         self.__calculate_shares_by_timestamp(timestamp)          # get NAV from data         nav = self.investor.get_nav_by_timestamp(timestamp)          # update share_price in self.share_price         self.__calculate_share_price(nav)      def get_share_price_perfomance(self, t0: datetime, t: datetime) -&gt; float:         '''         t  - end_timestamp         t0 - start_timestamp, t &gt; t0          t = datetime.utcnow(), t0 = investment_timestamp to get ROI         '''         self.__calculate_share_price_by_timestamp(t)         # fix share_price at t         k = self.share_price          self.__calculate_share_price_by_timestamp(t0)         # fix share_price at t0         k0 = self.share_price          return k \/ k0 - 1 <\/code><\/pre>\n<\/p>\n<h2>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/h2>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0432 \u043b\u0435\u043d\u0434\u0438\u043d\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0441 \u0434\u043e\u0445\u043e\u0434\u043e\u043c \u043e\u043a\u043e\u043b\u043e 0.05% \u0432 \u0434\u0435\u043d\u044c \u043d\u0430 <strong>\u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430. <\/strong>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0448 P&amp;L \u043d\u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a<strong>:<\/strong><\/p>\n<p>\u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0430\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0435. <\/p>\n<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c 2020\/1\/1 \u0431\u044b\u043b\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e 100$, \u0430 2020\/4\/1, \u0431\u044b\u043b\u043e \u0434\u0435\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0435\u0449\u0451 200$, \u0442\u043e\u0433\u0434\u0430, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"python\">class ExampleInvestor(Investor):     '''      Simple lending (static) strategy with 0.05% profit daily     on investments without reinvestment      '''      def __init__(self, investment_timestamp, deposit, transactions):         super().__init__(investment_timestamp, deposit, transactions)      def lending_assets(self, timestamp):         # before transaction         if timestamp &lt;= datetime(2020, 4, 1):             return 100         # after transaction         else:             return 300      def get_nav_by_timestamp(self, timestamp):         '''          NAV = investments + PnL         daily PnL = 0.0005 * investments =&gt;         total PnL = 0.0005 * sum(invesmetns_i * period_i)          '''         if timestamp &lt; datetime(2020, 4, 1):             pnl = 0.0005 * \\                 self.lending_assets(timestamp) * \\                 (timestamp - self.investment_timestamp).days             return self.lending_assets(timestamp) + pnl          elif timestamp &gt; datetime(2020, 4, 1):             # redefine investments_i and daily PnL             transaction_timestamp = datetime(2020, 4, 1)             acc_pnl_before_transaction = 0.0005 * self.lending_assets(                 transaction_timestamp) *<\/code><\/pre>\n<p><\/br><\/br><\/br><\/br><\/p>\n<\/p>\n<\/li>\n<\/ol>\n<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313134","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313134"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313134\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}