Блог им. 3Qu

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

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



















avatar
Anest, 
Это смотря у какого ИИ спрашивать
Не только у какого ИИ спрашивать, но и что спрашивать и как спрашивать. 

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


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

avatar
 В общем надо вначале с ИИ определиться, потом язык выбирать :)

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



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

avatar
Иван Портной, мнение ИИ может быть высосано из пальца и основано на эмпирический предположениях.
Вот что мне ответил 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)

Хотите:

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

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




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

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

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

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


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

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


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

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

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

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

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

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

avatar
Replikant_mih, 
это ещё beta или уже полноценная.

Python 3.14 was released on 7 October 2025.
avatar
Synthetic, Ага, видел, но в видео где чел обзор делал, одну из фичей про многопоточность он как-то по-хитрому собирал, в 3.14 её не было нативно, что-то про многопоточность было, а что-то по-хитрому собирал, так что я не уверен.
avatar
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.
avatar
Для маленьких программ, проще, скорее всего, отталкиваться от наличия готовых решений и библиотек. На python, должно быть, мульон примеров для работы с данными. В любом случае, скорость вычислений будет упираться в качество этих самых библиотек, самим вам/нам вряд ли захочется реализовывать их функционал.
avatar
Зачем вам комьюнити, документация, если есть ИИ? Вы попробуйте спросить в чате программистов хоть один вопрос по делу.

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

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

Прелесть ИИ что теперь можно даже на Алголе опять начать писать программы.
avatar
Спор бессмысленный. На чем человек умеет программировать, на том лучше и делать. Ели уперся в некие ограничения, тогда и надо менять язык программирования. Для обычного среднего человека питон, конечно, проще в освоении.
avatar
Фигачу на C# и мне норм
avatar
Stanislav Muhin, а почему должно быть не норм? )
Не норм начнется, когда вы начнете использовать сложный функционал, например, типа, ML — для C#  многого нет, даже относительно простого — придется делать самому, что почти нереально.
avatar
3Qu, 
для C#  многого нет, даже относительно простого
Относительно простое для C# многое есть.
avatar
Иван Портной, ИИ пишет, что многого нет — см. 2-я строчка таблицы. Лично не проверял, но больше доверяю ИИ, а не ИП.)
avatar
3Qu, 
Лично не проверял, но больше доверяю ИИ
Я проверял лично. Мне не надо доверять бездушному ИИ.)
avatar
Иван Портной, значит не то проверяли. Может вам ничего и не нужно, а потому и все есть.) И при чем здесь душа?
avatar
3Qu, 
значит не то проверяли. Может вам ничего и не нужно, а потому и все есть.)
Речь в моем комментарии шла об относительно простом для C#. Всё это действительно есть. Что-то сильно навороченное или относительно новое — это в Python. Впрочем, скажу по секрету, всё это можно сделать и в C#.

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

Но есть и другой вопрос: а оно надо?
Это же другой вопрос. Не надо — не делай.)
avatar
Иван Портной, большая часть библиотечного функционала, имеющегося в Питон, в С# полностью отсутствует. Это известно и без ИИ, но ИИ полностью подтвердил это, в т.ч. и отсутствие вполне конкретных библиотек.
Что касается эллиптических фильтров в Питоне — эт не вопрос, ничем не отличаются от прочих. Не вижу в них надобности, но это не мое дело.
avatar
3Qu,
большая часть библиотечного функционала, имеющегося в Питон, в С# полностью отсутствует.
Мы говорим про разные вещи.
1) Богаты ли библиотеки в Питоне? Да, богаты.
2) Есть ли возможность использовать в C# разнообразные библиотеки, в том числе написанные на других языках? Да, есть.
Так будет понятнее?)
avatar
Иван Портной, кто бы сомневался.) Однако, импорт функционала из Python в С# достаточно тягомотный процесс. + еще потянет на + 400-500 МБ на диске. По запуску фнкций Питон из С# тоже свои не сложности, но особеноости. А так, да, можно, не проблема.
avatar
3Qu, 
А так, да, можно, не проблема.
Золотые слова. Вы (при моём скромном участии) блестяще развенчали миф о незаменимости и превосходстве Python на ниве алготрейдинга.)

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

Python удобен для прототипирования несильно нагруженных проектов и выполнения поисковых работ. Ключевое слово здесь удобен. Пожалуй, трудно найти задачу, которую на C# было бы сильно сложнее выполнить, чем на Python.
avatar
Иван Портной, для ХФТ нужны С или С++ и биржевые сервисы, обычно недоступные широким массам. С# для ХФТ явно не тянет.
Для обычного трейдинга С#, если без сложных библиотек, уже избыточен.
Если подключить сложные библиотеки, быстродействие С# практически сравнивается с Питон ( модули библиотек Питон написаны на С/С++).
Чистый код Питон действительно медленней, чем С#, однако, учитывая скорость поступления данных от брокера или биржи обычному трейдеру, это несущественно, все успевает обработаться в любом случае.
Кроме того, задержка даже ±неск секунд при продолжительности сделок от нескольких минут уже никак не влияет на результаты трейдинга.
В общем, что лучше — дискуссия бессмысленна. В топике вопрос так даже не ставится, ответ очевиден — без разницы.
Если ставить вопрос — кто быстрее?, хотя это и не надо, то для простых систем — С#, для сложных — примерно одинаково.
А если вопрос: что удобней, то тоже очевидно, — Питон.
avatar
3Qu, 
А если вопрос: что удобней, то тоже очевидно, — Питон.
Совсем не очевидно.
Из обсуждения можно сделать некоторые предварительные итоги:

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

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

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

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

* высоконагруженными можно назвать торговые системы, одновременно торгующие большое количество инструментов с анализом потоков ордеров или стаканов.
avatar
Для подавляющего большинства стратегий — питон. Для тех самых оставшихся — сишные вставки в питоновский код
avatar
Что-то убогонькое в несколько сотен строк кода, наверное, можно хоть на чем сляпать. Типа взять раз в 5 минут свечу и что-то там дернуть при совпадении условий. У меня все тестовые страты (а потом, к слову, и промышленные) написаны на простом, быстром и удобно встраиваемом Lua (при том, что никакие свечи я не беру, на вход всегда принимается поток сделок)

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

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мс

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

Читайте на SMART-LAB:
Фото
Повышение рейтингов компаний в связи с падением цены акций
В связи с падением цены акций вырос потенциал в некоторых акциях, что делает их более привлекательными для инвесторов.
Фото
Акционеры Аэрофлота одобрили выплату дивидендов по итогам 2025 года
Сегодня состоялось годовое заседание Общего собрания акционеров ПАО «Аэрофлот». Акционеры утвердили выплату дивидендов по итогам 2025 года в...
Фото
RENI представляет Годовой отчет компании за 2025 год
Группа Ренессанс страхование (MOEX: RENI) опубликовала Годовой отчет для инвесторов за 2025 год. По сравнению с прошлогодним изданием отчет...
Фото
Длинные ОФЗ: сколько можно заработать, если ключевая ставка ЦБ РФ продолжит снижаться?
Длинные ОФЗ с начала текущего года не демонстрировали выраженного снижения по доходности несмотря на продолжение цикла понижения ключевой ставки...

теги блога 3Qu

....все тэги



UPDONW
Новый дизайн