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% коррелированы (см. выше ссылку про точность, которая превыше всего).

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

Date: 2012-08-10 07:34 am (UTC)
From: [identity profile] agilebotanist.livejournal.com
Интересные у вас задачи стоят. Прямо по нашему курсу рынков ценных бумаг. Куда слать свой CV?

Date: 2012-08-10 08:04 am (UTC)
From: [identity profile] green-fr.livejournal.com
В нашу команду, к сожалению, набор временно прекращён, я уже пытался :-)

Но в принципе, это называется "актуарий", во всех страховых компаниях такие должности есть. Я очень обрадовался, когда узнал о существовании этой профессии.

Теоретически, это должно быть и в банках, инвестиционных фондах и т.п. (но только с финансами, в страховке дополнительно есть куча своих интересных задач), наверное, это то, что там называется "квант", но я не очень хорошо знаю банковскую терминологию.

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:25 pm
Powered by Dreamwidth Studios