Riskplayer, в моменте конечно влияет, только вот чудес в экономике не бывает и такие перекосы как выдал автор не могут существовать в силу противоречия базовой логике. Даже текущий курс это следствие огромных проблем в экономике, как огромный нарыв, который когда надорвется, мгновенно отрыгнет доллар в район 150+, а то и выше.
Работает в 7 медленнее. Оно и логично. Версия на numba — однопроходная, без выделений памяти на массивы, а это максимально эффективное использование L1 кэша. Векторизованнная версия имеет 4 векторных операции и 4 вспомогательных массива, под которые выделяется память. Даже если некоторые из 4 векторных операций используют simd, то использование лишних массивов и несколько проходов убивают производительность. Ну и сильно сомневаюсь, что функция np.maximum.accumulate имеет simd реализацию, т.к. по своей природе алгоритм последовательный. Сорри за занудство:)
Riskplayer, ну да, лучше использовать numpy где можно, оно там под капотом активно использует simd, но иногда numpy недостаточно. Это просто пример примитивный, а в реальности может быть какая-нибудь стейт машина, которая работает над несколькими массивами.
Riskplayer, Конкретно в этом примере цикл не параллелится, потому что будет гонка, но да, некоторые циклы можно параллелить. Если нужен массовый параллелизм, то лучше использовать taichi с бэкендом cuda или vulkan.
возможно вы правы, но это уже вне сферы моего интереса.
Riskplayer, посмотрел, на chatGPT у них все построено, особых результатов их стартегии не дадут, теорией и определением риск-профиля все ограничится
school.moex.com/courses/ii-na-finansovom-rynke
def vectorized(initial_cash, cashes):
balances = np.concatenate([[initial_cash], cashes])
cumulative_max = np.maximum.accumulate(balances)
drawdowns = (cumulative_max — balances) / cumulative_max
return np.max(drawdowns)
Работает в 7 медленнее. Оно и логично. Версия на numba — однопроходная, без выделений памяти на массивы, а это максимально эффективное использование L1 кэша. Векторизованнная версия имеет 4 векторных операции и 4 вспомогательных массива, под которые выделяется память. Даже если некоторые из 4 векторных операций используют simd, то использование лишних массивов и несколько проходов убивают производительность. Ну и сильно сомневаюсь, что функция np.maximum.accumulate имеет simd реализацию, т.к. по своей природе алгоритм последовательный. Сорри за занудство:)