3Qu
3Qu личный блог
09 октября 2025, 01:05

Сравнение C# и Python для построения торговых систем.

Для построения и отладки алгоритма, Python гораздо удобней, об этом даже и спорить не надо. Я выбрал Python не только для этого, но и для продакшн, т.е. для построения рабочей системы.
Многие мне говорили, что Python медленный, что все плохо и т.д. Понятно, что на С++ будет быстрее, но ты еще попробуй реализуй на С++ то, что на Python делается с помощью уже готовых и заведомо рабочих модулей. Потому будем сравнивать  Python и С#, т.к. любителей С# тоже достаточно.
Я и раньше говорил, что если не рассматривать простейшие программы, скорости Python и С#, в общем, сравнимы. Но кто я такой, чтобы вы с этим соглашались.))
Решил этот вопрос задать ИИ. Беседа была достаточно продолжительной, касалась нескольких аспектов сравнения, по большинству из которых Python в заметном отрыве от С#.
Приведу итоговую таблицу сравнения, составленную ИИ по моей просьбе:
Сравнение C# и Python для построения торговых систем.
Думаю, комментировать здесь нечего.
57 Комментариев
  • Anest
    09 октября 2025, 01:24
    Это смотря у какого ИИ спрашивать  



















    • Иван Портной
      09 октября 2025, 03:29
      Anest, 
      Это смотря у какого ИИ спрашивать
      Не только у какого ИИ спрашивать, но и что спрашивать и как спрашивать. 

      Вот ответ ИИ на простой промпт о сравнении двух языков для целей алготрейдинга:


      Вот уточнение ответа с учетом некоторых обстоятельств:
      • Beach Bunny
        09 октября 2025, 04:54
        Иван Портной, насчет OsEngine эт ты типа пошутил?
        Там только чтобы в их меню и опциях в программе разобраться надо пару недель.
        • Иван Портной
          09 октября 2025, 05:16
          Beach Bunny, 
          Там только чтобы в их меню и опциях в программе разобраться надо пару недель.
          Добавьте сюда время на изучения C#, а также освоение чтения и письма, вообще получаются десятилетия.))
          • Beach Bunny
            09 октября 2025, 05:41
            Иван Портной, не обязательно в том же Wealth-Lab 6 все сделано гораздо проще и разобраться с простыми вещами можно за 1 день. Но скорость тестирования там так себе если не использовать дополнительные модули Генетического поиска или Монте-Карло или других
            • Иван Портной
              09 октября 2025, 05:54
              Beach Bunny,
              Wealth-Lab 6
              Напомню, что автор топика сделал акцент на мнение ИИ. Не будем нарушать здешнюю традицию:)

  • Anest
    09 октября 2025, 01:26
     В общем надо вначале с ИИ определиться, потом язык выбирать :)

    По мне так пофигу какой язык, главное, чтобы торговые системы робастые и прибыльные были.Всё остальное информационная шелуха.
  • GMT Capital
    09 октября 2025, 02:30
    Так на Питоне что-то типа Нумбы можно использовать, будет, как обещал ЧатЖПТ, скорость как в С++ почти.
    • Beach Bunny
      09 октября 2025, 02:43
      GMT Capital, вот нафига тебе скорость то?
      HFT ты все равно торговать не будешь, потому как это дорохо.
      А для торговли на 5мин и выше, абсолютно пофигу что использовать
      • GMT Capital
        09 октября 2025, 10:48
        Beach Bunny, мне скорость для тестов нужна (чем скорее, тем больше идей смогу проверить), а не для HFT.
  • Иван Портной
    09 октября 2025, 03:49
    Я и раньше говорил, что если не рассматривать простейшие программы, скорости Python и С#, в общем, сравнимы. Но кто я такой, чтобы вы с этим согласились.))
    3Qu, с вами не поспоришь.))
    Действительно, зачем соглашаться, если можно спросить ИИ:



    • Beach Bunny
      09 октября 2025, 04:58
      Иван Портной, врет твой робот, в Backtesting.py тестирование побыстрее будет чем в OsEngine. И еще в Backtesting.py есть перебор параметров типа градиентного спуска с помощью библиотеки SAMBO sambo-optimization.github.io/
      • Иван Портной
        09 октября 2025, 05:17
        Beach Bunny, 
        врет твой робот
        Это не мой робот, а мнение ИИ.) 

        • Beach Bunny
          09 октября 2025, 05:38
          Иван Портной, мнение ИИ может быть высосано из пальца и основано на эмпирический предположениях.
          Вот что мне ответил Claude 4.5 когда я его прижал к стенке:
          Откуда ты взял данные по производительнсти OsEngine
          ------

          Отличный вопрос! Признаюсь честно — я не проводил прямых бенчмарков OsEngine лично, и мои цифры были оценочными, основанными на общих характеристиках производительности C# vs Python.

          📊 Откуда брались данные:

          1. Общие принципы производительности:

          • C# как компилируемый язык с JIT обычно в 5-50 раз быстрее чистого Python
          • Но это теоретические оценки, не конкретные тесты OsEngine

          2. Проблема с моими утверждениями:

          • ❌ Я не имею доступа к реальным бенчмаркам OsEngine
          • ❌ Производительность сильно зависит от реализации
          • ❌ OsEngine может иметь свои узкие места (UI, архитектура)
          • ❌ VectorBT очень оптимизирован, может быть быстрее плохого C# кода
          💡 Честный ответ:

          Реальная производительность зависит от:

          1. Типа стратегии (простая MA vs сложные вычисления)
          2. Объема данных (минутки vs тики)
          3. Качества кода (плохой C# может быть медленнее хорошего Python)
          4. Железа (CPU, RAM)

          Хотите:

          • Провести реальный бенчмарк на вашем железе?
          • Посмотреть структуру вашего проекта для оптимизации?
          • Обсудить конкретные требования к производительности?

          Извините за необоснованные цифры! В следующий раз буду более осторожен с конкретными числами без реальных тестов. 🙏




        • Beach Bunny
          09 октября 2025, 05:36
          Иван Портной, 
          поэтому для нормально сравнения надо брать простейшую стратегию на пересечения двух MA, тестировать на всех движках и сравнивать реальные цифры.
        • Beach Bunny
          09 октября 2025, 05:50
          Иван Портной, в OsEngine до сих пор нет нормального тестирования по фьючерсам, тестирование по склейке — это в общем почти мусор
          Но это делается в Wealt-Lab 6 путем добавление 20-30 строк в код стратегии.
          Так же можно реализовать это в Backtesting.py — там больше править в самом коде библиотеки, но делается один раз и потом можно использовать для любых стратегий.
          • Тренд
            09 октября 2025, 06:34
            Beach Bunny, почему мусор? Если, например есть 100 сделок в год, среди которых всего 4 сделки, которые попали на склейку (а может вообще вне сделок было). Причем эти 4 сделки — бабка надвое сказала — две в случайный плюс, две в случайный минус. 
            Понятно, что лучше без склеек, но насколько сильно такие склейки влияют на мусорность тестов?
    • Beach Bunny
      09 октября 2025, 05:42
      Иван Портной, да еще есть VectorBT vectorbt.dev/  тоже на Python
      векторный движок и скорость тестирования там быстрее чем на C++
  • Alex Craft
    09 октября 2025, 08:34
    Сильно зависит от задачи. Если это скрипт который подключается к адаптеру брокера — безразлично на чем, хоть на экселе, это простая задача в любом случае (создание саммого алгоритма сложная, его же перевод в любой язык задача простая).

    Если же нужно собирать различные данные, то все сильно меняется, 90% сложности будет именно сбор и обработка данных, сам алгоритм будет мелоч. И здесь C# с типами и т.п. проверками будет лучше. Сделать на питоне (да и вообще на любом нетипизированнном языке) сбор данных из множества источников, со сложными схемами данных, будет сложнее.
  • Александр Исаев
    09 октября 2025, 10:14
    Чо с с решеткой?
  • Андрей
    09 октября 2025, 10:22
    По мне C# гораздо лучше, чем путхон.

    C#, особенно начиная с .NET 8 работает не сильно отставая от нативного кода написанного на C (даже не на C++, а на чистом C).
    У C# есть строгая типизация, что очень хорошо для работы с деньгами.
    У C# есть такая штука, как структуры, чего нет на путхоне, что позволяет более эффективно использовать ресурсы при работе с небольшими структурами данных, которые не имеют указателей внутри. При грамотном подходе можно получить алгоритмы, которые работают лишь на 20% медленнее аналогичного кода на чистом C.
    JIT компилятор .NET умеет использовать SIMD инструкции в математических расчётах, что существенно повышает скорость вычислений.
    • Eridanoy
      09 октября 2025, 14:46
      Андрей, почему даже? С++ при определённых оптимизациях может быстрее С исполняться причём существенно.
      • Андрей
        09 октября 2025, 15:09
        Eridanoy,

        причём существенно.


        Вот «существенно» лишь в отдельных специфических ситуациях, и в большинстве случаев объясняется тем, что под C++ использовали алгоритм оптимизированный скорость, а под C — неоптимизированный.
        • Eridanoy
          09 октября 2025, 15:23
          Андрей, не оптимизированный потому что в ряде случаев компилятор код на плюсах может инлайнить, а на С нет, так это же не специально делается, это особенности языка.
          • Андрей
            09 октября 2025, 15:51
            Eridanoy, 

            не оптимизированный потому что в ряде случаев компилятор код на плюсах может инлайнить


            Я не про это говорю. Я говорю про то, что именно алгоритм под С берётся не оптимизированный.

            Например, под C++ берут std::vector, который помимо длины массива хранит ещё и количество ячек, под которое выделена память, за счёт чего он заточен на минимизацию выделения и высвобожднния памяти при изменении длины массива, а под C берут простой массив, представленный указателем и управляемый через malloc и free, и для которого не сделано оптимизации на уменьшение выделений и высвобождений памяти.

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

            В итоге из-за того, что C++ программисты чрезмерно увлекаются модификатором типа forced inline, разработчики компиляторов C++ решили, что forced inline будет игнорироваться, если он в коде проекта встречается слишком часто.
            • Eridanoy
              09 октября 2025, 16:22
              Андрей, не проблема, реализуйте такой же алгоритм выделения памяти на С, речь не об этом, а о том что в ряде случаев оптимизации на плюсах не получится реализовать на чистом С. Кстати проблему же с кэшем всё таки решили, причём правильно — такими оптимизациями пусть компилятор занимается.
              Просто ваше даже создаёт впечатление что плюсы медленные, но там разница не большая, а как я указал бывает что плюсы и выигрывают.
  • Replikant_mih
    09 октября 2025, 11:48

    Python на порядок-два медленнее в базовых сценариях. Не всё можно обернуть в быстрые библиотеки, если нужно итерирование — скорее всего код будет сильно медленнее C#. Например, бэктестер, если нужен событийный, итерационный — будет медленно, хотя векторный да, можно сделать быстрым.

    В остальном Python хорош. В самой свежей версии нормальную многопоточность подвезли, я правда так и не понял, это ещё beta или уже полноценная.

    • Synthetic
      09 октября 2025, 12:49
      Replikant_mih, 
      это ещё beta или уже полноценная.

      Python 3.14 was released on 7 October 2025.
      • Replikant_mih
        09 октября 2025, 12:53
        Synthetic, Ага, видел, но в видео где чел обзор делал, одну из фичей про многопоточность он как-то по-хитрому собирал, в 3.14 её не было нативно, что-то про многопоточность было, а что-то по-хитрому собирал, так что я не уверен.
        • Synthetic
          09 октября 2025, 13:31
          Replikant_mih, 
          The official macOS and Windows release binaries now include an experimental just-in-time (JIT) compiler. Although it is not recommended for production use, it can be tested by setting PYTHON_JIT=1 as an environment variable.
  • Qusco
    09 октября 2025, 12:39
    Для маленьких программ, проще, скорее всего, отталкиваться от наличия готовых решений и библиотек. На python, должно быть, мульон примеров для работы с данными. В любом случае, скорость вычислений будет упираться в качество этих самых библиотек, самим вам/нам вряд ли захочется реализовывать их функционал.
  • Просто трейдер
    09 октября 2025, 12:43
    Зачем вам комьюнити, документация, если есть ИИ? Вы попробуйте спросить в чате программистов хоть один вопрос по делу.

    Что такое поддержка? C# поддерживает Майкрософт. А Питон какая компания?

    Ерунда, а не советы. Так язык не выбирают.

    Прелесть ИИ что теперь можно даже на Алголе опять начать писать программы.
  • Riskplayer
    09 октября 2025, 12:46
    Спор бессмысленный. На чем человек умеет программировать, на том лучше и делать. Ели уперся в некие ограничения, тогда и надо менять язык программирования. Для обычного среднего человека питон, конечно, проще в освоении.
  • Stanislav Muhin
    09 октября 2025, 14:36
    Фигачу на C# и мне норм
      • Иван Портной
        09 октября 2025, 22:47
        3Qu, 
        для C#  многого нет, даже относительно простого
        Относительно простое для C# многое есть.
          • Иван Портной
            10 октября 2025, 01:32
            3Qu, 
            Лично не проверял, но больше доверяю ИИ
            Я проверял лично. Мне не надо доверять бездушному ИИ.)
              • Иван Портной
                10 октября 2025, 02:50
                3Qu, 
                значит не то проверяли. Может вам ничего и не нужно, а потому и все есть.)
                Речь в моем комментарии шла об относительно простом для C#. Всё это действительно есть. Что-то сильно навороченное или относительно новое — это в Python. Впрочем, скажу по секрету, всё это можно сделать и в C#.

                И при чем здесь душа?
                ИИ всё равно. Что спросите, то и ответит. Будете настаивать на своём, ИИ согласится с вами, да еще и прощения попросит. Бездушная машина.))
                Извините за необоснованные цифры! В следующий раз буду более осторожен с конкретными числами без реальных тестов.
                  • Иван Портной
                    10 октября 2025, 04:17
                    3Qu,
                    Вопрос только, кто это «все» будет делать? Вы сами? Ну, ну ) Я бы предпочел проверенные решения этого «всего».
                    Я и говорю про проверенные решения. Не самому же кодить.)
                    Например, эллипсы. Помните?
                      • Иван Портной
                        10 октября 2025, 04:14
                        3Qu, 
                        Эллиптические функции имеются в виду?
                        Зачем функции, сразу фильтры. С функциями вы еще намучаетесь, пока до фильтров доберетесь.

                        Но есть и другой вопрос: а оно надо?
                        Это же другой вопрос. Не надо — не делай.)
                          • Иван Портной
                            10 октября 2025, 04:31
                            3Qu,
                            большая часть библиотечного функционала, имеющегося в Питон, в С# полностью отсутствует.
                            Мы говорим про разные вещи.
                            1) Богаты ли библиотеки в Питоне? Да, богаты.
                            2) Есть ли возможность использовать в C# разнообразные библиотеки, в том числе написанные на других языках? Да, есть.
                            Так будет понятнее?)
                              • Иван Портной
                                10 октября 2025, 23:12
                                3Qu, 
                                А так, да, можно, не проблема.
                                Золотые слова. Вы (при моём скромном участии) блестяще развенчали миф о незаменимости и превосходстве Python на ниве алготрейдинга.)

                                Действительно, C# сочетает в себе мощь и скорость компилируемого языка и гибкости при использовании стороннего кода. C# удобен для многопараметрической оптимизации на большой истории и построения сильно нагруженных торговых систем. 

                                Python удобен для прототипирования несильно нагруженных проектов и выполнения поисковых работ. Ключевое слово здесь удобен. Пожалуй, трудно найти задачу, которую на C# было бы сильно сложнее выполнить, чем на Python.
                                  • Иван Портной
                                    11 октября 2025, 15:46
                                    3Qu, 
                                    А если вопрос: что удобней, то тоже очевидно, — Питон.
                                    Совсем не очевидно.
                                    Из обсуждения можно сделать некоторые предварительные итоги:

                                    1) Многопараметрическая оптимизация на больших объемах данных:
                                    — на C# доступна нативно;
                                    — на Python доступна при использовании специальных библиотек и приемов.

                                    2) Глубокий анализ данных (ML и пр.):
                                    - на C# доступен при использовании специальных библиотек и приемов;
                                    - на Python доступен нативно.

                                    3) Эксплуатация высоконагруженных* торговых систем:
                                    - на C# доступна нативно;
                                    - на Python недоступна или требуются специальные библиотеки и приемы.

                                    Если не заниматься глубоким анализом данных (ML и пр.), то выбор однозначен — C#. Если хочется больше науки, чем торговли, то можно использовать Python. Как-то так.)

                                    * высоконагруженными можно назвать торговые системы, одновременно торгующие большое количество инструментов с анализом потоков ордеров или стаканов.
  • Ярослав
    09 октября 2025, 17:40
    Для подавляющего большинства стратегий — питон. Для тех самых оставшихся — сишные вставки в питоновский код
  • PSH
    09 октября 2025, 23:06
    Что-то убогонькое в несколько сотен строк кода, наверное, можно хоть на чем сляпать. Типа взять раз в 5 минут свечу и что-то там дернуть при совпадении условий. У меня все тестовые страты (а потом, к слову, и промышленные) написаны на простом, быстром и удобно встраиваемом Lua (при том, что никакие свечи я не беру, на вход всегда принимается поток сделок)

    Но когда мы говорим о «торговой системе», убогоньким не отделаться. Нам надо будет ордеринг. Нам надо будет общаться с брокером и / или биржей в режиме прямого доступа, а это всегда асинхронный обмен. Нам надо будет куда-то постоянно что-то писать. Нам надо будет защиту от сбоев. Все это нам надо будет в режиме MultiThreading со всеми вытекающими отсюда геморроями, иначе нас просто зальет при каких-то резких движениях. И еще дохрена чего нам надо будет, что на пайтоне писать, прямо скажем, странно (и сомневаюсь, что вообще возможно в полном объеме). Пайтон хорош, если вы всю бизнес-логику запихали в БД, наплевав на последствия такого решения, и над ней крутите худенькую надстроечку для общения с фронтами
      • PSH
        10 октября 2025, 00:36

        3Qu, 100мс дискретность? Это что за подключение такое :). Даже почивший в бозе ITInvest со своим кривущим SmartCOM давал задержку миллисекунд 10, если мне память не изменяет.

        Ну и по поводу «даже Lua» я бы не стал так отмахиваться, вот пример из сегдняшнего:

        [TRACE][STRMGR] 2025.10.09 14:26:17.9227 Prod: RTS-12.25_FT: время на исполнение: 00:00:00.0012286
        [TRACE][STRMGR] 2025.10.09 14:26:17.9227 Prod: RTS-12.25_FT: результат: 1
        [TRACE][ORDMGR] 2025.10.09 14:26:17.9227 StratMgrSignalHandler: ticker = RIZ5, tsrc = AddTick, price = 101630, Signal = 1, Size = 1, regime = Trade
        [TRACE][TRQ_CONN] 2025.10.09 14:26:17.9997 PlaceOrder: Выставление заявки: result = <result success=«true» transactionid=«38205942»/>

        Это не холостой прогон, а именно сгенерированный сигнал и выставленная заявка. Видно, что все задержки — сетевые и на стороне брокера, ~70мс прошло от отправки заявки на сервер брокера до его ответа о том, что заявка размещена, обработка же Lua-частью от получения очередной сделки из ленты до генерации сигнала в сторону ордеринга заняла 1.2мс

          • PSH
            10 октября 2025, 00:06
            3Qu, это одно и то же. Если у нас дискретность 100мс, то и максимальная задержка столько же
  • PSH
    09 октября 2025, 23:16
    Подход «Python лучше, потому что на все готовое» вообще отдает каким-то лютым дельфизмом :). Это там ответ на любую задачу всегда был «надо искать компонент» :). Не сказать, что это плохой подход, но среды все-таки лучше сравнивать не только по этому признаку (этот вообще не основной, так, для удобства)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн