Использование данных о фондовом рынке

Алгоритм NMF может работать не только с дискретными данными, например счетчиками слов, но и с числовыми. В этом разделе мы покажем, как применить его к объему торгов на рынке акций США, воспользовавшись данными с сайта Yahoo! Finance. Возможно, что в результате анализа нам удастся обнаружить паттерны, определяющие важность торговых сессий, или понять, от каких факторов зависит объем торгов различными акциями.

Финансовые рынки считаются идеальным примером коллективного разума, поскольку для них характерно большое количество участников, которые ведут себя независимо, пользуются различной информацией, проявляют различные предпочтения и вырабатывают небольшое число результатов, например цену и объем. Как выяснилось, отдельному человеку очень трудно сравняться в точности предсказания будущих цен с коллективным разумом. Существует немало научных работ на тему о том, почему группам людей дается лучше устанавливать цены на финансовом рынке, чем любому индивидууму.

Что такое объем торгов

Объем торгов по конкретной акции – это количество сделок купли/ продажи по ней за некоторый период времени, обычно за день. На рис. 10.7 показан график торгов акциями компании Yahoo!, за которой закреплен символ YHOO. Кривая в верхней части – это цена закрытия, то есть цена последней сделки за день. На столбчатой диаграмме внизу показан объем торгов.

Бросается в глаза, что объем больше в те дни, когда цена акций сильнее всего изменялась. Такое часто бывает, когда компания делает какое-то заявление или публикует результаты финансовой деятельности. Пики могут возникать также из-за появления каких-то новостей о компании или индустрии в целом. В отсутствие внешних событий объем торгов обычно, хотя и не всегда, остается постоянным.

В этом разделе мы рассмотрим временные ряды объема торгов акциями нескольких компаний. Это даст нам возможность поискать паттерны, затрагивающие сразу несколько акций, или события, оказавшиеся настолько важными, что стали отдельными признаками. Мы используем объем торгов, а не цену закрытия, поскольку алгоритм NMF пытается искать положительные признаки, которые можно складывать; цены же часто реагируют на внешние события снижением, а NMF не умеет выделять отрицательные признаки. Напротив, моделировать объем торгов проще, так как имеется базовый уровень, который может лишь увеличиваться в ответ на внешние сигналы, поэтому пригоден для построения положительных матриц.

Рис. 10.7. График изменения цены и объема торгов акциями одной компании

Загрузка данных с сайта Yahoo! Finance

Yahoo! Finance – отличный ресурс для получения разного рода финансовых данных, в том числе цен на акции, опционов, курсов валют и процентных ставок по облигациям. Кроме того, он позволяет загружать исторические данные об объемах торгов и ценах в удобном для обработки формате CSV. Обратившись к URL вида http://ichart.finance.yahoo. com/table.csv?s=YHOO&d=11&e=26&f=2006&g=d&a=3&b=12&c=19 96&ignore=.csv, вы получите для указанной акции список данных в формате CSV, разбитый по дням. Первые строки списка выглядят примерно так:

Date,Open,High,Low,Close,Volume,Ad]. Close*

22

Dec

-06

25

67

25

88

25

45

25

55,14666100,25

55

21

Dec

-06

25

71

25

75

25

13

25

48,27050600,25

48

20

Dec

-06

26

24

26

31

25

54

25

.59,24905600,25

59

19-

Dec

-06

26

05

26

50

25

91

26

.41,18973800,26

41

18

Dec

-06

26

89

26

97

26

07

26

30,19431200,26

30

В каждой строке представлены дата, цена открытия и закрытия, наибольшая и наименьшая цена, объем торгов и скорректированная цена закрытия. В скорректированной цене учтено, что акции могут дробиться или по ним могут выплачиваться дивиденды. Она позволяет вычислить, сколько у вас было бы денег, если бы вы владели данной акцией в промежутке между двумя датами.

Для рассматриваемого примера мы загрузим данные об объеме торгов по нескольким акциям. Создайте новый файл stockvolume.py и включите в него приведенный ниже код, который загружает файлы в формате CSV для заданного списка символов и сохраняет их в словаре. Кроме того, запоминается, по какому символу количество дней в истории минимально. Это число мы затем используем в качестве вертикальной размерности матрицы наблюдений: import nmf import urllib2 from numpy import *

tickers=[‘YHOO’,’AVP’,’BIIB’,’BP’,’CL’,’CVX’,

‘DNA’,’EXPE’,’GOOG’,’PG’,’XOM’,’AMGN’]

shortest=300

prices={}

dates=None

for t in tickers:

#   Открыть URL

rows=urllib2.urlopen(‘http://ichart.finance.yahoo.com/table.csv?’+\ ‘s=5%s&d=11&e=26&f=2006&g=d&a=3&b=12&c=1996’5%t +\ ‘&ignore=.csv’).readlines( )

#   Выделить из каждой строки поле объема торгов

prices[t]=[float(r.split(‘,’)[5]) for r in rows[1:] if r.strip( )!=”]

if len(prices[t])<shortest: shortest=len(prices[t])

if not dates:

dates=[r.split(‘,’)[0] for r in rows[1:] if r.strip( )!=”] Здесь для каждого символа акции создается URL и из него загружаются данные. Затем каждая строка разбивается по запятым и из получившегося списка берется пятый элемент – объем торгов в виде числа с плавающей точкой.

Подготовка матрицы

На следующем шаге мы должны преобразовать эти данные в матрицу наблюдений, которую можно будет передать алгоритму NMF. Для этого достаточно создать список, каждый элемент которого является списком, содержащим данные об объеме торгов всеми акциями за один день. Рассмотрим пример:

[[4453500.0, 842400.0, 1396100.0, 1883100.0, 1281900.0,…] [5000100.0, 1486900.0, 3317500.0, 2966700.0, 1941200.0,… [5222500.0, 1383100.0, 3421500.0, 2885300.0, 1994900.0,… [6028700.0, 1477000.0, 8178200.0, 2919600.0, 2061000.0,…] … ]

Согласно этому списку в последний день торговалось 4453 500 акций AMGN, 842 000 акций AVP и т. д. В предыдущий день объем составил соответственно 5000 100 и 1486 900 акций. Сравните с примером, относящимся к новостям; подставьте вместо новостей дни, вместо слов – символы акций, а вместо счетчиков слов – объемы торгов. Матрицу легко построить с помощью трансформации списков. Внутренний цикл перебирает список символов, а внешний – список наблюдений (дней). Добавьте следующий код в файл stockvolume.py: l1=[[prices[tickers[i]][]]

for i in range(len(tickers))] for j in range(shortest)]

Прогон алгоритма NMF

Осталось лишь вызвать функцию factorize из модуля NMF. Придется задать количество искомых признаков; для небольшого набора акций будет достаточно четырех-пяти. Добавьте в файл stockvolume.py такой код:

w,h= nmf.factorize(matrix(l1),pc=5)

print h print w

Теперь запустите из командной строки следующую команду:

$ python stockvolume.py Матрицы, которые она выведет, представляют веса и признаки. Каждая строка в матрице признаков соответствует одному признаку, который представляет собой совокупность объемов торгов по акциям. В сочетании с другими признаками его можно использовать для реконструкции данных об объеме торгов за текущий день. Каждая строка в матрице весов представляет один день, а значения показывают, в какой мере каждый из выделенных признаков применим к этому дню.

Вывод результатов

Понятно, что интерпретировать сами матрицы трудно, поэтому нужно найти более удобный способ вывода признаков. Хотелось бы видеть, какой вклад вносит объем торгов по каждой акции в каждый признак, а также даты, наиболее тесно связанные с признаками. Добавьте в файл stockvolume.py следующий код:

# Цикл по всем признакам for i in range(shape(h)[0]): print "Признак %d" %i

# Получить верхние 10 акций для этого признака ol=[(h[i,]],tickers[]]) for j in range(shape(h)[1])] ol.sort( ) ol.reverse( )

for j in range(12):

print ol[]] print

# Показать верхние 10 дат для этого признака porder=[(w[d,i],d) for d in range(300)] porder.sort( ) porder.reverse( )

print [(p[0],dates[p[1]]) for p in porder[0:3]] print

Поскольку текста будет много, имеет смысл перенаправить вывод в файл. Введите такую команду:

$ python stockvolume.py > stockfeatures.txt

Теперь в файле stockfeatures.txt находится список признаков с указанием того, каким акциям они наиболее релевантны и в какие дни проявлялись наиболее отчетливо. Вот пример, выбранный из файла потому, что он имеет очень высокий вес для данной акции и данной даты:

Признак 4

(74524113.213559602, ‘YHOO’) (6165711.6749675209, ‘GOOG’) (5539688.0538382991, ‘XOM’) (2537144.3952459987, ‘CVX’) (1283794.0604679288, ‘PG’) (1160743.3352889531, ‘BP’) (1040776.8531969623, ‘AVP’) (811575.28223116993, ‘BIIB’) (679243.76923785623, ‘DNA’) (377356.4897763988, ‘CL’) (353682.37800343882, ‘EXPE’) (0.31345784102699459,’AMGN’)

[(7.950090052903934, ’19-Jul-06′), (4.7278341805021329, ’19-Sep-06′), (4.6049947721971245, ’18-Jan-06′)]

Как видно, этот признак относится почти исключительно к YHOO и наиболее отчетливо проявился 19 июля 2006 года. Именно в тот день наблюдался большой всплеск объема торгов акциями компании Yahoo!, которая опубликовала отчет о прибылях.

Вот еще один признак, распределенный более равномерно между двумя компаниями:

Признак 2

(46151801.813632453, ‘GOOG’) (24298994.720555616, ‘YHOO’) (10606419.91092159, ‘PG’) (7711296.6887903402, ‘CVX’) (4711899.0067871698, ‘BIIB’) (4423180.7694432881, ‘XOM’) (3430492.5096612777, ‘DNA’) (2882726.8877627672, ‘EXPE’)

(2232928.7181202639,     ‘CL’)

(2043732.4392455407,     ‘AVP’)

(1934010.2697886101,     ‘BP’)

(1801256.8664912341,     ‘AMGN’)

[(2.9757765047938824, ’20-Jan-06′), (2.8627791325829448, ’28-Feb-06′), (2.356157903021133, ’31-Mar-06′),

Он показывает сильные всплески в объеме торгов акциями Google, которые в первых трех случаях были обусловлены публикацией новостей. В самый насыщенный день, 20 января, Google объявила, что она не собирается раскрывать правительству информацию о своей поисковой машине. Но интересно, что признак, обусловленный событием, которое повлияло на объем торгов акциями Google, сказался и на объеме торгов акциями Yahoo!, хотя к этой компании событие не имеет никакого отношения. Второй всплеск пришелся на день, когда финансовый директор Google объявил о замедлении темпов роста; на графике видно, что объем торгов по Yahoo! в тот день также возрос, возможно, потому, что люди прикинули, как эта информация может сказаться на положении Yahoo!.

Важно понимать разницу между представленной здесь картиной и простым отысканием корреляции между объемами торгов. Два выделенных признака показывают, что в некоторые дни торги акциями компаний Google и Yahoo! протекают схоже, а в другие ведут себя совершенно по-разному. При поиске корреляции эти наблюдения были бы усреднены и тот факт, что в определенные дни на объем торгов повлияли заявления Yahoo!, остался бы незамеченным.

Этот пример с небольшой выборкой акций иллюстрирует простой факт, но если взять более представительную выборку и задать большее количество искомых признаков, то удается выявить более сложные взаимодействия.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100