PolyAnalyst: в погоне за призраком аналитика1

Копцик Сергей

НА ЧТО, СОБСТВЕННО, МЫ МОЖЕМ РАССЧИТЫВАТЬ?

    Посмотрим, стоит ли обольщаться, рассчитывая, что PolyAnalyst сам определит за вас <истинные> зависимости. Возьмем для анализа массив чисел, полученный в соответствии с формулой

    z = (x2 - 0,001y3)/(x + y + 1). (1)

    В исходном массиве значения x - элементы натурального ряда от 1 до 1000, y = 1000rand(x) - случайные числа из того же диапазона. Значения z можно наглядно себе представить в виде точек, группирующихся вблизи некоторой гладкой поверхности в трехмерном пространстве (нижняя вставка, рис. 1). В некотором смысле такой выбор точек для анализа является <издевательством> над пакетом. Зависимость z(x) (проекция трехмерной картинки на плоскость ZX, рис. 1) на глаз напоминает сильно зашумленную линейную зависимость, причем, очевидно, характерные частоты медленного монотонного изменения и случайного шума сильно различаются. Как и в жизни, случайная составляющая может рассматриваться как вклад некоторого <скрытого> параметра, в данном случае y. Вместе с тем, если подспудно иметь в виду анализ изменения цен какого-либо финансового инструмента, подобная зависимость отнюдь не является чем-либо из ряда вон выходящим: амплитуда шумовой составляющей, определяемой скрытым параметром y, имеет тот же порядок величины, что и амплитуда изменения долговременного тренда. Анализируемая зависимость в чем-то даже проще - промежуточные частоты характеризуются практически нулевой амплитудой.
    Подадим этот массив в блок анализа функциональных зависимостей. Просто наблюдая на экране монитора во <всплывшем> окне отчета, как меняются перебираемые пакетом функциональные зависимости, можно составить общее впечатление о работе пакета. Начав с простой линейной зависимости, PolyAnalyst станет постепенно усложнять функциональные зависимости: практически сразу он перейдет к рациональной дроби и начнет постепенно усложнять ее вид - показатели степени полиномов в числителе и знаменателе станут возрастать. Сначала мелькание функций будет быстрым, по мере улучшения описания данных (и усложнения функциональных зависимостей) время анализа функционального варианта будет заметно возрастать.
    <Попыхтев> какое-то время, Poly-Analyst нормально завершил анализ, обнаружив совпадающие наиболее значимую и наиболее точную зависимости

    z = (x2 - 0,115x + 0,0002xy - 3,26  10-12y3x - 0,001y3 + 0,038y)/(x + 1,0002y + 0,871). (2)

    Полученная функция, очевидно, отличается от исходной.
    Свидетельствуют ли различия разгаданной и загаданной функций о крахе Poly-Analyst? Конечно, нет. Просто этот пример высвечивает некоторые особенности машинного распознавания функциональных зависимостей и демонстрирует, как нам следует относиться к получаемым результатам. Этот пример, скорее, свидетельствует о крахе наивных надежд переложить всю тяжесть финансового анализа на <плечи> машины. Конечно, формально программа не требует от аналитика никакой априорной модели, зато критического отношения к синтезируемой модели, а значит, наличия априорных представлений об анализируемом явлении, еще как требует.
    Неразумно ожидать, что Poly-Analyst сам вскроет некие основополагающие закономерности финансового рынка. Разумнее относиться к получаемым результатам просто как к функциональной параметризации явления, зная, что решение любой задачи параметризации имеет, как правило, истинный и ложный наборы параметров, и не требуя от пакета PolyAnalyst выявления <истинных> закономерностей. В случае финансового анализа, когда фундаментальные закономерности либо не известны, либо возможность применения той или иной модели далеко не очевидна, или когда вопрос об определении фундаментальных закономерностей в силу каких-либо причин просто не ставится, т.е. когда внешний по отношению к решаемой задаче критерий истинности не известен (как в случае технического анализа), вопрос об истинности или ложности решения вообще не стоит. Возможно, единственное, за чем следует следить, - значимость предложенного решения, простота решения, достоверность прогноза в рамках имеющегося архивного материала.
    Посмотрим с этой точки зрения на полученную зависимость и убедимся, что она является, как мне кажется, хорошей рекламой PolyAnalyst. Прежде всего необходимо заметить, что на рис. 1 показаны обе зависимости - (1) и (2). Однако увидеть это вообще невозможно. Обратите внимание на масштаб верхней вставки рисунка, где в увеличенном масштабе показана разность исходной и синтезированной зависимостей для небольшого сегмента оси X. Эта разность меньше, чем характерные значения z, более чем на пять порядков! Представьте себе на секунду, что аналитики могли бы объяснять и предсказывать движение цен с подобной точностью - их племя вымерло бы или переродилось: все аналитики превратились бы в <ротшильдов>. Кроме того, посмотрим на величины коэффициентов в выражении (2) и упростим его (опустим члены, которые вносят небольшой вклад). О чудо, (2) превратилось в (1)! То есть фактически PolyAnalyst распознал исходную зависимость.

ОСОБЕННОСТИ ПРИМЕНЕНИЯ НА ФИНАНСОВЫХ РЫНКАХ

    Для работы в будущем модели, построенной на основании прошлого опыта, необходимо, чтобы рынок в течение достаточно длительного времени не претерпевал кардинальных изменений и чтобы происходящие на нем события имели приблизительные аналоги в прошлом. Известно, что некоторые нейронно-сетевые системы требуют для своего обучения данные по истории рынка за три-пять лет. При прогнозе предполагается, что в течение еще некоторого времени внутренние законы динамики рынка не будут существенно отличаться от тех, которые действовали во время обучения системы.
    Однако для российских финансовых рынков условия стационарности не выполняются, многие из них существуют всего два-три года. Не является стационарным и общий объем обращающихся на нем ценных бумаг (он постоянно и довольно значительно растет). Правила работы на этом рынке часто меняются, на них сильно влияет нестабильность политической ситуации. Отчасти именно относительно небольшой объем накопленных данных затрудняет продвижение на российский рынок западных пакетов класса Data Mining. Эти обстоятельства, а также низкая ликвидность российского фондового рынка, отсутствие развитой системы индексов, характеризующих отдельные рынки и экономику в целом, значительно затрудняют применение в России традиционных систем поддержки принятия решений по управлению портфелем ценных бумаг.
    Но эти же обстоятельства делают привлекательным использование пакета PolyAnalyst для построения эмпирических моделей рынка и настройки систем принятия решений в соответствии с вновь обнаруженными закономерностями. Именно сложность и изменчивость самой задачи влияния <параллельных> инструментов, <параллельных> рынков делают невозможным использование каких-то постоянных, жестких моделей типа используемых в техническом анализе индикаторов и требуют регулярного пересчета, переопределения моделей. Модели принципиально не могут быть зафиксированы как постоянный набор некоторых правил, это утверждение справедливо для любого, в том числе и развитого западного рынка.
    В ряде случаев для получения значимой модели время обучения системы должно быть небольшим, так как имеются медленные тренды самих закономерностей рынка. Проблема контроля значимости модели является универсальной. Нестабильность же российского рынка делает прозрачность используемых моделей, возможность их интерпретации пользователем не просто крайне желательной, но необходимой. То внимание, которое Poly-Analyst уделяет оценке значимости обнаруженных закономерностей и моделей, позволяет надеяться на получение частичных результатов даже в случае относительно небольшого объема данных. Опыт применения пакета PolyAnalyst на рынке ГКО/ОФЗ2 показывает, что модель необходимо пересчитывать раз в два-три месяца.
    В облаках
    Еще одна характерная черта финансовых данных - принципиально неустранимые и значительные случайные вклады в изменение цен исследуемых финансовых инструментов, размытые, слабо обусловленные зависимости. Это обстоятельство влечет за собой принципиальную сложность обнаружения неявных, скрытых закономерностей. Следует отметить, что вследствие этого системы Data Mining, ориентированные на поиск достаточно хорошо выраженных зависимостей, основное применение нашли не на финансовых рынках, анализ требует специфических методов работы.
    Для иллюстрации возьмем, например, два индекса - среднее геометрическое и композитный индекс, вычисляемый консультационным агентством <Соболев> для 21 наиболее ликвидной российской компании, и изменение (с октября 1995 г. по 8 декабря 1997 г.) котировальной цены РТС (в долл. США):

    Pcot = (Pbid + Pask)/2 (3)

    семи акций: Черногорнефти, РАО <ЕЭС России>, ГУМа, Иркутскэнерго, КамАЗа, Коминефти, ЛУКОЙЛа, где Pbid и Pask - максимальная предлагаемая цена покупки и минимальная цена продажи. Прервав через какое-то время работу программы, легко видеть направление, в котором PolyAnalyst ищет зависимость изменения котировальной цены Коминефти от остальных восьми параметров. Определенная наиболее значимая зависимость имеет вполне читаемый и интерпретируемый вид:

    P6cot = A/B, (4)
    где
    A = 4,82(subif3 + 0,85P5cotsubif4 + 203subif - 441 + 21,4P5cot2; (5)

    B = subif4 + 7,01168P5cotsubif - 8,85,subif = if(0,0016 < 1/P7cot и 1/P7cot < 0,0936, 1/P2cot, 13,62).

    Сомневаюсь, что подобного типа зависимости могут нести в себе какой-то фундаментальный, основополагающий смысл. Вместе с тем очевидно, что для прагматических целей, для целей технического анализа подобных функциональных зависимостей вполне достаточно.
    Из соотношений (4, 5) видно, что наиболее значимая зависимость цены акций Коминефти определяется только тремя акциями. Поскольку в наиболее точную зависимость входят только эти же самые акции и еще композитный индекс, анализ можно упростить, взяв за основу только эти акции и композитный индекс. Предоставив PolyAnalyst потрудиться точно такое же время, фактически удлиняем время анализа в четыре раза, поскольку число полей сократилось вдвое. Наиболее значимая зависимость по-прежнему определяется выражением (4), но при этом

    A = 0,508P5cot2subif2 + 0,574P5cot3subif - 0,418P5cotsubif2 - 0,501P5cotsubif - 0,479P5cot - 1,91subif + 2,52; (6)
    B = P5cot2subif - 1,38P5cotsubif - 0,000148P5cotsubif3 + 0,692;
    subif = if(0,877 < SobInd и SobInd < 1,873; 1; 1,33SobInd).

    Тем самым мы свели решение к уже вполне анализируемому виду - к зависимости цены акций Коминефти только от двух параметров: от цены акций КамАЗа и от композитного индекса. Понятно, что можно ожидать зависимости от индекса. Но почему Коминефть в анализируемой выборке зависит именно от КамАЗа, а не, скажем, от ГУМа? Это уже не ваш вопрос к PolyAnalyst, а вопрос PolyAnalyst к вам как аналитику.
    На рис. 2, а показана построенная PolyAnalyst зависимость рассчитанной по соотношениям (4, 6) цены от наблюдаемой. Характерная особенность зависимости - большой разброс точек, значительные их отклонения на графике от серой прямой, идущей по диагонали графика. Чем лучше модель описывает исходные значения, тем ближе к диагонали должны лежать точки на графике. Так, на аналогичном графике для модельной задачи (2) все точки идеально лежат на диагонали. Приведенное на рисунке <облако> характерно именно для финансовых данных. Поэтому, взяв первый раз в руки Poly-Analyst и получив подобную <зависимость>, не пугайтесь - это судьба: с подобными размытыми зависимостями вам, скорее всего, и придется иметь дело.
    Именно размытый характер зависимостей приводит к тому, что зачастую может оказаться достаточным описывать интересующие вас котировки линейными зависимостями. На рис. 2, b показана зависимость рассчитанных PolyAnalyst по линейной регрессии значений котировок только что рассмотренной задачи от наблюдаемых:

    P6cot = 0,57 + 1,75SobInd - 0,15P1cot + 0,048P2cot - 0,02P3cot + + 0,078P4cot + 0,46P5cot. (7)

    Сравнивая рис. 2, а и 2, b, легко видеть, что описание наблюдаемых котировок примерно одинаковое, хотя зависимости существенно разные. Этот пример еще раз показывает сложность и достаточную условность попыток придать содержание определяемым пакетом PolyAnalyst зависимостям.
    Погода на завтра
    Как оценить с помощью пакета PolyAnalyst изменение котировок акций в ближайшее время? Казалось бы, наиболее простой прием - рассчитать на основании имеющихся данных разность завтрашней и сегодняшней котировок и <натравить> PolyAnalyst на эту колонку. На рис. 3, а показана рассчитанная модулем множественной линейной регрессии <зависимость> для рассмотренной в предыдущем разделе задачи. Увы, рис. 3, a никак нельзя назвать зависимостью (напомним, точки должны лежать по диагонали). Ядро PolyAnalyst также не спасает ситуацию - расчетные точки лежат несколько более размазанно вдоль оси ординат, две-три удаленные выпадающие точки ложатся вблизи диагонали, но в целом - такая же горизонтальная <кишка>. Приходится признать, что <лобовая атака> терпит фиаско. По оценкам авторов программы, стандартная ошибка такого прогноза на развитых рынках составляет, как правило, 97% и только 3% вариации определяется детерминированными факторами.
    Точный численный прогноз движения цены - естественно, очень сложная задача. Необходима другая, более мягкая формулировка ее условий. Известно, что часто трейдеров интересует не столько абсолютное движение цены, сколько направление движения. Однако хорошо известно, что непонятый или неверно истолкованный детерминированный фактор внешне может проявляться как случайный. Задача прогноза еще раз подчеркивает, что на финансовых рынках, как ни в каком другом месте, важно разумно, естественным для проблемы образом ставить задачу, важно стремиться к максимальному снижению влияния случайных факторов. Вероятно, вместо исходных, <сырых> данных целесообразно использовать модифицированные каким-либо образом данные, например значения индикаторов. Для примера на рис. 3, b показана рассчитанная линейным модулем за последние 15 торговых дней зависимость, по сути, той же самой задачи, только вместо исходных <сырых> котировок подставлены значения скользящего среднего. Конечно, значимость зависимости, а значит, и достоверность прогноза не очень велики, но все же это уже зависимость.
    Индикаторы
    Пакет РolyAnalyst позволяет не <изобретать велосипед заново>, а двигаться от имеющегося уровня знания, и этим обстоятельством надо активно пользоваться. Пусть из опыта применения технического анализа известно, что в определенной фазе рынка тот или иной индикатор достаточно хорошо характеризует движение цены. Замечательно! Дайте пакету PolyAnalyst подсказку, введите рассчитанное значение индикатора в качестве одного из полей. Конечно, индикаторы зависят от исходных данных и в этом смысле не добавляют никакой новой информации в условия задачи.
    Хотя это и мало вероятно, но принципиально не исключено, что, <попыхтев> изрядное время, PolyAnalyst сам мог бы прийти к выводу, что введенный вами индикатор является как бы инвариантом задачи, что именно введенная вами комбинация исходных данных будет входить как один из членов в определенную им функциональную зависимость. Скорее всего, PolyAnalyst остановит свой выбор на какой-либо другой комбинации исходных параметров, принципиально, возможно, ничем не лучшей и не худшей по сравнению с предложенной вами. Но этот процесс займет много времени. Не бойтесь вводить в анализ избыточную информацию, если вы уверены в том, что она действительно отражает какие-то стороны исследуемого инструмента.
    Если у Вас море акций
    Наиболее простая и естественная форма организации фондовых данных, когда записям соответствует изменение цен во времени, а полям - акции разных компаний, точнее, один или несколько параметров, таких как цена открытия, закрытия, максимальная и минимальная цены, объем торгов, характеризующих каждую акцию. Если вы в силу каких-то причин хотите одновременно анализировать движение цен большого числа акций и при этом производительность вашего компьютера не является сдерживающим фактором, то, весьма возможно, что вам придется решать, как обойти ограничение, накладываемое PolyAnalyst на число полей (в сегодняшней версии - 1000 полей).
    Возможно другое решение: перегруппировать данные так, что одна запись будет содержать данные по одной акции за один торговый день. При этом мы как бы кладем рассмотренную выше матрицу данных на бок и сжимаем ее. Однако, если в первом случае PolyAnalyst может строить правила типа <если акции Microsoft упали в цене на 0,3%, а акции РАО <ЕЭС России> возросли на 0,5%, то:>, то теперь это будут правила вида <если акции, которые на протяжении последнего месяца росли не меньше чем на 0,01% в день, за последние два дня упали на 3%, то:> При этом вы систематизируете акции не по наименованиям компаний, а по их поведению на рынке, по их экономическим характеристикам. То есть одновременная работа с большим числом компаний - это просто вопрос другой постановки исходной задачи.
    Заоблачные дали
    Существует теория эффективного рынка. Сформулировать ее можно очень просто - мировой рынок эффективен, он учитывает в колебаниях цен всю доступную информацию. Из этого закона много следствий, и они очень важны.
    Цены выравниваются почти мгновенно и учитывают все, что к этому моменту известно. Из этого следует, что существует долгосрочный тренд, который определяется фундаментальными признаками, а краткосрочные колебания случайны и непредсказуемы. На эффективном рынке нет <печатных станков>, и, как следствие, любое действие равного рынка должно иметь равную доходность. Иначе рынок неэффективен, и на этом месте кто-то сможет сыграть. Однако моменты, места локально неэффективного рынка периодически возникают либо вследствие времени (рынок открылся и еще не насытился), либо рынок заведомо слишком рисковый, как сейчас в России, и все бумаги на нем недооценены.
    Поэтому очень многое построено на поиске таких точек неэффективности. Вследствие их наличия тут же возникает ток, и в настоящее время огромные силы аналитиков прикованы к поискам таких течений. Найти эти места возможно только на системах, обрабатывающих очень большой объем информации, для этого и предназначены системы Data Mining.

ЧТО МОЖЕТ НЕ ПОНРАВИТЬСЯ

    Трудно хулить монополиста, тем более если программа понравилась. Однако ряд практических моментов вы должны отчетливо уяснить.
    Прежде всего, простота программы достаточно условна. Работать с ней должен квалифицированный специалист, представляющий себе, пусть и не очень отчетливо, основы статистического анализа. Однако люди, ответственные за принятие решений в бизнесе и финансах, как правило, не являются специалистами в статистике и искусственном интеллекте. Программа PolyAnalyst - это в известном смысле идеология, способ мышления: ее использование невозможно без конкретного человека. Купив программу, вы обязательно вспомните лозунг <Кадры решают все>. Затраты на постановку задачи и сопровождение работы системы могут значительно превышать стоимость самого пакета программ. Минусы PolyAnalyst, впрочем, так же как и его плюсы, определяются в первую очередь тем, что программа имеет очень обширное пространство гипотез.
    Пакет PolyAnalyst весьма требователен к <железу>. Если программа вам понравится, не поскупитесь на высокопроизводительный компьютер/сервер. Составить представление об <аппетитах> программы вы можете уже по тому факту, что анализ рассмотренной простой трехпараметрической модельной задачи на моем Pentium 133 занял 25 мин. А зависимость времени анализа от числа полей для всех используемых методов не ниже, чем квадратичная.
    Программа задумана как универсальная, и в ней отсутствуют специализированные конверторы данных. Вы не сможете напрямую использовать данные многих ведущих поставщиков информации по движению цен фондового рынка, а будете вынуждены сами либо конвертировать их в CSV-формат, либо вводить их в SQL-базу данных. Впрочем, учитывая, что PolyAnalyst не предназначен для обработки данных в реальном времени, это ограничение не слишком обременительно.
    В программе отсутствует реальная трехмерная графика. PolyAnalyst позволяет отражать третье измерение только цветом, подобно тому, как это делается на географических картах. Вместе с тем возможность проектирования многомерного пространства входных и расчетных данных на пространство трех измерений, возможности <прокрутки> изображения, а также взгляда на трехмерный график с разных точек зрения, предоставляемые, например, некоторыми статистическими пакетами или пакетом Matlab, часто оказываются полезными при анализе многофакторных зависимостей и могли бы существенно усилить графические возможности программы.

КОМУ И ЗАЧЕМ НУЖЕН POLYANALYST

    В числе пользователей системы - банки, медицинские и правительственные учреждения, исследовательские организации России и нескольких развитых зарубежных стран. Сегодня пакет пользуется бо?льшим успехом за рубежом, чем у нас. Хочется верить, что в ближайшее время методы Data Mining займут достойное место и на российском рынке. Высокий профессионализм участников российского финансового и фондового рынков позволяет надеяться на это.
    Мне представляется, что базовый пакет PolyAnalyst может понравиться аналитическим отделам финансовых корпораций и специализированных консалтинговых фирм как один из программных пакетов для периодического анализа поступающей информации, удобный для выявления (модификации ранее обнаруженных) скрытых закономерностей и представления их в виде функциональных зависимостей, пригодных для анализа человеком. Наиболее эффективным представляется использование пакета PolyAnalyst совместно с другим(и) пакетом(ами) оперативного анализа для его (их) периодической настройки.
    Что же касается анонсированной версии PolyAnalyst LITE - этого нового для <Мегапьютер Интеллидженс> направления, то с утратой ядра системы программа, конечно, очень много теряет. Но с уменьшением цены на порядок она завоевывает совершенно другого, мелкокорпоративного пользователя и соответственно новое качество. Не хочется забегать вперед и заранее очерчивать круг возможных применений <студенческой> версии: поживем - увидим.

© ЗАО "Группа РЦБ".