August 9th, 2012

2017

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

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

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

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

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

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

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

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

Поездка в Лондон — IV (British Museum)

Перед отъездом зашли в British Museum.



На входе (вскормленный египетскими залами парижских музеев) мальчик смотрит на эту афишу и спрашивает:
— Папа, это тоже Тутанхамон?
Похоже, пора завязывать с Древним Египтом, переходим на другие темы.
Collapse )