green_fr: (Default)
[personal profile] green_fr
Я только что убил самый, наверное, невероятный баг за всю мою жизнь.

У нас рассчёты базируются на экономических сценариях, которые генерируются некоторой внешней программой (ESG). В какой-то момент мы поняли, что теряем много времени на повторные вызовы ESG — нам нужно 4 сценария для 4-х разных видов акций, которые (в нашей модели) отличаются друг от друга только множителем стандартного отклонения. И вместо того, чтобы 4 раза запускать ESG с одним «стандартным» портфелем акций, править множитель и генерировать сценарии, можно заранее заготовить 4 «наших» портфеля, а затем запускать ESG и генерировать всё сразу.

Сказано — сделано, хоть и не без побочных эффектов, из-за которых корреляция наших портфелей превратилась из 100% в 99,999999999%. Тестируем — результат отличается на 100M€ (при масштабе в 1000M€ это существенно).

Первая мысль — напортачили где-то, сценарии немного не такие. Проверяем — сценарии акций действительно совершенно другие (логично, генератор случайный), но все параметры (среднее, отклонение, взаимная корреляция) идентичны до 10-го знака после запятой.
Где-то месяц я бился, пытаясь понять, что происходит. И чем больше копался — тем меньше понимал. В том числе потому, что шеф (у меня очень классный шеф!) на коленке написал программку, которая использовала эти 4 «наших» портфеля, и получала вполне приличные значения.

Переломный момент наступил, когда я, играясь со смесью моих сценариев и сценариев шефа, вылетел в сотни миллиардов — заведомо неверный результат. И тут меня осеняет. У нас результат — это среднее произведения двух сильно коррелирующих переменных. Грубо говоря, если посчитать произведение средних, то получается 10E14, а если среднее произведения, то 10E8. А тут я со средним произведения получаю 10E11. Значит, где-то нарушается корреляция. Ещё день копал и, кажется, нашёл.

Проблема была в программистском best practice — если ты меняешь какой-то кусок кода, не бросайся сразу переписывать весь код, опробуй его сначала на маленьком периметре. В итоге моя программа генерировала часть сценариев с помощью одного исходного файла (где один, «стандартный» портфель), а часть — с помощью другого (где 4 «наших»). Они не были совершенно декоррелированы (иначе я бы получил свои 10E14), но и не на 100% коррелированы (см. выше ссылку про точность, которая превыше всего).

И всё это, чтобы выиграть немного времени на вычислениях. Ведь говорили же — работает? Не трогай, сынок. Ничего не трогай.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

green_fr: (Default)
green_fr

May 2025

S M T W T F S
    1 23
4 5 678910
11 12 1314 15 1617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2025 09:07 am
Powered by Dreamwidth Studios