{"id":453133,"date":"2025-03-24T15:01:54","date_gmt":"2025-03-24T15:01:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=453133"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=453133","title":{"rendered":"<span>\u0411\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043d\u0430 Python \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Numba. \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0430 GPU \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0411\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0435. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0451 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e.  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>Python, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 C \u0438\u043b\u0438 C++. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u043a\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e Python \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u0430\u043c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0443 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Python \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445? \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">GPU <\/a>\u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438  <\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u043a\u0430 \u043e\u0440\u0434\u0435\u0440\u043e\u0432. \u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0434\u0435\u0440\u0430 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u043f\u0440\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u0438 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u044b \u043f\u0440\u0438 \u0438\u0445 \u0440\u043e\u0441\u0442\u0435.  \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 (grid_spread), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0443\u0440\u0441, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0443. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0434\u0435\u043b\u0435 \u0436\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>grid_spread \u2014 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438.<\/p>\n<\/li>\n<li>\n<p>position_size \u2014 \u043e\u0431\u044a\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u0434\u0435\u043b\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ol>\n<li>\n<p><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438:<\/strong><\/p>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0443\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u0430. \u042d\u0442\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043a\u0443\u043f\u043a\u0430 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b<\/strong>:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 (grid_spread) \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0438, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0441\u0440\u0435\u0434\u043d\u0438\u0442\u044c \u0446\u0435\u043d\u0443 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0434\u0430\u0436\u0430 \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u0446\u0435\u043d\u044b<\/strong>:<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u0440\u0430\u0441\u0442\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u044f grid_spread \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u044c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0440\u043e\u0441\u0442\u0430 \u0446\u0435\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u0446\u0435\u043d\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e:<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0446\u0435\u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0438\u0434\u0435\u0442 \u0432 \u043d\u0430\u0448\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u043d\u0430 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f (grid_spread) \u0432\u043d\u0438\u0437 \u043e\u0442 \u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439 \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0438<\/strong>:<\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0434\u0435\u043b\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044e \u0431\u0438\u0440\u0436\u0438 (trading_fee). \u042d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u043e\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u043f\u0440\u0438\u0431\u044b\u043b\u0438.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0431\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433, \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b grid_spread \u0438 position_size, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u0438\u043b\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 \u0440\u0438\u0441\u043a\u0443. \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043d\u043e \u0438 \u043d\u0430\u0439\u0442\u0438 \u0435\u0451 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f grid_spread \u0438 position_size, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">import numpy as np  grid_spreads = np.arange(0.01, 0.26, 0.01)  # \u0421\u0435\u0442\u043a\u0430 \u043e\u0442 1% \u0434\u043e 25% \u0441 \u0448\u0430\u0433\u043e\u043c 1% position_sizes = np.arange(10, 310, 10)  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0442 10 \u0434\u043e 300 USDT \u0441 \u0448\u0430\u0433\u043e\u043c 10 USDT<\/code><\/pre>\n<p>\u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 750 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 <em>grid_spreads<\/em> \u0438 <em>position_size<\/em>, \u0442.\u0435. 750 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 grid_spreads) \u0445 <em>(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 position_sizes) = 25\u0445<\/em>30 = 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0446\u0435\u043d\u0435 \u0431\u0438\u0442\u043a\u043e\u0438\u043d\u0430 \u0437\u0430 2024 \u0433\u043e\u0434, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441 API Binance. API Binance \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043c\u044b \u0436\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a (Aggregate Trades) Aggregate Trades \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0434\u0435\u043b\u043a\u0438, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0433\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0446\u0435\u043d\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0437\u0430\u043f\u0438\u0441\u044c. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0446\u0435\u043d. \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0434\u0435\u043b\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0446\u0435\u043d, \u0430 \u0441\u0434\u0435\u043b\u043a\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0446\u0435\u043d\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0438\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0434\u0435\u043b\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c.  <\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c Pandas \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c <em>df_aggtrades<\/em> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 551+ \u043c\u043b\u043d. \u0441\u0442\u0440\u043e\u043a \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0446\u0435\u043d\u0430\u0445 \u043e \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">price<\/p>\n<\/th>\n<th>\n<p align=\"left\">quantity<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">timestamp<\/p>\n<\/th>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.000<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.578125<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00069<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.001<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00144<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.003<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.578125<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00102<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.003<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00219<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.004<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00163<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">&#8230;<\/p>\n<\/th>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:58.241<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.007812<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00060<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:58.250<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.007812<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00023<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.067<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00173<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.950<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00022<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.951<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00022<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>551044283 rows \u00d7 2 columns<\/p>\n<h3>Python<\/h3>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python:<\/p>\n<pre><code class=\"python\">class GridTrading:     \"\"\"     \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Grid Trading.          \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u0430\u043a\u0442\u0438\u0432\u0430 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435     \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c (`grid_spread`).     \"\"\"          def __init__(self, initial_timestamp, initial_price, initial_balance=1000, trading_fee=0.001):         \"\"\"         \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e Grid Trading.                  :param initial_timestamp: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f.         :param initial_price: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.         :param initial_balance: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0432 USDT (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1000).         :param trading_fee: \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0443 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.001, \u0442\u043e \u0435\u0441\u0442\u044c 0.1%).         \"\"\"         self.initial_timestamp = initial_timestamp # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438         self.initial_price = initial_price # \u0426\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0440\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438         self.grid_spread = None  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 update_strategy         self.position_size = None  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 update_strategy         self.tot_comission = 0  # \u041e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439         self.count_positions = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439         self.balance = initial_balance  # \u0411\u0430\u043b\u0430\u043d\u0441 \u0432 USDT         self.coin_amount = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u043d\u0435\u0442         self.positions = []  # \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (timestamp, price, amount)         self.trading_history = []  # \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439         self.loc_max_price = None  # \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0446\u0435\u043d\u044b         self.trading_fee = trading_fee  # \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u044e          def update_strategy(self, grid_spread, position_size):         \"\"\"         \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.                  :param grid_spread: \u0428\u0430\u0433 \u0441\u0435\u0442\u043a\u0438 (\u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u0440\u043e\u0434\u0430\u0436\u0438).         :param position_size: \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438.         \"\"\"         self.grid_spread = grid_spread         self.position_size = position_size          # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a         for _ in range(2):             self.buy_position(self.initial_timestamp, self.initial_price)              def update_trading(self, timestamp, current_price):         \"\"\"         \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043d\u044b.                  :param timestamp: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f.         :param current_price: \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.         \"\"\"         if self.count_positions == 1 and (self.loc_max_price is None or current_price &gt; self.loc_max_price):             self.loc_max_price = current_price             return                  if self.count_positions == 1 and current_price &lt;= self.loc_max_price * (1 - 2 * self.grid_spread):             self.buy_position(timestamp, current_price)             self.loc_max_price = None         elif self.count_positions &gt; 1 and current_price &lt;= self.positions[-1][1] * (1 - self.grid_spread):             self.buy_position(timestamp, current_price)         elif current_price &gt;= self.positions[-1][1] * (1 + self.grid_spread):             self.sell_position(timestamp, current_price)      def buy_position(self, timestamp, price):         \"\"\"         \u0421\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u0430\u043a\u0442\u0438\u0432\u0430.                  :param timestamp: \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f \u0441\u0434\u0435\u043b\u043a\u0438.         :param price: \u0426\u0435\u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438.         \"\"\"         comission = self.position_size * self.trading_fee         cost = self.position_size + comission          if self.balance &gt;= cost:             btc_bought = self.position_size \/ price             self.count_positions += 1             self.balance -= cost             self.tot_comission += comission              self.coin_amount += btc_bought             self.positions.append((timestamp, price, btc_bought))             self.trading_history.append({                 'Action': 'BUY',                 'Time': timestamp,                 'Price': price,                 'Amount': btc_bought,                 'Balance USDT': self.balance,                 'Total_balance': self.balance + self.coin_amount * price,                 'Total BTC amount': self.coin_amount             })          def sell_position(self, timestamp, price):         \"\"\"         \u0421\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u0430\u043a\u0442\u0438\u0432\u0430.                  :param timestamp: \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f \u0441\u0434\u0435\u043b\u043a\u0438.         :param price: \u0426\u0435\u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0436\u0438.         \"\"\"         if self.count_positions &gt; 1:             _, buy_price, btc_sold = self.positions.pop()  # \u041f\u0440\u043e\u0434\u0430\u0435\u043c \u043f\u043e \u0446\u0435\u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0438             comission = btc_sold * price * self.trading_fee             revenue = btc_sold * price - comission             self.tot_comission += comission             self.count_positions -= 1             self.balance += revenue             self.coin_amount -= btc_sold             self.loc_max_price = None             self.trading_history.append({                 'Action': 'SELL',                 'Time': timestamp,                 'Price': price,                 'Amount': btc_sold,                 'Balance USDT': self.balance,                 'Total_balance': self.balance + self.coin_amount * price,                 'Total BTC amount': self.coin_amount             }) <\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434:<\/p>\n<pre><code class=\"python\">def run_trading_simulation(df, grid_spreads, position_sizes):     \"\"\"     \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Grid Trading.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - df (pandas.DataFrame): DataFrame \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 'price' \u0434\u043b\u044f \u0446\u0435\u043d \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a.     - grid_spreads (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u0435\u0442\u043a\u0438.     - position_sizes (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - traders (list): \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0448\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.     \"\"\"     prices = df['price'].values  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043d \u0438\u0437 DataFrame     timestamps = df.index.values  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a     traders = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432          # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f\u043c \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     for grid_spread in grid_spreads:         for position_size in position_sizes:             # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439             trader = GridTrading(timestamps[0], prices[0])             trader.update_strategy(grid_spread, position_size)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430                          # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0446\u0435\u043d \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439             for i in range(len(prices)):                 price = prices[i]  # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0446\u0435\u043d\u0443                 timestamp = timestamps[i]  # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f                 trader.update_trading(timestamp, price)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043d\u044b              traders.append(trader)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a      return traders  # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 <a href=\"https:\/\/www.kaggle.com\/\" rel=\"noopener noreferrer nofollow\"><strong>Kaggle<\/strong><\/a>. \u042d\u0442\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0434\u043e\u043c. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430 \u0438\u043b\u0438 GPU, Kaggle \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 GPU (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Tesla T4 \u0438\u043b\u0438 P100) \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0438 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430<\/p>\n<pre><code class=\"python\">%timeit -r 3 -n 1 trader = run_trading_simulation(df_aggtrades, grid_spreads[:1], position_sizes[:1])  11min 21s \u00b1 1.36 s per loop (mean \u00b1 std. dev. of 3 runs, 1 loop each)<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e. \u0420\u0430\u0441\u0447\u0435\u0442 \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 11 \u043c\u0438\u043d\u0443\u0442. \u0410 \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432 <em>(\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 grid_spread \u0438 position_size) <\/em>750 \u0448\u0442. \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u043a\u043e\u043b\u043e<strong> 6 \u0434\u043d\u0435\u0439<\/strong>! <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31c\/4b1\/ed8\/31c4b1ed8e78d0362ac68be5036ea222.PNG\" width=\"499\" height=\"784\"\/><\/figure>\n<p>\u041d\u0430\u0434\u043e \u044f\u0432\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c&#8230;<\/p>\n<h3>Numba<\/h3>\n<p>\u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (\u0442\u043e\u0447\u0435\u043a \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438) \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451? \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u0440\u0430\u0437\u044b! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Numba, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (Just-In-Time) \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 Python-\u043a\u043e\u0434 \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Numba:<\/h3>\n<p>\u2714 \u041c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 C\/C++.<br \/> \u2714 \u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @njit.<br \/> \u2714 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Numba \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0435\u0451 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Numba \u0438\u043b\u0438 \u0441 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438 \u043d\u0430 Habr-\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/784068\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, <a href=\"https:\/\/habr.com\/ru\/articles\/484136\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/484142\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041c\u044b \u0436\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0435, \u0442\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0445  \u043e\u0431\u044b\u0447\u043d\u044b\u043c Python-\u0446\u0438\u043a\u043b\u043e\u043c, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u0434\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from numba import njit from numba.typed import List  @njit(inline='always') def buy_position(i, current_price, balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count):     \"\"\"     \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u043b\u0430\u043d\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0434\u0435\u043b\u043a\u0435.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - i (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.     - current_price (float): \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.     - balance (float): \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438.     - positions (numba.typed.List): \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.     - trade_points_indices (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.     - trade_points_actions (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.     - trade_points_prices (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0446\u0435\u043d \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.     - position_size (float): \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.     - trading_fee (float): \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f.     - count (int): \u0421\u0447\u0451\u0442\u0447\u0438\u043a \u0447\u0438\u0441\u043b\u0430 \u0441\u0434\u0435\u043b\u043e\u043a.      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - \u041d\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438.     \"\"\"     trade_points_indices[count] = i     trade_points_actions[count] = 0  # 0 \u0434\u043b\u044f BUY     trade_points_prices[count] = current_price     amount = position_size \/ current_price  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0443\u043f\u0438\u0442\u044c     cost = position_size * (1 + trading_fee)  # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438     positions.append((current_price, amount))  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438     return balance - cost  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043a\u0443\u043f\u043a\u0438  @njit(inline='always') def sell_position(i, current_price, balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count):     \"\"\"     \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u043b\u0430\u043d\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0434\u0435\u043b\u043a\u0435.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - i (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.     - current_price (float): \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.     - balance (float): \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438.     - positions (numba.typed.List): \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.     - trade_points_indices (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.     - trade_points_actions (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.     - trade_points_prices (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0446\u0435\u043d \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.     - position_size (float): \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.     - trading_fee (float): \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f.     - count (int): \u0421\u0447\u0451\u0442\u0447\u0438\u043a \u0447\u0438\u0441\u043b\u0430 \u0441\u0434\u0435\u043b\u043e\u043a.      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - \u041d\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438.     \"\"\"     trade_points_indices[count] = i     trade_points_actions[count] = 1  # 1 \u0434\u043b\u044f SELL     trade_points_prices[count] = current_price     buy_price, btc_sold = positions.pop()  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438     revenue = btc_sold * current_price - position_size * trading_fee  # \u0412\u044b\u0440\u0443\u0447\u043a\u0430 \u043e\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438     return balance + revenue  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0430\u0436\u0438  @njit def find_trade_points(prices, grid_spread, position_size, initial_balance=1000, trading_fee=0.001):     \"\"\"     \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0441 \u0441\u0435\u0442\u043a\u043e\u0439.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - prices (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043d \u0430\u043a\u0442\u0438\u0432\u0430.     - grid_spread (float): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0435\u0434\u0430 \u0441\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.     - position_size (float): \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.     - initial_balance (float): \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.     - trading_fee (float): \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f.      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - trade_points_indices (np.ndarray): \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.     - trade_points_actions (np.ndarray): \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 (BUY\/SELL).     - trade_points_prices (np.ndarray): \u0426\u0435\u043d\u044b \u043d\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445.     \"\"\"     positions = List()  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439     balance = initial_balance  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0430     loc_max_price = -np.inf  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u044b     count = 0  # \u0421\u0447\u0451\u0442\u0447\u0438\u043a \u0441\u0434\u0435\u043b\u043e\u043a     n = len(prices)  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0435\u043d (\u0434\u0430\u043d\u043d\u044b\u0445)          # \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445     trade_points_indices = np.empty(n, dtype=np.int32)     trade_points_actions = np.empty(n, dtype=np.int32)     trade_points_prices = np.empty(n, dtype=np.float64)          # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u043f\u043e\u043a\u0443\u043f\u043a\u0430)     for i in range(2):         balance = buy_position(0, prices[0], balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count)         count += 1      # \u041f\u043e\u0438\u0441\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0446\u0435\u043d\u044b     for i in range(n):         current_price = prices[i]         if len(positions) == 1 and current_price &gt; loc_max_price:             loc_max_price = current_price         elif len(positions) == 1 and current_price &lt;= loc_max_price * (1 - 2 * grid_spread):             cost = position_size * (1 + trading_fee)             if balance &gt;= cost:                 balance = buy_position(i, current_price, balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count)                 count += 1                 loc_max_price = -np.inf         elif len(positions) &gt; 1 and current_price &lt;= positions[-1][0] * (1 - grid_spread):             cost = position_size * (1 + trading_fee)             if balance &gt;= cost:                 balance = buy_position(i, current_price, balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count)                 count += 1                   elif len(positions) &gt; 1 and current_price &gt;= positions[-1][0] * (1 + grid_spread):             balance = sell_position(i, current_price, balance, positions, trade_points_indices, trade_points_actions, trade_points_prices, position_size, trading_fee, count)             count += 1             loc_max_price = -np.inf          return (trade_points_indices[:count],              trade_points_actions[:count],              trade_points_prices[:count]) <\/code><\/pre>\n<p>\u0421\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 <em>update_trading<\/em> \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <em>process_trade.<\/em><\/p>\n<pre><code class=\"python\">class FastGridTrading:     \"\"\"     \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0435\u0442\u043a\u0438 (Grid Trading).     \u0425\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445, \u0431\u0430\u043b\u0430\u043d\u0441\u0435, \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u0434\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430.     \"\"\"      def __init__(self, initial_timestamp, initial_price, initial_balance=1000, trading_fee=0.001):         \"\"\"         \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.          :param initial_timestamp: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438.         :param initial_price: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438.         :param initial_balance: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1000).         :param trading_fee: \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0443 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.001).         \"\"\"         self.position_size = None  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438         self.grid_spread = None  # \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Grid         self.tot_comission = 0  # \u041e\u0431\u0449\u0430\u044f \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f, \u0443\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0438         self.count_positions = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439         self.balance = initial_balance  # \u0411\u0430\u043b\u0430\u043d\u0441 \u0432 \u0432\u0430\u043b\u044e\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, USDT)         self.coin_amount = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u043d\u0435\u0442         self.positions = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439         self.trading_history = []  # \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u0434\u0435\u043b\u043e\u043a (\u043f\u043e\u043a\u0443\u043f\u043a\u0430\/\u043f\u0440\u043e\u0434\u0430\u0436\u0430)         self.loc_max_price = None  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442         self.trading_fee = trading_fee  # \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0443      def update_strategy(self, grid_spread, position_size):         \"\"\"         \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438.          :param grid_spread: \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Grid.         :param position_size: \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438.         \"\"\"         self.grid_spread = grid_spread         self.position_size = position_size      def process_trade(self, timestamp, action, price):         \"\"\"         \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0434\u0435\u043b\u043a\u0443 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0430).          :param timestamp: \u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u043a\u0438.         :param action: \u0422\u0438\u043f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f ('BUY' \u0438\u043b\u0438 'SELL').         :param price: \u0426\u0435\u043d\u0430 \u0441\u0434\u0435\u043b\u043a\u0438.         \"\"\"         if action == 'BUY':             self.buy_position(timestamp, price)  # \u041f\u043e\u043a\u0443\u043f\u043a\u0430         elif action == 'SELL':             self.sell_position(timestamp, price)  # \u041f\u0440\u043e\u0434\u0430\u0436\u0430      def buy_position(self, timestamp, price):         \"\"\"         \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043d\u0435.          :param timestamp: \u0412\u0440\u0435\u043c\u044f \u0441\u0434\u0435\u043b\u043a\u0438.         :param price: \u0426\u0435\u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438.         \"\"\"         comission = self.position_size * self.trading_fee         cost = self.position_size + comission  # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438 (\u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438)         if self.balance &gt;= cost:  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432             btc_bought = self.position_size \/ price  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u043d\u0435\u0442             self.count_positions += 1  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439             self.balance -= cost  # \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0431\u0430\u043b\u0430\u043d\u0441 \u043d\u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0443\u043f\u043a\u0438             self.tot_comission += comission  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044e             self.coin_amount += btc_bought  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u043d\u0435\u0442             self.positions.append((timestamp, price, btc_bought))  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e             self.trading_history.append({                 'Action': 'BUY',                                 'Time': timestamp,                  'Price': price,                  'Amount': btc_bought,                 'Balance USDT': self.balance,                  'Total_balance': self.balance + self.coin_amount * price,                  'Total BTC amount': self.coin_amount             })  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0434\u0435\u043b\u043a\u0435 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e          def sell_position(self, timestamp, price):         \"\"\"         \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043d\u0435.          :param timestamp: \u0412\u0440\u0435\u043c\u044f \u0441\u0434\u0435\u043b\u043a\u0438.         :param price: \u0426\u0435\u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0436\u0438.         \"\"\"         if self.count_positions &gt; 1:  # \u041f\u0440\u043e\u0434\u0430\u0436\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438             _, buy_price, btc_sold = self.positions.pop()  # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e             comission = btc_sold * price * self.trading_fee             revenue = btc_sold * price - comission  # \u0412\u044b\u0440\u0443\u0447\u043a\u0430 \u043e\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u0437\u0430 \u0432\u044b\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438             self.tot_comission += comission  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044e             self.count_positions -= 1  # \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439             self.balance += revenue  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0430\u043b\u0430\u043d\u0441 \u043d\u0430 \u0432\u044b\u0440\u0443\u0447\u043a\u0443 \u043e\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0438             self.coin_amount -= btc_sold  # \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u043d\u0435\u0442             self.loc_max_price = None  # \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u0443             self.trading_history.append({                 'Action': 'SELL',                 'Time': timestamp,                  'Price': price,                  'Amount': btc_sold,                  'Balance USDT': self.balance,                  'Total_balance': self.balance + self.coin_amount * price,                 'Total BTC amount': self.coin_amount             })  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0434\u0435\u043b\u043a\u0435 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0442 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"python\">def run_trading_simulation_njit(df, grid_spreads, position_sizes):     \"\"\"     \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 `find_trade_points` \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - df (pandas.DataFrame): DataFrame \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0414\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0446\u044b 'close' \u0438 'price' \u0441 \u0446\u0435\u043d\u0430\u043c\u0438.     - grid_spreads (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u0435\u0442\u043a\u0438.     - position_sizes (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.          \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - traders (list): \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0448\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e.     \"\"\"     # \u0412\u044b\u0431\u043e\u0440 \u0446\u0435\u043d \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430 klines     prices = df['price'].values             timestamps = df.index.values         traders = []      # \u0426\u0438\u043a\u043b \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0439     for grid_spread in grid_spreads:         for position_size in position_sizes:             # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 find_trade_points             indices, actions, trade_prices = find_trade_points(prices, grid_spread, position_size)                          # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439             trader = FastGridTrading(timestamps[0], prices[0])             trader.update_strategy(grid_spread, position_size)              # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a             for idx, action, price in zip(indices, actions, trade_prices):                 if 0 &lt;= idx &lt; len(timestamps):  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430                     if action == 0:                         trader.process_trade(timestamps[idx], 'BUY', price)  # \u041f\u043e\u043a\u0443\u043f\u043a\u0430                     elif action == 1:                         trader.process_trade(timestamps[idx], 'SELL', price)  # \u041f\u0440\u043e\u0434\u0430\u0436\u0430              traders.append(trader)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a      return traders <\/code><\/pre>\n<p>\u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u0434\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 run_trading_simulation_njit, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 run_trading_simulation:  <\/p>\n<ol>\n<li>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 find_trade_points \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a<\/strong>: \u0412 \u043d\u043e\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 find_trade_points, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0430) \u0438 \u0446\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0438 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p> <strong>\u0417\u0430\u043c\u0435\u043d\u0430 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 GridTrading \u043d\u0430 FastGridTrading<\/strong>: \u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 FastGridTrading. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e find_trade_points, \u0430 FastGridTrading \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043b\u0443\u0436\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c.  <\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 Python-\u0446\u0438\u043a\u043b\u0430<\/strong>: \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0435\u043d\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 update_trading, \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 find_trade_points \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 process_trade. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 Python-\u0446\u0438\u043a\u043b\u043e\u0432. <\/p>\n<\/li>\n<\/ol>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0438 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <em>grid_spreads<\/em> \u0438 <em>position_sizes<\/em>:<\/p>\n<pre><code class=\"python\">%timeit -r 3 -n 1 trader_njit = run_trading_simulation_njit(df_aggtrades, grid_spreads[:1], position_sizes[:1])  33.1 s \u00b1 28.2 ms per loop (mean \u00b1 std. dev. of 3 runs, 1 loop each)<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 Numba \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c Python. \u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0441\u0447\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 33 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e <strong>6.9 \u0447\u0430\u0441\u043e\u0432<\/strong>!<\/p>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0439\u043c\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435? \u041f\u0440\u0438\u0447\u0435\u043c \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043d\u0435 \u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0438, \u0430 \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 <strong>\u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438<\/strong>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d45\/609\/a52\/d45609a526c03c20ed9f39aed1e68d8c.jpg\" width=\"1000\" height=\"560\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d45\/609\/a52\/d45609a526c03c20ed9f39aed1e68d8c.jpg\" data-blurred=\"true\"\/><\/figure>\n<h4>Numba + GPU<\/h4>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438\u0445 \u043d\u0430 GPU. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 CPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, GPU (\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440) \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u044f\u0434\u0435\u0440, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. GPU \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>Numba \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 <em>@cuda.jit<\/em> \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f CUDA-\u044f\u0434\u0440\u0430 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 Python, \u043d\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u044f\u0441\u044c \u0432 \u044f\u0437\u044b\u043a\u0438 \u043d\u0438\u0437\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a C++\/CUDA.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0442\u044b\u0441\u044f\u0447\u0430\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 GPU, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0442 \u0436\u0435 Python-\u043a\u043e\u0434, \u043d\u043e \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Numba \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPU:<br \/> \u2714 \u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <em>@njit <\/em>\u043d\u0430 <em>@cuda.jit <\/em>\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438.<br \/> \u2714 \u0421\u0438\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u2013 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/> \u2714 \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u2013 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c CPU \u0438 GPU-\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e <em>@cuda.jit<\/em> \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u0447\u0435\u043c <em>@njit<\/em>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c GPU, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p> \u041f\u043e\u0441\u043b\u0435 \u0440\u044f\u0434\u0430 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u043a\u043e\u0434 \u044f\u0434\u0440\u0430 CUDA \u043f\u0440\u0438\u043d\u044f\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:  <\/p>\n<pre><code class=\"python\">from numba import cuda  @cuda.jit(device=True, inline=True) def buy_pos(thread_id, k, current_price, position_size, balance, trading_fee, active_position_count, count,              trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts):     \"\"\"     \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u043f\u043e\u043a\u0443\u043f\u043a\u0438).          \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:     thread_id: int - \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430.     k: int - \u0418\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043d\u044b.     current_price: float - \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.     position_size: float - \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438.     balance: array - \u0411\u0430\u043b\u0430\u043d\u0441 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430.     trading_fee: float - \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u044e.     active_position_count: array - \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.     count: array - \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0434\u0435\u043b\u043e\u043a.     trade_points_indices, trade_points_actions, trade_points_prices,     trade_points_positions, trade_points_amounts: arrays - \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u0434\u0435\u043b\u043a\u0430\u0445.     \"\"\"     cost = position_size * (1 + trading_fee)     if balance[0] &gt;= cost:         amount = position_size \/ current_price         balance[0] -= cost                  trade_points_indices[thread_id, count[0]] = k         trade_points_actions[thread_id, count[0]] = 2  # BUY         trade_points_prices[thread_id, count[0]] = current_price         trade_points_positions[thread_id, active_position_count[0]] = current_price         trade_points_amounts[thread_id, active_position_count[0]] = amount                  active_position_count[0] += 1         count[0] += 1          @cuda.jit(device=True, inline=True) def sell_pos(thread_id, k, current_price, position_size, balance, trading_fee, active_position_count, count,               trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts):     \"\"\"     \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u043f\u0440\u043e\u0434\u0430\u0436\u0438).          \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b buy_pos.     \"\"\"     sold_amount = trade_points_amounts[thread_id, active_position_count[0] - 1]     revenue = sold_amount * current_price - position_size * trading_fee     balance[0] += revenue          trade_points_indices[thread_id, count[0]] = k     trade_points_actions[thread_id, count[0]] = 1  # SELL     trade_points_prices[thread_id, count[0]] = current_price      active_position_count[0] -= 1     trade_points_positions[thread_id, active_position_count[0]] = 0     trade_points_amounts[thread_id, active_position_count[0]] = 0          count[0] += 1  @cuda.jit def find_trade_points_cuda(prices, grid_spreads, position_sizes, initial_balance, trading_fee, trade_points_indices,                             trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts, max_trades):     \"\"\"     \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 CUDA-\u044f\u0434\u0440\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.          \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:     prices: array - \u041c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043d \u0430\u043a\u0442\u0438\u0432\u0430.     grid_spreads: array - \u041c\u0430\u0441\u0441\u0438\u0432 \u0448\u0430\u0433\u043e\u0432 \u0441\u0435\u0442\u043a\u0438.     position_sizes: array - \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u0439.     initial_balance: float - \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430.     trading_fee: float - \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0443.     trade_points_*: arrays - \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0434\u0435\u043b\u043a\u0430\u0445.     max_trades: int - \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 (\u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438).     \"\"\"     i, j = cuda.grid(2)  # \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432     if i &lt; grid_spreads.shape[0] and j &lt; position_sizes.shape[0]:         thread_id = i * position_sizes.shape[0] + j  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439         grid_spread = grid_spreads[i]  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430         position_size = position_sizes[j]         loc_max_price = -1e10          balance = cuda.local.array(1, dtype=np.float32)         balance[0] = initial_balance          count = cuda.local.array(1, dtype=np.int32)         count[0] = 0          active_position_count = cuda.local.array(1, dtype=np.int32)         active_position_count[0] = 0                  # \u041f\u043e\u043a\u0443\u043f\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438         current_price = prices[0]         for _ in range(2):             buy_pos(thread_id, 0, current_price, position_size, balance, trading_fee, active_position_count, count,                      trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts)          for k in range(1, prices.shape[0]):             if count[0] &gt;= max_trades:                 break             current_price = prices[k]             active_position_price = trade_points_positions[thread_id, active_position_count[0] - 1]                          if active_position_count[0] == 1 and current_price &gt; loc_max_price:                 loc_max_price = current_price             elif active_position_count[0] == 1 and current_price &lt;= loc_max_price * (1 - 2 * grid_spread):                 buy_pos(thread_id, k, current_price, position_size, balance, trading_fee, active_position_count, count,                          trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts)                 loc_max_price = -1e10             elif active_position_count[0] &gt; 1 and current_price &lt;= active_position_price * (1 - grid_spread):                 buy_pos(thread_id, k, current_price, position_size, balance, trading_fee, active_position_count, count,                          trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts)             elif active_position_count[0] &gt; 1 and current_price &gt;= active_position_price * (1 + grid_spread):                   sell_pos(thread_id, k, current_price, position_size, balance, trading_fee, active_position_count, count,                           trade_points_indices, trade_points_actions, trade_points_prices, trade_points_positions, trade_points_amounts)                 loc_max_price = -1e10<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0442 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"python\">def run_trading_simulation_cuda(df, grid_spreads, position_sizes):     \"\"\"     \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c GPU \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.      \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:     - df (pandas.DataFrame): DataFrame \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 'price' \u0441 \u0446\u0435\u043d\u0430\u043c\u0438.     - grid_spreads (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u0435\u0442\u043a\u0438.     - position_sizes (np.ndarray): \u041c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.      \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:     - traders (list): \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0448\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e.     \"\"\"     # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043d \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a     prices = df['price'].values.astype(np.float32)     timestamps = df.index.values     traders = []      n = len(prices)     n_traders = len(grid_spreads) * len(position_sizes)  # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432     max_trades = 5000  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u043e\u043a \u043d\u0430 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430      # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0434\u0435\u043b\u043a\u0430\u0445     trade_points_indices = np.zeros((n_traders, max_trades), dtype=np.int32)     trade_points_actions = np.zeros((n_traders, max_trades), dtype=np.int32)     trade_points_prices = np.zeros((n_traders, max_trades), dtype=np.float32)     trade_points_positions = np.zeros((n_traders, max_trades), dtype=np.float32)     trade_points_amounts = np.zeros((n_traders, max_trades), dtype=np.float32)      # \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 GPU     d_prices = cuda.to_device(prices)     d_trade_points_indices = cuda.to_device(trade_points_indices)     d_trade_points_actions = cuda.to_device(trade_points_actions)     d_trade_points_prices = cuda.to_device(trade_points_prices)     d_trade_points_positions = cuda.to_device(trade_points_positions)     d_trade_points_amounts = cuda.to_device(trade_points_amounts)     d_grid_spreads = cuda.to_device(grid_spreads)     d_position_sizes = cuda.to_device(position_sizes)      # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0435\u0442\u043a\u0438 CUDA     threads_per_block = (8, 8)  # 8x8 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0431\u043b\u043e\u043a\u0435     blocks_per_grid = ((grid_spreads.shape[0] + threads_per_block[0] - 1) \/\/ threads_per_block[0],                         (position_sizes.shape[0] + threads_per_block[1] - 1) \/\/ threads_per_block[1])      # \u0417\u0430\u043f\u0443\u0441\u043a \u044f\u0434\u0440\u0430 CUDA \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a     find_trade_points_cuda[blocks_per_grid, threads_per_block](d_prices, d_grid_spreads, d_position_sizes, 1000.0, 0.001,                                                                d_trade_points_indices, d_trade_points_actions,                                                                 d_trade_points_prices, d_trade_points_positions,                                                                 d_trade_points_amounts, max_trades)      # \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (GPU)     cuda.synchronize()      # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c CPU     trade_points_indices = d_trade_points_indices.copy_to_host()     trade_points_actions = d_trade_points_actions.copy_to_host()     trade_points_prices = d_trade_points_prices.copy_to_host()      # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432     for i, grid_spread in enumerate(grid_spreads):         for j, position_size in enumerate(position_sizes):             trader_id = i * position_sizes.shape[0] + j             indices, actions, trade_prices = trade_points_indices[trader_id], trade_points_actions[trader_id], trade_points_prices[trader_id]                          # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439             trader = FastGridTrading(timestamps[0], prices[0])             trader.update_strategy(grid_spread, position_size)              # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0434\u0435\u043b\u043e\u043a \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430             for idx, action, price in zip(indices, actions, trade_prices):                 if 0 &lt;= idx &lt; len(timestamps):  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430                     if action == 2:                         trader.process_trade(timestamps[idx], 'BUY', price)  # \u041f\u043e\u043a\u0443\u043f\u043a\u0430                     elif action == 1:                         trader.process_trade(timestamps[idx], 'SELL', price)  # \u041f\u0440\u043e\u0434\u0430\u0436\u0430                     elif action == 0:                         break  # \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0434\u0435\u043b\u043e\u043a              traders.append(trader)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a      return traders <\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0434\u0440\u0430 Cuda \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a. <\/strong>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <em>d_prices, d_trade_points_indices, d_trade_points_actions<\/em> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e GPU \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 cuda.to_device.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438 CUDA:<\/strong> \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0441\u0435\u0442\u043a\u0438 CUDA \u0431\u044b\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 <em>threads_per_block \u0438 blocks_per_grid<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8&#215;8 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0432\u0441\u0435\u0433\u043e 64 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0431\u043b\u043e\u043a), \u0442\u0430\u043a\u0436\u0435, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443 \u0431\u043b\u043e\u043a\u043e\u0432 4\u04454 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 CUDA-\u044f\u0434\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a CUDA-\u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a:<\/strong> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e CUDA <em>find_trade_points_cuda<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u042d\u0442\u043e \u044f\u0434\u0440\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: \u0446\u0435\u043d, \u0441\u043f\u0440\u0435\u0434\u043e\u0432 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b (\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0446\u0435\u043d\u044b) \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 CPU \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.  <\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0430 CPU:<\/strong> \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 GPU, \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0446\u0435\u043d\u044b) \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c CPU \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <em>copy_to_host<\/em>. \u0414\u0430\u043b\u0435\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0434\u0435\u043b\u043a\u0438 (\u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438).  <\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 CUDA-\u044f\u0434\u0440\u0430 (<em>find_trade_points_cuda[blocks_per_grid, threads_per_block]) <\/em>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 <em>cuda.synchronize()<\/em> \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0445\u043e\u0441\u0442. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\"><em>rece condition <\/em><\/a>\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u044f\u0434\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u0438 \u0431\u0435\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 GPU \u0435\u0449\u0451 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442. <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0438 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/p>\n<pre><code class=\"python\">%timeit -r 3 -n 1 traders_cuda = run_trading_simulation_cuda(df_aggtrades, grid_spreads[:1], position_sizes[:1])  2min 56s \u00b1 559 ms per loop (mean \u00b1 std. dev. of 3 runs, 1 loop each)<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 GPU \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 CPU. \u042d\u0442\u043e \u043d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0435\u0434\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 GPU.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438?<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f GPU<\/strong>: \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 GPU \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 CPU \u043d\u0430 GPU. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043c\u0430\u043b\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a GPU-\u044f\u0434\u0435\u0440 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 CPU, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0438\u0437\u043a\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c<\/strong>: \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0442\u0440\u0435\u0439\u0434\u0435\u0440, GPU \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 GPU \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 CPU \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u044d\u0442\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438, \u0447\u0435\u043c \u043d\u0430 CPU. \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432, GPU \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u0438\u043d\u043d\u0443\u044e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0418\u0437\u043c\u0435\u0440\u0438\u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439, \u043c\u044b \u0432 \u044d\u0442\u043e\u043c \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f:<\/p>\n<pre><code class=\"python\">%timeit -r 3 -n 1 traders_cuda = run_trading_simulation_cuda(df_aggtrades, grid_spreads, position_sizes)  3min 13s \u00b1 42.4 ms per loop (mean \u00b1 std. dev. of 3 runs, 1 loop each)<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0447\u0435\u0442 \u0432\u0441\u0435\u0445 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0438\u0437 551+ \u043c\u043b\u043d. \u0441\u0442\u0440\u043e\u043a \u043d\u0430 GPU \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e <strong>3 \u043c\u0438\u043d\u0443\u0442<\/strong>, \u0442\u043e\u0433\u0434\u0430, \u043a\u0430\u043a \u043d\u0430 CPU \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0442\u0435 \u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u044f\u043b\u0438 \u0431\u044b \u0443 \u043d\u0430\u0441 <strong>6.9 \u0447\u0430\u0441\u043e\u0432<\/strong>, \u0430 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python &#8212; \u043e\u043a\u043e\u043b\u043e<strong> 6 \u0434\u043d\u0435\u0439<\/strong>! <\/p>\n<p>\u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438?<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438 \u0432\u044b\u044f\u0432\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <em>grid_spreads<\/em> \u0438 <em>position_sizes.<\/em>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b 5 \u0441\u0430\u043c\u044b\u0445 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432:<\/p>\n<pre><code class=\"python\">def get_best_traders(traders):     # \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0443 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 (Total_balance)     best_traders = list(sorted(traders, key=lambda trader: trader.trading_history[-1]['Total_balance'], reverse=True))          # \u0412\u044b\u0432\u043e\u0434 5 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432     print('5 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432:')     for trader in best_traders[:5]:         print(F'Balance {trader.trading_history[-1]['Total_balance']}, Coin_amount {trader.coin_amount}, grid_spread = {trader.grid_spread}, position_size {trader.position_size}')              # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432     return best_traders <\/code><\/pre>\n<pre><code class=\"python\">best_traders = get_best_traders(traders_aggtrades_cuda)  5 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432: Balance 1885.984680493356, Coin_amount 0.015925017303672642, grid_spread = 0.02, position_size 300 Balance 1872.3357090157292, Coin_amount 0.01835634717758678, grid_spread = 0.02, position_size 290 Balance 1842.2551673255375, Coin_amount 0.01772336968870448, grid_spread = 0.02, position_size 280 Balance 1841.3185065872528, Coin_amount 0.01709039219982217, grid_spread = 0.02, position_size 270 Balance 1828.858028097698, Coin_amount 0.01645741471093987, grid_spread = 0.02, position_size 260<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438 \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<pre><code>import matplotlib.pyplot as plt  def plot_backtest_results_(df, trader):     fig, ax = plt.subplots(3, 1, figsize=(12, 16), sharex=True)      # \ud83d\udcc8 1\ufe0f\u20e3 \u0413\u0440\u0430\u0444\u0438\u043a \u0446\u0435\u043d\u044b \u043c\u043e\u043d\u0435\u0442\u044b \u0441 \u043f\u043e\u043a\u0443\u043f\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0430\u043c\u0438     ax[0].plot(df.index, df['close'], label=\"\u0426\u0435\u043d\u0430\", color='black', linewidth=1)      # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u0434\u0435\u043b\u043a\u0438 \u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438     buy_trades = [trade for trade in trader.trading_history if trade['Action'] == \"BUY\"]     sell_trades = [trade for trade in trader.trading_history if trade['Action'] ==  \"SELL\"]      # \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0438 \u043f\u0440\u043e\u0434\u0430\u0436     buy_times = [trade[\"Time\"] for trade in buy_trades]     buy_prices = [trade[\"Price\"] for trade in buy_trades]      sell_times = [trade[\"Time\"] for trade in sell_trades]     sell_prices = [trade[\"Price\"] for trade in sell_trades]      # \ud83d\udccd \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a \u0446\u0435\u043d\u044b     ax[0].scatter(buy_times, buy_prices, color='green', label=\"\u041f\u043e\u043a\u0443\u043f\u043a\u0438\", marker='^', s=100)     ax[0].scatter(sell_times, sell_prices, color='red', label=\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", marker='v', s=100)      ax[0].set_ylabel(\"\u0426\u0435\u043d\u0430 (USDT)\")     ax[0].set_title(\"\u0413\u0440\u0430\u0444\u0438\u043a \u0446\u0435\u043d\u044b \u043c\u043e\u043d\u0435\u0442\u044b \u0438 \u0441\u0434\u0435\u043b\u043e\u043a\")     ax[0].legend()     ax[0].grid()      # \ud83d\udcb0 2\ufe0f\u20e3 \u0413\u0440\u0430\u0444\u0438\u043a \u0440\u043e\u0441\u0442\u0430 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430 (usdt)     balance_history = [trade[\"Balance USDT\"] for trade in trader.trading_history]     timestamps = [trade[\"Time\"] for trade in trader.trading_history]      ax[1].plot(timestamps, balance_history, label=\"\u0411\u0430\u043b\u0430\u043d\u0441 (USDT)\", color='blue', linewidth=1.5)     ax[1].set_ylabel(\"\u0411\u0430\u043b\u0430\u043d\u0441 (USDT)\")     ax[1].set_title(\"\u0420\u043e\u0441\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430\")     ax[1].legend()     ax[1].grid()      # \ud83d\udcb0  \u0413\u0440\u0430\u0444\u0438\u043a \u0440\u043e\u0441\u0442\u0430 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430      total_balance_history = [trade['Total_balance'] for trade in trader.trading_history]     timestamps = [trade[\"Time\"] for trade in trader.trading_history]      ax[2].plot(timestamps, total_balance_history, label=\"\u0411\u0430\u043b\u0430\u043d\u0441 (USDT)\", color='blue', linewidth=1.5)     ax[2].set_ylabel(\"\u0411\u0430\u043b\u0430\u043d\u0441 (USDT)\")     ax[2].set_title(\"\u0420\u043e\u0441\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430\")     ax[2].legend()     ax[2].grid()      plt.xlabel(\"\u0412\u0440\u0435\u043c\u044f\")     plt.xticks(rotation=45)     plt.tight_layout()     plt.show()  plot_backtest_results_(df_klines, best_traders[0])<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/816\/412\/1da\/8164121da012440fba99a468b6ce0452.png\" width=\"3570\" height=\"4766\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/816\/412\/1da\/8164121da012440fba99a468b6ce0452.png\"\/><\/figure>\n<p>\u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u0440\u0435\u0439\u0434\u0435\u0440 \u0441 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 <em>grid_spread = 0.02<\/em> \u0438 <em>position_size = 300. <\/em>\u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u0430 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430 \u043d\u0430 80%.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <em>grid_spreads<\/em> \u0438 <em>position_sizes, <\/em>\u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0438\u043c\u0438 \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0438 \u0440\u0438\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u043d\u0434\u0430.  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0431\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439, \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u043e\u0432.  <\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/893748\/\"> https:\/\/habr.com\/ru\/articles\/893748\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0411\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0435. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0451 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e.  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>Python, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 C \u0438\u043b\u0438 C++. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u043a\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e Python \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u0430\u043c. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0443 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Python \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445? \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">GPU <\/a>\u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438  <\/h2>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u043a\u0430 \u043e\u0440\u0434\u0435\u0440\u043e\u0432. \u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0434\u0435\u0440\u0430 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u043f\u0440\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u0438 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u044b \u043f\u0440\u0438 \u0438\u0445 \u0440\u043e\u0441\u0442\u0435.  \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 (grid_spread), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0443\u0440\u0441, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0442\u0440\u0435\u0439\u0434\u0435\u0440 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0443. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0434\u0435\u043b\u0435 \u0436\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>grid_spread \u2014 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0438.<\/p>\n<\/li>\n<li>\n<p>position_size \u2014 \u043e\u0431\u044a\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u0434\u0435\u043b\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ol>\n<li>\n<p><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438:<\/strong><\/p>\n<p>\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0432\u0443\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u0430. \u042d\u0442\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043a\u0443\u043f\u043a\u0430 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b<\/strong>:<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 (grid_spread) \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0438, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0441\u0440\u0435\u0434\u043d\u0438\u0442\u044c \u0446\u0435\u043d\u0443 \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0434\u0430\u0436\u0430 \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u0446\u0435\u043d\u044b<\/strong>:<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u0440\u0430\u0441\u0442\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u044f grid_spread \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u044c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0440\u043e\u0441\u0442\u0430 \u0446\u0435\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u0446\u0435\u043d\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e:<\/strong><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0446\u0435\u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0438\u0434\u0435\u0442 \u0432 \u043d\u0430\u0448\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u043d\u0430 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f (grid_spread) \u0432\u043d\u0438\u0437 \u043e\u0442 \u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439 \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0438<\/strong>:<\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0434\u0435\u043b\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044e \u0431\u0438\u0440\u0436\u0438 (trading_fee). \u042d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0434\u0435\u043b\u043e\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u043f\u0440\u0438\u0431\u044b\u043b\u0438.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0431\u044d\u043a\u0442\u0435\u0441\u0442\u0438\u043d\u0433, \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b grid_spread \u0438 position_size, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u0438\u043b\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 \u0440\u0438\u0441\u043a\u0443. \u0417\u0430\u0434\u0430\u0447\u0430 \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043d\u043e \u0438 \u043d\u0430\u0439\u0442\u0438 \u0435\u0451 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f grid_spread \u0438 position_size, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">import numpy as np  grid_spreads = np.arange(0.01, 0.26, 0.01)  # \u0421\u0435\u0442\u043a\u0430 \u043e\u0442 1% \u0434\u043e 25% \u0441 \u0448\u0430\u0433\u043e\u043c 1% position_sizes = np.arange(10, 310, 10)  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043e\u0442 10 \u0434\u043e 300 USDT \u0441 \u0448\u0430\u0433\u043e\u043c 10 USDT<\/code><\/pre>\n<p>\u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 750 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 <em>grid_spreads<\/em> \u0438 <em>position_size<\/em>, \u0442.\u0435. 750 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u0439\u0434\u0435\u0440\u043e\u0432. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 grid_spreads) \u0445 <em>(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 position_sizes) = 25\u0445<\/em>30 = 750 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0446\u0435\u043d\u0435 \u0431\u0438\u0442\u043a\u043e\u0438\u043d\u0430 \u0437\u0430 2024 \u0433\u043e\u0434, \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441 API Binance. API Binance \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043c\u044b \u0436\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a (Aggregate Trades) Aggregate Trades \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0434\u0435\u043b\u043a\u0438, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0433\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0446\u0435\u043d\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0437\u0430\u043f\u0438\u0441\u044c. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0432\u0435\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0446\u0435\u043d. \u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0434\u0435\u043b\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0446\u0435\u043d, \u0430 \u0441\u0434\u0435\u043b\u043a\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0446\u0435\u043d\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0438\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0434\u0435\u043b\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c.  <\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c Pandas \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c <em>df_aggtrades<\/em> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 551+ \u043c\u043b\u043d. \u0441\u0442\u0440\u043e\u043a \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0446\u0435\u043d\u0430\u0445 \u043e \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0434\u0435\u043b\u043e\u043a \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">price<\/p>\n<\/th>\n<th>\n<p align=\"left\">quantity<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">timestamp<\/p>\n<\/th>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.000<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.578125<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00069<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.001<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00144<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.003<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.578125<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00102<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.003<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00219<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-01-01 00:00:00.004<\/p>\n<\/th>\n<td>\n<p align=\"left\">42283.589844<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00163<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">&#8230;<\/p>\n<\/th>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:58.241<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.007812<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00060<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:58.250<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.007812<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00023<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.067<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00173<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.950<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00022<\/p>\n<\/td>\n<\/tr>\n<tr>\n<th>\n<p align=\"left\">2024-12-31 23:59:59.951<\/p>\n<\/th>\n<td>\n<p align=\"left\">93576.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.00022<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>551044283 rows \u00d7 2 columns<\/p>\n<h3>Python<\/h3>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Python:<\/p>\n<pre><code class=\"python\">class GridTrading:     \"\"\"     \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 Grid Trading.          \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0439 \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u0430\u043a\u0442\u0438\u0432\u0430 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0446\u0435\u043d\u044b \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435     \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c (`grid_spread`).     \"\"\"          def __init__(self, initial_timestamp, initial_price, initial_balance=1000, trading_fee=0.001):         \"\"\"         \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e Grid Trading.                  :param initial_timestamp: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f.         :param initial_price: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.         :param initial_balance: \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u0432 USDT (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1000).         :param trading_fee: \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0441\u0434\u0435\u043b\u043a\u0443 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0.001, \u0442\u043e \u0435\u0441\u0442\u044c 0.1%).         \"\"\"         self.initial_timestamp = initial_timestamp # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438         self.initial_price = initial_price # \u0426\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0440\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438         self.grid_spread = None  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 update_strategy         self.position_size = None  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 update_strategy         self.tot_comission = 0  # \u041e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439         self.count_positions = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439         self.balance = initial_balance  # \u0411\u0430\u043b\u0430\u043d\u0441 \u0432 USDT         self.coin_amount = 0  # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u043d\u0435\u0442         self.positions = []  # \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (timestamp, price, amount)         self.trading_history = []  # \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439         self.loc_max_price = None  # \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0446\u0435\u043d\u044b         self.trading_fee = trading_fee  # \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0437\u0430 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u044e          def update_strategy(self, grid_spread, position_size):         \"\"\"         \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.                  :param grid_spread: \u0428\u0430\u0433 \u0441\u0435\u0442\u043a\u0438 (\u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u0440\u043e\u0434\u0430\u0436\u0438).         :param position_size: \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0434\u0435\u043b\u043a\u0438.         \"\"\"         self.grid_spread = grid_spread         self.position_size = position_size          # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043f\u043e\u043a\u0443\u043f\u043e\u043a         for _ in range(2):             self.buy_position(self.initial_timestamp, self.initial_price)              def update_trading(self, timestamp, current_price):         \"\"\"         \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0446\u0435\u043d\u044b.                  :param timestamp: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f.         :param current_price: \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0446\u0435\u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430.         \"\"\"         if self.count_positions == 1 and (self.loc_max_price is None or current_price &gt; self.loc_max_price):             self.loc_max_price = current_price             return                  if self.count_positions == 1 and current_price &lt;= self.loc_max_price * (1 - 2 * self.grid_spread):             self.buy_position(timestamp, current_price)             self.loc_max_price = None         elif self.count_positions &gt; 1 and current_price &lt;= self.positions[-1][1] * (1 - self.grid_spread):             self.buy_position(timestamp, current_price)         elif current_price &gt;= self.positions[-1][1] * (1 + self.grid_spread):             self.sell_position(timestamp, current_price)      def buy_position(self, timestamp, price):         \"\"\"         \u0421\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u0430\u043a\u0442\u0438\u0432\u0430.                  :param timestamp: \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f \u0441\u0434\u0435\u043b\u043a\u0438.         :param price: \u0426\u0435\u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438.         \"\"\"         comission = self.position_size * self.trading_fee         cost = self.position_size + comission          if self.balance &gt;= cost:             btc_bought = self.position_size \/ price             self.count_positions += 1             self.balance -= cost             self.tot_comission += comission              self.coin_amount += btc_bought             self.positions.append((timestamp, price, btc_bought))             self.trading_history.append({                 'Action': 'BUY',                 'Time': timestamp,                 'Price': price,                 'Amount': btc_bought,                 'Balance USDT': self.balance,                 'Total_balance': self.balance + self.coin_amount * price,                 'Total BTC amount': self.coin_amount             })          def sell_position(self, timestamp, price):         \"\"\"         \u0421\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0434\u0430\u0436\u0443 \u0430\u043a\u0442\u0438\u0432\u0430.                  :param timestamp: \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\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-453133","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/453133","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=453133"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/453133\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=453133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=453133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=453133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}