green_fr (green_fr) wrote,
green_fr
green_fr

Categories:

Самый красивый баг

Я только что убил самый, наверное, невероятный баг за всю мою жизнь.

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

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

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

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

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

И всё это, чтобы выиграть немного времени на вычислениях. Ведь говорили же — работает? Не трогай, сынок. Ничего не трогай.
Tags: rabota
Subscribe

  • П.В. Маковецкий «Смотри в корень!»

    На днях наткнулся взглядом на старую книжку «Смотри в корень!» Маковецкого, взял с полки — и чуть ли не на едином дыхании снова её прочитал.…

  • 2020 год дома

    Вторая часть фотографий 2020 года: что было у нас дома. Купили игрушку на Новый год, Turing Tumble — интересный концепт, когда ты строишь очень…

  • Музеи 2019—2020

    Очень не хватает музеев, во Франции они до сих пор всё ещё закрыты. В какой-то момент задумался: насколько объективно снижение количества моих…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments